暗号理論入門 3.14〜3.15
- 作者: 林芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2012/04/20
- メディア: 単行本
- この商品を含むブログを見る
3.14 元の位数の計算
の任意の素因数 に対して、 は である最大の整数とする。このとき
である。
例. はmodulo 101の既約剰余群とする。その位数は であり、 となる。
を計算する。 が成立する。 したがって である。
が成立し、 となる。
よって100は の位数である。
とし、 と とが の任意の素因数 に対して成立するとき、 は の位数である。
3.15 中国人の剰余定理
を互いに素な自然数とし、 は整数とする。次の連立合同式
を解く。
とおくと、
が成立する。
を計算するため、拡張ユークリッドアルゴリズムを使う。
とおくと、
となる。
例.連立合同式
を解く。
である。
このとき、 である。
、すなわち を解くと、絶対値最小の解は である。
、すなわち を解くと、絶対値最小の解は である。
、すなわち を解くと、絶対値最小の解は である。
よって となる。
pythonで実装してみる。
def xeuclid(a, b): """ return gcd(a,b), x and y in 'gcd(a,b) = ax + by'. """ x = [1, 0] y = [0, 1] sign = 1 while b: q, r = divmod(a, b) a, b = b, r x[1], x[0] = q*x[1] + x[0], x[1] y[1], y[0] = q*y[1] + y[0], y[1] sign = -sign x = sign * x[0] y = -sign * y[0] return a, x, y def chinese_remainder(a, m): """ return x in ' x = a mod m'. """ modulus = reduce(lambda a,b: a*b, m) multipliers = [] for m_i in m: M = modulus / m_i gcd, inverse, y = xeuclid(M, m_i) multipliers.append(inverse * M % modulus) result = 0 for multi, a_i in zip(multipliers, a): result = (result + multi * a_i) % modulus return result
例の連立合同式を解いてみる。
>>> a = [2, 1, 0] >>> m = [4, 3, 5] >>> chinese_remainder(a, m) 10
連立合同式をこの方法で解くには、時間 と 格納領域 が必要となる。