数论相关

数论相关


相关概念

记有群\((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\)中包含一个原根, 那么该群称为循环群;

基础定理

  1. \(\pi(x)\)为不大于\(x\)的素数个数, 那么有\(\lim_{x\rightarrow \infty}\frac{\pi(x)}{x/\log(x)} = 1\);
  2. 相邻两个素数的差是2的素数对可能有无限多个;
  3. \(a\in\{2k+1, K\in N^+\} \Rightarrow 8|(a^2-1)\)
  4. \(a,b\in N^{+}\Rightarrow ab=gcd(a,b)\cdot lcm(a,b)\);
  5. \(a,b,c\in N^+, gcd(a,b)=1, gcd(a,c)>1 \Rightarrow gcd(c,b)=1\);
  6. \(a, b, c\in N^+, gcd(a,b)=1 \Rightarrow gcd(a,bc)=gcd(a,c)\);
  7. \(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\);
  8. \(a, b, n\in N^+ \Rightarrow gcd(a^n,b^n)=gcd(a,b)^n\);
  9. \(a, b, n\in N^+ \Rightarrow gcd(na,nb)=n\cdot gcd(a,b)\);
  10. \(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\);
  11. \(a,b\in Z, n\in N^+, a\equiv b\mod n \Rightarrow n|(a-b)\)
  12. \(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\);
  13. \(a,b\in Z, m,n\in N^+ a\equiv b\mod n \Rightarrow a^m=b^m \mod n\);
  14. \(a,b,x\in Z, n\in N^+, ax\equiv b\mod n \Rightarrow ax-b\equiv 0\mod n\);
  15. \(ad\equiv bd\mod nd \Rightarrow a\equiv b\mod n\);
  16. \(a\cdot b \mod n \equiv ((a\mod n) \cdot (b\mod n)) \mod n\);
  17. \(ad\equiv bd\mod n, gcd(d,n)=1 \Rightarrow a\equiv b\mod n\);
  18. \(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\);
  19. \(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\);
  20. \(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\);
  21. \(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\}\);
  22. \(\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}\);
  23. 记有欧拉函数\(\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\}\);
  24. \(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;
posted @ 2020-05-27 00:00  mengsuenyan  阅读(276)  评论(0编辑  收藏  举报