数论相关
数论相关
相关概念
记有群\((S, \oplus)\), 为了方便简记为\(S\);
- 群的定义见椭圆曲线加密数学基础;
- 群的阶\(\#S\): 群中元素的个数;
- \(a\in S\), 记\(a\)生成的子群为\(\langle a \rangle\), 生成过程为: \(\{a^{(k)}=\oplus_{i=1}^{k}a, a^{(k)}\in S, k=1\cdots \}\);
- \(a\in S\), 记\(a\)的阶\(ord_{n}(a)\)定义为满足\(a^n=e\)的最小正整数\(n\), 其中\(e\)表示该群的单位元素;
- 群的原根(生成元): 若\(\langle a \rangle = S, a\in S\), 那么\(a\)称为\(a\)的原根; 对于自然数的模\(n\)加法群\(Z_n^+\), 若\(n\)是质数, 那么该群中的每个元素都是该群的生成根; 乘法群\(Z_n^*\)则不一定;
- 循环群: 若\(S\)中包含一个原根, 那么该群称为循环群;
基础定理
- 记\(\pi(x)\)为不大于\(x\)的素数个数, 那么有\(\lim_{x\rightarrow \infty}\frac{\pi(x)}{x/\log(x)} = 1\);
- 相邻两个素数的差是2的素数对可能有无限多个;
- \(a\in\{2k+1, K\in N^+\} \Rightarrow 8|(a^2-1)\)
- 记\(a,b\in N^{+}\Rightarrow ab=gcd(a,b)\cdot lcm(a,b)\);
- \(a,b,c\in N^+, gcd(a,b)=1, gcd(a,c)>1 \Rightarrow gcd(c,b)=1\);
- \(a, b, c\in N^+, gcd(a,b)=1 \Rightarrow gcd(a,bc)=gcd(a,c)\);
- \(a, b_1, b_2, \cdots, b_n\in N^+, gcd(a,b_1)=gcd(a,b_2)=\cdots=gcd(a,b_n)=1 \Rightarrow gcd(a, b_1 b_2\cdots b_n)=1\);
- \(a, b, n\in N^+ \Rightarrow gcd(a^n,b^n)=gcd(a,b)^n\);
- \(a, b, n\in N^+ \Rightarrow gcd(na,nb)=n\cdot gcd(a,b)\);
- \(a,b,c,d\in Z, n\in N^+, a\equiv b\mod n, c\equiv d\mod n\Rightarrow a\pm c\equiv b\pm d \mod n\);
- \(a,b\in Z, n\in N^+, a\equiv b\mod n \Rightarrow n|(a-b)\)
- \(a,b,c,d\in Z, n\in N^+, a\equiv b\mod n, c\equiv d\mod n\Rightarrow ac\equiv bd \mod n\);
- \(a,b\in Z, m,n\in N^+ a\equiv b\mod n \Rightarrow a^m=b^m \mod n\);
- \(a,b,x\in Z, n\in N^+, ax\equiv b\mod n \Rightarrow ax-b\equiv 0\mod n\);
- \(ad\equiv bd\mod nd \Rightarrow a\equiv b\mod n\);
- \(a\cdot b \mod n \equiv ((a\mod n) \cdot (b\mod n)) \mod n\);
- \(ad\equiv bd\mod n, gcd(d,n)=1 \Rightarrow a\equiv b\mod n\);
- \(a,b\in Z, c,n\in N^+, ac\equiv b\mod n \Rightarrow \forall x=c\mod m, \exists\ ax-b\equiv 0\mod n\);
- \(a,b\in Z, n\in N^+, \not\exists\ k\in Z\to k\cdot gcd(a,n) = b \Rightarrow ax+b\equiv 0\mod n, x\in \varnothing\);
- \(a,b\in Z, n\in N^+, \exists\ k\in Z\to k\cdot gcd(a,n) = b \Rightarrow ax+b\equiv 0\mod n, x\not\in \varnothing\);
- \(a,b\in Z, n\in N^+, gcd(a,n)=d=ax'+ny', k=b/d, k\in Z, ax\equiv b\mod n \Rightarrow x_i = (x'(b/d)\mod n) + i(n/d), i\in\{0,1,2,\cdots,d-1\}\);
- \(\begin{aligned}& \exists\{p_1,p_2,\cdots, p_k\}, \forall i,j,i\ne j\to gcd(p_i,p_j)=1, \\& x\equiv b_1\mod m_1, x\equiv b_2\mod m_2,\cdots,x\equiv b_k\mod m_k \Rightarrow\\& x\equiv b_1 M_1^{'}M_1 + b_2 M_2^{'} M_2 +\cdots b_k M_k^{'} M_k\mod M\\& M=m_1 m_2\cdots m_k=m_1 M_1=m_2 M_2\cdots = m_k M_k\\& M_i^{'}M_i\equiv 1\mod m_i, i\in \{0,1,2,\cdots,k\}\end{aligned}\);
- 记有欧拉函数\(\psi(m)\)(不大于\(m\)和\(m\)互素的正整数个数), 则有\(\psi(p^n)=p^{n-1}(p-1), n\in N^+, \{gcd(m,p)=1, \forall m\in N^+, m<p\}\);
- \(a^{\psi(m)}\equiv 1\mod m, m\in N^+, m>1, gcd(a,m)=1\);
基础算法
注: 以下仅是伪代码, 实际代码见big
- 幂模运算, 原理由基础定理16推得:
/// x^y % n
fn exp_mod(x:Nat, y:Nat, n: Nat) -> Nat {
let (s,t,u) = (1,x,y);
while u > 0 {
if (u & 1) s = (s*t) % n;
u >>= 1;
t = (t*t) % n;
}
return s
}
- 最大公因子\(gcd(a,b)=d\), 原理: \(a\equiv qb+r\mod n, d|a, d|b\to d|r\Rightarrow d=gcd(b,r)\)
fn gcd(a:Nat, a:Nat) -> Nat {
if b == 0 {
b
} else {
gcd(b, a % b)
}
}
- 一次同余式求解\(ax\equiv b\mod n\), 原理由基础定理21推得:
fn gcd_ext(a: BigInt, b: BigInt) -> (BigInt, BigInt, BigInt) {
if b == 0 {
(a,1,0)
} else {
let (dt,xt,yt) = gcd_ext(b, a % b);
(dt, yt, xt - (a/b) * yt)
}
}
fn mod_inverse(a: BigInt, b: BigInt, n: BitInt) -> BigInt {
let (d,x,y) = gcd_ext(a,b);
(x * (b/d)) % n
}
质数测试
Miller-Rabin随机质数测试算法
原理
- 记有模\(n\)乘法群\(Z_n^*\);
- 费马定理: 如果\(p\)是质数, 则对于\(a\in Z_p^*\)有\(a^{p-1}\equiv 1 (\mod p)\)成立;
- 推论: 若\(p\)是质数, 则对于任意整数\(x\in [0,p)\), 有\(x^2 \equiv 1(\mod p)\)的解为\(x=1\)或\(x=p-1\);
- \(a*b \mod n = ((a\mod n)*(b \mod n)) \mod n\);
步骤
记有一个待测试奇自然数a
, 及测试总轮数s
. Miller-Rabin算法有如下定理:
- 如果n是一个奇合数, 那么测试n为合数的证据的数据至少为\((n-1)/2\);
- 对于任意\(a \gt 2\)的奇数和正整数
s
, Miller-Rabin出错的概率至多为\(2^{-s}\);
\[\begin{aligned}
& //\ 测试一个数是否是合数 \\
& WITNESS(a, n) \\
& \quad n-1 = 2^{t}*u,\ a \% 2=1\\
& \quad x_0 = a^{u} \% n \\
& \quad for\ i\ in\ 1..=t \\
& \quad \quad x_i = x_{i-1}^{2} \% n \\
& \quad \quad if\ x_i = 1\ \And\And\ x_{i-1} \ne 1\ \And\And\ x_{i-1}\ne n-1\\
& \quad \quad \quad return\ true\\
& \quad \quad end \\
& \quad end\\
& \quad \\
& \quad if\ x_t \ne 1\\
& \quad \quad return\ true\\
& \quad end\\
& \quad return\ false\\
& end
& \quad \\
& \quad \\
& // 测试奇自然数n是质数还是合数 \\
& MILLER-RABIN(n,s)\\
& \quad for\ j\ in\ 0..s\\
& \quad \quad a=RANDOM(1,n)\\
& \quad \quad if\ WITNESS(a,n) \\
& \quad \quad \quad return\ COMPOSITE \\
& \quad \quad end\\
& \quad return\ PRIME\\
& end \\
\end{aligned}
\]
参考资料
- 算法导论;
- 初等数论, 陈景润;
- Applied Cryptography 2ed, Bruce Schneier;