中国剩余定理及python实现

中国剩余定理及python实现

    • F o r m u l a Formula Formula
    • P y t h o n   a p p l i c a t i o n Python~application Python application
    • E x t e n s i o n Extension Extension
    • R e f e r e n c e Reference Reference

k e y w o r d s : keywords: keywords: CRT

F o r m u l a Formula Formula

设正整数 m 1 , m 2 , ⋯   , m k m_1,m_2,\cdots,m_k m1,m2,,mk两两互素,则
{ x ≡ a 1 ( m o d m 1 ) x ≡ a 2 ( m o d m 2 ) x ≡ a 3 ( m o d m 3 ) ⋮ x ≡ a k ( m o d m k ) ⇒ x ≡ a 1 ⋅ M 1 ⋅ M 1 − 1 + a 2 ⋅ M 2 ⋅ M 2 − 1 + ⋯ + a k ⋅ M k ⋅ M k − 1 ( m o d M ) \begin{cases} x\equiv a_1 \pmod {m_1}\\ x\equiv a_2 \pmod {m_2}\\ x\equiv a_3 \pmod {m_3}\\ \vdots\\ x\equiv a_k \pmod{m_k} \end{cases} \Rightarrow x\equiv a_1\cdot M_1\cdot M_1^{-1}+a_2\cdot M_2\cdot M_2^{-1}+\cdots+a_k\cdot M_k\cdot M_k^{-1} \pmod {M} xa1(modm1)xa2(modm2)xa3(modm3)xak(modmk)xa1M1M11+a2M2M21++akMkMk1(modM)

其中 M = m 1 ⋅ m 2 ⋯ m k M=m_1\cdot m_2\cdots m_k M=m1m2mk M i = M m i M_i = \frac{M}{m_i} Mi=miM M i − 1 M_i^{-1} Mi1满足 M i − 1 ⋅ M i ≡ 1 ( m o d m i ) M_i^{-1} \cdot Mi\equiv 1\pmod {m_i} Mi1Mi1(modmi)

此时 x x x是该同余式方程组在模 M M M下的解(是唯一的)

P y t h o n   a p p l i c a t i o n Python~application Python application

from functools import reduce
def CRT(moudle,a):
    M = reduce((lambda x,y : x * y),moudle)
    result = 0
    for mi in moudle:
        Mi = M // mi
        inv_Mi = gmpy2.invert(Mi,mi)
        result = (result + a[moudle.index(mi)] * Mi * inv_Mi) % M
    return result % M

传入的module是由各个同余式的模数构成的列表

a是同余式右侧(实际上左右都一样)的已知数值

整个函数求得的结果即是上文公式提到的x=result,该x是涉及的所有同余式的根且唯一

E x t e n s i o n Extension Extension

实际上应用时,还可能遇到模数不互素的情况,也即是公式中的 m 1 , m 2 , m 3 ⋯ m_1,m_2,m_3\cdots m1,m2,m3两两不互素的这个条件不成立,此时也可以使用中国剩余定理(CRT)

(11条消息) 中国剩余定理模数不互素的情况_M3ng@L的博客-CSDN博客

R e f e r e n c e Reference Reference

中国剩余定理学习笔记 - MashiroSky - 博客园 (cnblogs.com)

你可能感兴趣的:(密码学知识总结,CRT,数论,Crypto)