Transcript ppt - TNT

1.3.3 The Chinese Remainder Theorem
1
• 今回の内容
– 合同式の性質
– Chinese Remainder Theorem(CRT)
– CRTに付随する命題
– CRTを用いた計算のアルゴリズム
• 本題に入る前に合同式の性質について
触れておく.
2
• 合同式についての性質をいくつか挙げておく.
a, b, c, d , m , n 

(1) a  a  mod m 
(2) b  a (mod m )  a  b (mod m )
(3) a  b (mod m ), b  c (mod m )  a  c (mod m )
(4) a  b (mod m ), c  d (mod m )
 a  c  b  d (mod m ), ac  bd (mod m )
(5) a  b (mod m )
 all for divisor
d m,
a  b (mod d )
(6) a  b (mod m ), a  b (mod n ), gcd( m , n )  1
 a  b (mod mn )
3
Theorem1.3.9
(Chinese Remainder Theorem).
m1 ,  , m k , x1 ,  , x k  
assume : every pair ( i , j ),
x i  x j (mod gcd( m i , m j ))

x  Ζ s.t. x  x i (mod m i )
(x
は
lcm ( m 1 ,  , m k ) を法として合同
for 1  i  k
)
4
proof
claim1
gcd( m , n )  d , lcm ( m , n )  l とすると
x  a (mod m ), x  b (mod n )
が解を持つための必要
,
(1)
十分条件は ,
a  b (mod d )
である , 解は , l を法としてただ一つで
ある .
proof of claim1
( )
(1)が解 x を持つとき
, d  gcd( m , n ) より ,
x  a (mod d ), x  b (mod d ).
よって
a  b (mod d ) となる
.
5
proof
つづき
proof of claim1
( )
a  b (mod d ) が成り立っているとき
(1)が解を持つことを示す
xは

t  Z によって
x  a  mt
(2)
,
.
,
と書ける
この x が二番目の合同式の解
.
になるのは
,
a  mt  b (mod n ) すなわち ,
mt  b  a (mod n )
( 3 ) の時である
.
6
proof
つづき
proof of claim1
a  b (mod d )より ,
m
t 
ba
d
n
(mod
d
と , 表せる .
)
d


