复健4--数论

神仙给的大纲
快速幂这里就不多解释,即用分治思想使乘法运行次数达到指数的log级别,相信大家懂的都懂,(老懂哥了

ll ksm(ll x,ll y){
	ll ans=1;
	while(y){
		if(y&1)ans=ans*x%p;
		x=x*x%p;
		y>>=1;
	}
	return ans;
}

欧几里得定理,又称辗转相除法

int gcd(int a,int b){
	if(b==0)return a;
	else return gcd(b,a%b);
} 

拓展欧几里得定理:扩展欧几里得是用来求 ax + by = gcd(a,b)中的未知数的
方程 ax + by = m 有解的必要条件是 m mod gcd(a,b) = 0
这个简单证一下:
由最大公因数的定义,可知 a 是 gcd(a,b)) 的倍数,且 b 是 gcd(a,b) 的倍数,
若 x,y 都是整数,就确定了 ax + by 是 gcd(a,b) 的倍数,
因为 m = ax + by,所以 m 必须是 gcd(a,b) 的倍数,
那么 m mod gcd(a,b) = 0。

void exgcd(int a,int b){
	if(!b){
		x=1;y=0;
		return ;
	}
	exgcd(b,a%b);
	int t=x;x=y;y=t-a/b*y;
	return ;
} 

费马小定理
定理内容:如果 a,p 互质,那么 a^ (p-1) ≡ 1 (mod p)
结合逆元方程 ax ≡ 1 (mod p),得到 ax ≡ a^(p-1)(mod p)
根据同余的性质,若 p 为质数,得到 x = a^(p-2)
只适用于模数为质数的情况
如果要解模的逆元的数 , 数量很多,但是连续 , 那该怎么办 ?
就可以使用递推法 。
i 模 p 意义下的逆元 inv(i) 可表示为 :
inv(i) = -[p/i](向下取整)*inv[p%i]%p

证明:
设 p=k * i + r , (k,r∈Z)
因为 : p ≡ 0 (mod p) ,
则 : (k * i + r) ≡ 0 (mod p)
使方程两边同乘 : inv(i) * inv(r)
根据 逆元的性质 ,则:
(inv(i) * i) % p = 1,(inv(r) * r)%p=1 ;
原式变为 :
k * 1 * inv(r) + 1 * inv(i) ≡0 (mod p)
inv(i) ≡ −k * inv(r)
又因为 : p = k * i + r
原式变为 : inv(i)≡−⌊i/p⌋ * inv (p % i)(mod p)
即 : inv(i)=−⌊i/p⌋ * inv(p%i) % p
又因为 : (p % i) < i
则 : inv(p%i) 在求出 inv(i) 前便已求 , 可以进行递推
原式得证 。
显然 , 求得的 inv(i) 不一定为最小整数解
若要获得最小正整数解,需要再加这样一步操作:
使 −⌊i/p⌋ 先加上一个 p , 再将其模掉 。
即 : inv(i) = (p - \lfloor \frac{p}{i}\rfloor)\times inv(p % i) % p;inv(i)=(p−⌊
i
p

⌋)×inv(p%i)%p;

posted @ 2020-11-12 21:51  maniac!  阅读(46)  评论(0)    收藏  举报