【欧几里得算法】C++求解最大公因子:求解两个正整数的最大公因子

1. 算法描述:

欧几里得算法】求解两个正整数m,n的最大公因子

2. 算法求解步骤:

  • E1(求两个整数的余数):求两个正整数的余数,r = m % n
  • E2(判断余数是否为0):如果余数r为0,算法返回n;如果余数不为0,执行E3
  • E3(数值降低):令m = n,n = r,并进入E1

3. C++代码求解:

/*@author @还下着雨ZG
* @brief 求解两个正整数m,n的最大公因子
* @param[in] int m,第一个正整数
* @param[in] int n, 第二个正整数
* @return iRes,返回m和n的最大公因子
*/
int computeGstComDivisor(int m, int n)
{
	if(m <= 0 || n <=0)
	{
		return -1;
	}
	int ir = 0;
	while(1)
	{
		ir = m % n;
		if(ir == 0)
		{
			return n;
		}
		else
		{
			m = n;
			n = ir;
		}
	}
}

优化算法的运行效率:使得m > n

/*@author @还下着雨ZG
* @brief 求解两个正整数m,n的最大公因子
* @param[in] int m,第一个正整数
* @param[in] int n, 第二个正整数
* @return iRes,返回m和n的最大公因子
*/
int computeGstComDivisor(int m, int n)
{
	if(m <= 0 || n <=0)
	{
		return -1;
	}
	int ir = 0;
	if( m < n)
	{
		int iTmp = m;
		m = n;
		n = iTmp;
	}
	while(1)
	{
		ir = m % n;
		if(ir == 0)
		{
			return n;
		}
		else
		{
			m = n;
			n = ir;
		}
	}
}
C++中,这里分别介绍一些基本的代码片段,但请注意,加密、解密涉及到复杂的数学算法,尤其是涉及RSA(一种非对称加密算法)的私钥生成和数据加密解密。 1. **判断素数** (质数判定) ```cpp bool isPrime(int num) { if (num <= 1) return false; if (num <= 3) return true; if (num % 2 == 0 || num % 3 == 0) return false; for (int i = 5; i * i <= num; i += 6) { if (num % i == 0 || num % (i + 2) == 0) return false; } return true; } ``` 2. **求最大公约数** (Euclidean Algorithm) ```cpp int gcd(int a, int b) { while (b != 0) { int temp = a % b; a = b; b = temp; } return a; } ``` 3. **生成RSA私钥** (简化版,实际操作需要安全库) ```cpp #include <openssl/pem.h> #include <openssl/rand.h> // ... BIGNUM* generateKeys() { BIGNUM* p, *q, *n, *d, *e; // ... 随机生成两个大素数p和q... RSA* rsa = RSA_new(); RSA_generate_key_ex(rsa, key_size, &p, &q); d = BN_mod_inverse(NULL, p, q); // 计算私钥d e = RSA_get_e(rsa); // 公钥e直接获取 // ... 将密钥转换成PEM格式存储... return d; } ``` 4. **RSA加密过程** ```cpp string encrypt(const string& plaintext, const BIGNUM* pubKeyE, const BIGNUM* modulusN) { string ciphertext; unsigned char buffer[plaintext.size() * 2 + 1]; RSA_public_encrypt(plaintext.length(), reinterpret_cast<const unsigned char*>(plaintext.c_str()), buffer, pubKeyE, RSA_PKCS1_OAEP_PADDING); ciphertext = string(reinterpret_cast<char*>(buffer), buffer长度); return ciphertext; } ``` 5. **RSA解密过程** ```cpp string decrypt(const string& ciphertext, const BIGNUM* privKeyD, const BIGNUM* modulusN) { string decrypted; unsigned char buffer[ciphertext.size()]; RSA_private_decrypt(ciphertext.length(), reinterpret_cast<const unsigned char*>(ciphertext.c_str()), buffer, privKeyD, RSA_PKCS1_OAEP_PADDING); decrypted = string(reinterpret_cast<char*>(buffer)); return decrypted; } ``` 以上代码仅作教学用途,实际生产环境中会使用专业的加密库并采取更为严格的保密措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值