よって
( 3 )の解 t は , t 0 , s  Z によって
t  t0 
n
s と表すことができる
,
.
d
これを ( 2 )に代入すると
x  a  mt 0  ls
,
( dl  mn )
この x は (1)の解である
.
また , x と l を法として合同な整数
全て (1)の解である
は,
. 従って ,
x  a  mt 0 (mod l )
を満たす整数
x は全て (1)の解である
. ■
7
proof
claim1 より、 2 つの合同式
x  a 1 (mod m 1 ), x  a 2 (mod m 2 )
x  b (mod
lcm ( m 1 , m 2 ))
の形で表すことが出来
これと
る.
x  a 3 (mod m 3 )が ,
lcm ( m 1 , m 2 , m 3 )を法として
ただ一つの解を持つこ
仮定より
の解を ,
,
とを示す
.
, b  a 1 (mod m 1 )
故に , b  a 3  a 1  a 3 (mod m 1 )
従って , b  a 3  a 1  a 3  0 (mod
gcd( m 1 , m 3 ))
即ち , ( b  a 3 ) gcd( m 1 , m 3 ) (同様にして
, gcd( m 2 , m 3 ))
従って , lcm (gcd( m 1 , m 3 ), gcd( m 2 , m 3 )) で割り切れる
.
8
proof
claim2
a, b, c  Z
gcd( lcm ( a , b ), c )  lcm (gcd( a , c ), gcd( b , c ))
proof
略. ■
上記の claim2 より ,
gcd( lcm ( m 1 , m 2 ), m 3 )  lcm (gcd( m 1 , m 3 ), gcd( m 2 , m 3 ))
即ち , b  a 3 gcd( lcm ( m 1 , m 2 ), m 3 ) である .
従って , claim1 より , lcm ( m 1 , m 2 , m 3 )を法として
唯一つの解を持つ
,
.
後は , r についての帰納法で示
す事が出来る
. ■
9
Corollary 1.3.10.
m1 ,  , m k  Z
i  j)
( for


xi  Z , x  Z
( for
s.t. gcd( m i , m j )  1
x  x i (mod m i )
s.t.
1 i  k)
k
(x
は
m
i
を法として合同
)
i 1
10
proof
k
M 
m
i

, M i  M / m i とおく .
a i M i  bm i  1 ( b  Z )
i 1
(gcd( M i , m i )  1 となる
このとき
,

.)
a i s.t. a i M i  1(mod m i )
(by extended
gcd)
k
さらに
aM
, x
i
i
xi (1)
と定めると
, これが解になる
.
i 1
実際に , (1)の右辺第一項に注目す
a 1 M 1 x1  x1 (mod m 1 )
第二項以下は
x  x1 (mod m 1 )
ると ,
x  x 2 (mod m 2 )
であり ,
, M 2 , M 3,  M
k
が m 1 で割り切れるから
a 2 M 2 x 2    a k M k x k  0 (mod m 1 ) となる
以下 , m 2 ,  , m k について同様に考えれ
,

x  x k (mod m k )
.
ばよい .
となる
.
一意性は 
x , x ' を解とすると
であるから
よって
, x  x ' (mod m i ) ( i  1,  , k )
, ( x  x') mi
( i  1,  , k )
, M についても同様
. ( 合同式の性質
( 6 ))■
11
Algorithm 1.3.11(Chinese).その1
負担にならなければ
Input:
m i , x i  Z (1  i  k )
を昇順に並べ替える
Output:
x  Z ( x  x i (mod m i ) for all x i )
Step1:
j  2, C1  1
Step2:
p  m 1  m j 1 (mod m j )
compute
,
m i , ( xi )
.
( u , v , d ) s.t. up  vm j  d  gcd( p , m j ) ( by extgcd)
if d  1 then
output an error mesage
(the m i are not pairwise
coprime)
else
C j  u, j  j  1
m1  m k
if j  k then
step 1 , 2を事前に計算するほう
go to step2
を固定する場合は
,
がよい .
12
Algorithm 1.3.11(Chinese). その2
y 2  ( x 2  y 1 ) C 2 (mod m 2 )
Step3:
y 1  x1 (mod m 1 )
for
j  2, , k
y 3  ( x 3  ( y 1  m 1 y 2 )) C 3 (mod m 3 )
y 4  ( x 4  ( y 1  m 1 ( y 2  m 3 y 3 ))) C 4 (mod m 4 )

y j  ( x j  ( y 1  m 1 ( y 2  m 2 ( y 3    m j  2 y j 1 )  )) C j
(mod m j )
Step4:
x  y1  m 1 ( y 2  m 2 ( y 3    m k 1 y k )  ))
return
x
13
Algorithm1.3.12(Inductive Chinese).
Input:
m i , x i  Z (1  i  k )
Output:
x  Z ( x  x i (mod m i ) for all x i )
Step1:
Step2:
i  1, m  m 1 , x  x1
Step3:
if i  k then
return x
else
i  i 1
compute u , v
s .t . um  vm i  1( by extgcd)
x  umx i  vm i x
m  mm i
x  x (mod m )
go to step 2
14
Pythonでの実装(Algorithm1,3,12)
import nzmath.gcd
x1 ,  x k , m 1 ,  m k をリスト型で入力
def crt(xl,ml):
#step1
k = len(xl)
m = ml[0]
x = xl[0]
NZMATH の module を利用
#step2,step3
for i in range(1,k):
u,v,d = gcd.extgcd(m,ml[i])
If d > 1:
raise Error
x = u*m*xl[i] + v*l[i]*x
m = m*ml[i]
x = x%m
return x
15
example
x1  5 , x 2  3, x 3  13 , m1= 7 , m 2  11 , m 3  2 の場合
i 1
i2
u , v   3, 2
u , v  1,  38
( s .t . u * 7  v * 11  1)
( s .t . u * 77  v * 2  1)
x   3 * 7 * 3  2 * 11 * 5  47
x  1 * 77 * 13  (  38 ) * 2 * 47   2571
m  7 * 11  77
m  77 * 2  154
x  47 (mod 77 )
x  47 (mod 154 )
47 (mod 154 )
16
課題
• Algorithm1.3.11の実装
• Exercise8,9の取り組み
17