快速幂算法

前言:密码学中一些练习对于大素数取模不知道怎么手算,于是查了下发现存在快速幂进行模运算的算法,这边就来学习下顺便做个笔记

简化高次幂运算

一般对于高次幂可以通过下述操作来进行简化,可以看到就如下两种情况

  • 如果当前幂次为偶数的话,那么直接求底数的平方,然后幂次下降除以2

  • 如果当前幂次为奇数的话,那么直接求底数的平方

非递归快速幂

通过上述的两种情况下,这里编写一个对应的代码即可

typedef long long ll;
ll get_counting(ll a, ll n) {
	ll ans = 1;
	while (n) {
		if (n & 1)
			ans *= a;
		a *= a;
		n >>= 1;
	}
	return ans;
}

证明(a*b)mod n == ((a mod n)*(b mod n)) mod n

额外的知识点,这里顺便记录下

参考文章:https://www.zhihu.com/question/41361614

其中最后一步的理解,其中N不管是否是大于C的,其实都是可以被C mod掉,那么c*k就可以被消掉

非递归快速幂取模

在非递归快速幂的代码上配合上面的取模的性质修改

typedef long long ll;
ll get_fast_power_mod(ll a, ll n, ll c) {
	ll ans = 1;
	while (n) {
		if (n & 1)
			ans = (ans * a) % c;	
		a = (a * a) % c;
		n >>= 1;
	}
	return ans;
}

posted @ 2022-11-28 18:05  zpchcbd  阅读(132)  评论(0)    收藏  举报