ほぼ雑記的メモ
と書くと何やら難しそうですが、簡単にいうならば
となる数
(多くの)プログラム言語的に言い換えると
(n * x) % N = 1
となる数ということになるでしょう。ここで
細かいことをいうと
と思っておけば問題ないです。7を法とした世界では-1も6も同じものを指します。表現の仕方が違うだけです。
さてこのアプローチには大きく2種類あるようです。 一つはユークリッドの互除法を使うもの。もう一つはopensslの内部て使われているものです。後者のアルゴリズムに名前があるのかどうかはしりません。
最初にユークリッドの互除法を使う手法を紹介します。
ユークリッドの互除法とは数
を解くことができるのです。実際ここで
ですからyが求めるものであることがわかります。ちなみに上の式は
さてそのアルゴリズムですが、このアルゴリズムをを一般式で書くと煩雑になるので具体的に
ここで
このように書くと何やら複雑ですがプログラム的には
a[n+1] = b[n]
b[n+1] = a[n] % b[n]
ということです。このように
# a b d m 1 916132831 9973 91861 3078 2 9973 3078 3 739 3 3078 739 4 122 4 739 122 6 7 5 122 7 17 3 6 7 3 2 1 7 3 1 3 0 8 1 0
これから
# x y 7 0 1 6 1 -2 5 -2 35 4 35 -212 3 -212 883 2 883 -2861 1 -2861 262815204
となり、
実際
#!/usr/bin/env ruby
a = []
b = []
d = []
m = []
x = []
y = []
n = a[1] = 916132831
b[1] = 9973
i = 1
while b[i] != 0
d[i] = a[i] / b[i]
m[i] = a[i] % b[i]
a[i + 1] = b[i]
b[i + 1] = m[i]
i = i + 1
end
x[i] = 1
y[i] = 0
j = i
while j > 1
j = j - 1
x[j] = y[j + 1]
y[j] = x[j + 1] - d[j] * x[j]
end
puts("#{y[1]} * #{b[1]} = #{b[1] * y[1] % n} (mod #{n})")
ユークリッドの互除法はとても早く1まで係数が降下するので効率もよいのですが
Powered by Red Leaf ( Rev. 79d0bae58 ), © Issei Numata, 2007-2025