基础数论知识 为密码学构建奠定方法基础
(就是那些 本蒟蒻在高中就见过但是就是一直没能理解的东西)
一、 整除性 和 带余除法
记录 整除符号 x | y,表示y%x=0
顾名思义,就像小学一样,除法有 被除数a、除数b、商q、余数r
则 可写成下述形式: a=q*b + r
性质:给定任意数字对(a,b) 均有且仅有唯一的q,r使得上述等式成立。
二、 欧几里得算法gcd(a,b)
欧几里得算法,又名辗转相除法,即小学奥数学的那个。
1. 结论:
gcd(a,b)表示a和b的最大公因数
则gcd(a,b) = gcd(a, a%b)
2. 证明:
观察等式: a = q * b + r
设k为 a和b 的公因数
则 a可以被k整除 b可以被k整除 q*b可以被k整除
根据高斯同余,显然 余数r可以被k 整除
证毕。
3. 流程:
(这个是帮助理解扩展欧几里得)
a = q1 * b + r1
b= q2 * r1 + r2
r1= q3 * r2 + r3
…
r[n-2] = q[n]r[n-1] + r[n]
r[n-1] =q[n+1] r[n] + 0
则易知 gcd(a,b)= r[n]
4. 代码:
int gcd(int a,int b){
if(!b) return a;
if(a>b) swap(a,b);
return (a,a%b);
}
注:最大公倍数 [a,b] = a * b / gcd(a,b)
三、 扩展欧几里得算法ExGcd(x,y,a,b)
1. 结论:
对于方程
aX + bY = gcd(a,b)
一定存在整数解X,Y使等式成立
2. 证明/流程 :
回看 辗转相除法的流程
为了形式统一,将a记为 r[-1], b记为 r[0]
r[-1] = q1 * r[0] + r1
r[0]= q2 * r[1] + r2
r[1] = q3 * r[2] + r3
…
r[n-2] = q[n]r[n-1] + r[n]
r[n-1] =q[n+1] r[n] + 0
则易知 gcd(a,b)= r[n]
且 r[n] 可根据递推式由 a,b 得出
同时可将递推式转为递归式:
r [n] = r[n-2] - q[n]*r[n-1]
…
r[n] = r[-1]X + r[0]Y
即gcd(a,b)= aX + bY有整数解
证毕。
四、素数:
无穷性:无穷个素数
孪生素数:差值为2的两个素数称之为孪生素数
定理
对于整数n>1,若 an -1 为素数,则 a一定为2,且n一定为素数。
定理
如果2m +1 是素数,则m一定是2的方幂
费马素数
2^ ( 2n) 成为费马数字,如果它还是素数,则成为费马素数
费马数字与费马素数关系
费马数字是费马素数的概率极高,只有几个特殊值不是素数。
充要性质
如果a,b互素,则存在整数u,v使得ua+vb=1。
gcd(a,b)=1
素数p与任意整数a,关系仅仅可能是:互质or整除关系。
五、素性测试:
代码实现
目标:即判断一个数是否为素数
方法一:遍历除法 O(n)
跑一遍 2~n-1,找有没有数字n的因子
有则不是素数, 否则就是素数
方法二:埃拉托斯特尼筛 O( n(1/2) )
易证:如果数n在(2,n-1)内有因数a,则一定有因数 n/a, 则a和n/a 一定其中一个 <= n(1/2) 另一个 >=n(1/2)
因此:不需要跑O(n) 只需要跑一半即可
其他高级筛法(考研不涉及,略)
方法三:欧拉筛
方法四:威尔逊测试
方法五:费马查表法
方法六:Miller-Rabin素性测试