算法之快速幂运算的实现方法

快速幂运算(反复平方法)
先来看一道题目:题目链接
本题代码在最后哦~

快速幂运算的优势:
1.可用来算大数的幂的一种算法。
2.其时间复杂度为 O(log₂N), 如果我们使用循环来计算的话,那么时间复杂度就是 O(n) ,与朴素的O(N)相比效率有了极大的提高。

快速幂算法的核心思想:每一步都把指数分成两半,而相应的底数做平方运算。

如这张图片上所写的计算2的n次方所示,可以进行对底数做平方,幂做除2运算。

算法如何实现?
首先我们要知道对于幂是偶数时我们可以这样操作,如果幂是奇数呢?
如计算123的234次方如下图所示:
在这里插入图片描述
哦,原来我们遇到奇数幂时可以将底数提取出来一个,幂就会变为偶数。 然后就可以进行我们的快速幂操作。

下面来看代码实现:

1.用递归实现:

int QuickPower(int a, int n)
{
	int ans;
	if (n == 0)
	{
		ans = 1;//结束条件
	}
	else
	{
		ans = QuickPower(a*a, n / 2);//递归调用
		if (n % 2 == 1)//n为奇数
		{
			ans *= a;
		}
	}
	return ans;
}

2.循环实现

int QuickPower(int a, int n)
{
	int ans = 1;
	while (n)
	{
		if (n % 2)//奇数情况
		{
			ans = ans*a;
		}
		a = a*a;//底数平方
		n = n / 2;//指数减半
	}
	return ans;
}

我们回过头来看看这道人见人爱的A^B
AC代码如下:

#include <stdio.h>

int QuickPower(int a, int n)
{
	int ans = 1;
	while (n)
	{
		if (n % 2)//奇数情况
		{
			ans = ans*a;
		}
		a = a*a;//底数平方
		n = n / 2;//指数减半
	}
	return ans;
}
int main()
{
	int a, b;
	while (~scanf("%d %d", &a, &b))
	{
		int ret = QuickPower(a, b);
		printf("%d\n", ret%1000);//取三位哦~
	}
	return 0;
}
  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
下面是一个使用Python语言实现快速幂运算公钥密码算法的示例代码: ```python import random # 模幂运算函数 def mod_exp(base, exponent, modulus): result = 1 while exponent > 0: # 如果指数是奇数,则先乘上一个base if exponent % 2 == 1: result = (result * base) % modulus # 将指数除以2,同时将base平方 exponent = exponent // 2 base = (base * base) % modulus return result # 生成公钥和私钥函数 def generate_key_pair(p, q): n = p * q phi = (p - 1) * (q - 1) # 选择一个与phi互质的整数e e = random.randrange(1, phi) while gcd(e, phi) != 1: e = random.randrange(1, phi) # 计算e的逆元d d = mod_inverse(e, phi) # 返回公钥和私钥 return ((n, e), (n, d)) # 求最大公约数函数 def gcd(a, b): while b != 0: a, b = b, a % b return a # 求模反元素函数 def mod_inverse(a, m): if gcd(a, m) != 1: return None u1, u2, u3 = 1, 0, a v1, v2, v3 = 0, 1, m while v3 != 0: q = u3 // v3 v1, v2, v3, u1, u2, u3 = ( u1 - q * v1, u2 - q * v2, u3 - q * v3, v1, v2, v3, ) return u1 % m # 加密函数 def encrypt(plaintext, public_key): n, e = public_key # 将明文转换成整数 plaintext_int = int.from_bytes(plaintext.encode(), "big") # 对明文进行加密 ciphertext_int = mod_exp(plaintext_int, e, n) # 将密文转换成字节串 ciphertext = ciphertext_int.to_bytes((ciphertext_int.bit_length() + 7) // 8, "big") return ciphertext # 解密函数 def decrypt(ciphertext, private_key): n, d = private_key # 将密文转换成整数 ciphertext_int = int.from_bytes(ciphertext, "big") # 对密文进行解密 plaintext_int = mod_exp(ciphertext_int, d, n) # 将明文转换成字节串 plaintext = plaintext_int.to_bytes((plaintext_int.bit_length() + 7) // 8, "big").decode() return plaintext # 测试代码 p = 61 q = 53 public_key, private_key = generate_key_pair(p, q) plaintext = "Hello, world!" ciphertext = encrypt(plaintext, public_key) decrypted_plaintext = decrypt(ciphertext, private_key) print("公钥:", public_key) print("私钥:", private_key) print("明文:", plaintext) print("密文:", ciphertext) print("解密后的明文:", decrypted_plaintext) ``` 这个示例代码实现了一个基于RSA算法的公钥密码系统,可以对任意长度的明文进行加密和解密。生成公钥和私钥时,需要选择两个大质数p和q,并计算n=pq和phi=(p-1)(q-1),然后选择一个与phi互质的整数e作为公钥,计算e的逆元d作为私钥。加密时,将明文转换成整数,使用公钥进行加密,并将密文转换成字节串。解密时,将密文转换成整数,使用私钥进行解密,并将明文转换成字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值