t も1つ目の式を満たすが、もし m t = 1 − m t とできれば2つ目の式も満たす m ∤ (a − x) なら x が打ち消し合って m での剰余は a の みが残るのでok m ∣ (a − x) なら x が残るが x ≡ a mod. m なのでok m , m は互いに素だから m t + m t = 1 となる t , t は拡張 ユークリッドの互除法で求められる 1 2 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1 2 1 1 2 2 1 2
t + m t = 1 を満たすなら t ← t + km としても解になる(t のほうを調整すればいい) なので互除法で得られる解がめちゃでかくなりうる t ← t %m しとけば m 未満になる ついでに a − a も m で mod をとっておく 上の考察で割り切れるかどうかはどうでもいいことが分か ったので mod をとっていい ret % m は ret が負のときいやな感じになる -17 % 5 = -2 になる ruby などは -17 % 5 = 3 になる 1 2 1 1 2 2 1 1 2 2 1 1 2 2 2 1 2
t = g − m t where g := gcd(m , m ) とできる さらに g ∣ (a − a ) が成り立っているから、結局、微妙に変更して a + m t とすれば解になる mod. m が a になるのは良い 式変形すると a + (a − a ) − m t となるの で、互いに素のときと同じ考察で mod. m で a と分かる 1 2 1 1 1 1 1 2 2 1 2 2 1 1 g a − a 2 1 1 1 1 1 1 { 2 1 g a − a 2 1 2 2 } 2 2
10] ans, mod = 0, 1 # 任意の整数は mod. 1 で 0 a.zip(m).each do |aa, mm| ans, mod = crt(ans, aa, mod, mm) end puts ans # => 23 x x x ≡ 2 mod. 3 ≡ 3 mod. 5 ≡ 3 mod. 10