ほぼ雑記的メモ
一つ前のエントリ
の手法は途中の計算結果を保存しておかないといけないという問題がありました。そこでそれを改良したアルゴリズムを紹介します。このアルゴリズムもユークリッドの互除法を使うという点では同じです。違うのは
ではなく
を考えている点がです。この式は
そこで
について左辺どうし、右辺どうしを掛け合わせると
となります。
が常に成立していることになります。符号はnの偶奇で決まります。なお
ところで、
となり
#!/usr/bin/env ruby
n = a = 916132831
b0 = b = 9973
x = 1
y = 0
sign = 1
while b != 1
d = a / b
m = a % b
a = b
b = m
tmp = d * x + y
y = x
x = tmp
sign = -sign
end
puts("#{sign * x} * #{b0} = #{b0 * x * sign % n} (mod #{n})")
さて、このアルゴリズムでも十分実用になるのですが、Nが奇数の場合はさらに効率よく求めることができます。 そのアルゴリズムを次のエントリで紹介しようと思います。
この補題より
Powered by Red Leaf ( Rev. 79d0bae58 ), © Issei Numata, 2007-2025