余数定理-简单证明
1. 加法定理
求和取余等于各自取余再求和
( x 1 + x 2 + x 3 + . . . + x n ) % d = [ ( x 1 % d ) + ( x 2 % d ) + ( x 3 % d ) + . . . + ( x n % d ) ] % d (x_1+x_2+x_3+...+x_n)\ \%\ d=[(x_1\ \%\ d)+(x_2\ \%\ d)+(x_3\ \%\ d)+...+(x_n\ \%\ d)]\ \%\ d (x1+x2+x3+...+xn) % d=[(x1 % d)+(x2 % d)+(x3 % d)+...+(xn % d)] % d
加法定理其实很直接,参考下面的图应该很好理解
其中 ( x 1 + x 2 + x 3 ) % d (x_1+x_2+x_3)\%d (x1+x2+x3)%d 中,绿色部分其实无论有多少块,在最后取余的时候都没有用了,只看黄色的余数部分。
2. 乘法定理
乘积取余等于各自取余再求积
( x 1 ∗ x 2 ∗ x 3 ∗ ⋯ ∗ x n ) % d = [ ( x 1 % d ) ∗ ( x 2 % d ) ∗ ( x 3 % d ) ∗ ⋯ ∗ ( x n % d ) ] % d ( x_1 * x_2 * x_3 * \cdots * x_n ) \ \%\ d=[(x_1 \ \%\ d) * (x_2 \ \%\ d) * (x_3 \ \%\ d) * \cdots * (x_n \ \%\ d)]\ \%\ d (x1∗x2∗x3∗⋯∗xn) % d=[(x1 % d)∗(x2 % d)∗(x3 % d)∗⋯∗(xn % d)] % d
假设
x 1 ÷ d = y 1 ⋯ ⋯ p 1 ⟺ x 1 = y 1 ∗ d + p 1 ⟹ x 1 % d = p 1 x_1 \div d = y_1 \cdots\cdots\ p_1 \iff x_1 = y_1 * d + p_1 \implies x_1\ \%\ d=p_1 x1÷d=y1⋯⋯ p1⟺x1=y1∗d+p1⟹x1 % d=p1
x 2 ÷ d = y 2 ⋯ ⋯ p 2 ⟺ x 2 = y 2 ∗ d + p 2 ⟹ x 2 % d = p 2 x_2 \div d = y_2 \cdots\cdots\ p_2 \iff x_2 = y_2 * d + p_2 \implies x_2\ \%\ d=p_2 x2÷d=y2⋯⋯ p2⟺x2=y2∗d+p2⟹x2 % d=p2
x 3 ÷ d = y 3 ⋯ ⋯ p 3 ⟺ x 3 = y 3 ∗ d + p 3 ⟹ x 3 % d = p 3 x_3 \div d = y_3 \cdots\cdots\ p_3 \iff x_3 = y_3 * d + p_3 \implies x_3\ \%\ d=p_3 x3÷d=y3⋯⋯ p3⟺x3=y3∗d+p3⟹x3 % d=p3
⋯ ⋯ \cdots\cdots ⋯⋯
x n ÷ d = y n ⋯ ⋯ p n ⟺ x n = y n ∗ d + p n ⟹ x n % d = p n x_n \div d = y_n \cdots\cdots\ p_n \iff x_n = y_n * d + p_n \implies x_n\ \%\ d=p_n xn÷d=yn⋯⋯ pn⟺xn=yn∗d+pn⟹xn % d=pn
则有以下
( x 1 ∗ x 2 ∗ x 3 ∗ ⋯ ∗ x n ) % d ( x_1 * x_2 * x_3 * \cdots * x_n ) \ \%\ d (x1∗x2∗x3∗⋯∗xn) % d
= [ ( y 1 ∗ d + p 1 ) ∗ ( y 2 ∗ d + p 2 ) ∗ ( y 3 ∗ d + p 3 ) ∗ ⋯ ∗ ( y n ∗ d + p n ) ] % d =[ (y_1 * d + p_1) * (y_2 * d + p_2) * (y_3 * d + p_3) * \cdots * (y_n * d + p_n) ] \ \%\ d =[(y1∗d+p1)∗(y2∗d+p2)∗(y3∗d+p3)∗⋯∗(yn∗d+pn)] % d
= ( p 1 ∗ p 2 ∗ p 3 ∗ ⋯ ∗ p n ) % d ⋯ ⋯ ( 1 ) =(p_1 * p_2 * p_3 * \cdots * p_n) \ \%\ d\ \cdots\cdots\ (1) =(p1∗p2∗p3∗⋯∗pn) % d ⋯⋯ (1)
= [ ( x 1 % d ) ∗ ( x 2 % d ) ∗ ( x 3 % d ) ∗ ⋯ ∗ ( x n % d ) ] % d =[(x_1 \ \%\ d) * (x_2 \ \%\ d) * (x_3 \ \%\ d) * \cdots * (x_n \ \%\ d)]\ \%\ d =[(x1 % d)∗(x2 % d)∗(x3 % d)∗⋯∗(xn % d)] % d
其中 (1) 处应该有 2 n 2^n 2n 项加数,根据 加法 定理,可以让这 2 n 2^n 2n 分别对 d d d 取余然后再求和,但是在所有 2 n 2^n 2n 项中,只有这一项 (i.e., p 1 ∗ p 2 ∗ p 3 ∗ ⋯ ∗ p n p_1 * p_2 * p_3 * \cdots * p_n p1∗p2∗p3∗⋯∗pn) 是不包含乘数 d d d 的,其它 2 n − 1 2^n-1 2n−1 项都是含有乘数 d d d 的,这 2 n − 1 2^n-1 2n−1 项分别对 d d d 取余都是 0, 只剩下 p 1 ∗ p 2 ∗ p 3 ∗ ⋯ ∗ p n p_1 * p_2 * p_3 * \cdots * p_n p1∗p2∗p3∗⋯∗pn 求余。
扩展
假设有下标集合 S = { s 1 , s 2 , s 3 , ⋯ s t } S=\{s_1, s_2, s_3,\cdots s_t\} S={s1,s2,s3,⋯st}
G = [ ( x 1 % d ) ∗ ( x 2 % d ) ∗ ⋯ ∗ ( x s 1 − 1 % d ) ∗ x s 1 ∗ ( x s 1 + 1 % d ) ∗ ⋯ ∗ x s 2 ∗ ⋯ ∗ x s 3 ∗ ⋯ ∗ x s t ∗ ⋯ ∗ ( x n % d ) ] % d G=[(x_1 \ \%\ d) * (x_2 \ \%\ d) *\cdots*(x_{s_1-1}\ \%\ d)* x_{s_1}*(x_{s_1+1}\ \%\ d) *\cdots*x_{s_2}*\cdots*x_{s_3}*\cdots*x_{s_t}* \cdots * (x_n \ \%\ d)]\ \%\ d G=[(x1 % d)∗(x2 % d)∗⋯∗(xs1−1 % d)∗xs1∗(xs1+1 % d)∗⋯∗xs2∗⋯∗xs3∗⋯∗xst∗⋯∗(xn % d)] % d
即下标刚好在 S S S 的项,不对 d d d 取余,
若有 H H H,所有的项都对 d d d 取余
H = [ ( x 1 % d ) ∗ ( x 2 % d ) ∗ ⋯ ∗ ( x s 1 − 1 % d ) ∗ ( x s 1 % d ) ∗ ( x s 1 + 1 % d ) ∗ ⋯ ∗ ( x s 2 % d ) ∗ ⋯ ∗ ( x s 3 % d ) ∗ ⋯ ∗ ( x s t % d ) ∗ ⋯ ∗ ( x n % d ) ] % d H=[(x_1 \ \%\ d) * (x_2 \ \%\ d) *\cdots*(x_{s_1-1}\ \%\ d)* (x_{s_1}\ \%\ d)*(x_{s_1+1}\ \%\ d) *\cdots*(x_{s_2}\ \%\ d)*\cdots*(x_{s_3}\ \%\ d)*\cdots*(x_{s_t}\ \%\ d)* \cdots * (x_n \ \%\ d)]\ \%\ d H=[(x1 % d)∗(x2 % d)∗⋯∗(xs1−1 % d)∗(xs1 % d)∗(xs1+1 % d)∗⋯∗(xs2 % d)∗⋯∗(xs3 % d)∗⋯∗(xst % d)∗⋯∗(xn % d)] % d
则有 G = H G=H G=H
G = [ ( x 1 % d ) ∗ ( x 2 % d ) ∗ ⋯ ∗ ( x s 1 − 1 % d ) ∗ x s 1 ∗ ( x s 1 + 1 % d ) ∗ ⋯ ∗ x s 2 ∗ ⋯ ∗ x s 3 ∗ ⋯ ∗ x s t ∗ ⋯ ∗ ( x n % d ) ] % d G=[(x_1 \ \%\ d) * (x_2 \ \%\ d) *\cdots*(x_{s_1-1}\ \%\ d)* x_{s_1}*(x_{s_1+1}\ \%\ d) *\cdots*x_{s_2}*\cdots*x_{s_3}*\cdots*x_{s_t}* \cdots * (x_n \ \%\ d)]\ \%\ d G=[(x1 % d)∗(x2 % d)∗⋯∗(xs1−1 % d)∗xs1∗(xs1+1 % d)∗⋯∗xs2∗⋯∗xs3∗⋯∗xst∗⋯∗(xn % d)] % d
根据 乘法 定理,我们可以把 G G G 中的每一项都添加一个 % d \%\ d % d
= [ ( x 1 % d % d ) ∗ ( x 2 % d % d ) ∗ ⋯ ∗ ( x s 1 − 1 % d % d ) ∗ ( x s 1 % d ) ∗ ( x s 1 + 1 % d % d ) ∗ ⋯ ∗ ( x s 2 % d ) ∗ ⋯ ∗ ( x s 3 % d ) ∗ ⋯ ∗ ( x s t % d ) ∗ ⋯ ∗ ( x n % d % d ) ] % d =[(x_1 \ \%\ d\ \%\ d) * (x_2 \ \%\ d\ \%\ d) *\cdots*(x_{s_1-1}\ \%\ d\ \%\ d)* (x_{s_1}\ \%\ d)*(x_{s_1+1}\ \%\ d\ \%\ d) *\cdots*(x_{s_2}\ \%\ d)*\cdots*(x_{s_3}\ \%\ d)*\cdots*(x_{s_t}\ \%\ d)* \cdots * (x_n \ \%\ d\ \%\ d)]\ \%\ d =[(x1 % d % d)∗(x2 % d % d)∗⋯∗(xs1−1 % d % d)∗(xs1 % d)∗(xs1+1 % d % d)∗⋯∗(xs2 % d)∗⋯∗(xs3 % d)∗⋯∗(xst % d)∗⋯∗(xn % d % d)] % d
由于 x 1 % d % d = x 1 % d x_1\ \%\ d\ \%\ d=x_1\ \%\ d x1 % d % d=x1 % d
= [ ( x 1 % d ) ∗ ( x 2 % d ) ∗ ⋯ ∗ ( x s 1 − 1 % d ) ∗ ( x s 1 % d ) ∗ ( x s 1 + 1 % d ) ∗ ⋯ ∗ ( x s 2 % d ) ∗ ⋯ ∗ ( x s 3 % d ) ∗ ⋯ ∗ ( x s t % d ) ∗ ⋯ ∗ ( x n % d ) ] % d =[(x_1 \ \%\ d) * (x_2 \ \%\ d) *\cdots*(x_{s_1-1}\ \%\ d)* (x_{s_1}\ \%\ d)*(x_{s_1+1}\ \%\ d) *\cdots*(x_{s_2}\ \%\ d)*\cdots*(x_{s_3}\ \%\ d)*\cdots*(x_{s_t}\ \%\ d)* \cdots * (x_n \ \%\ d)]\ \%\ d =[(x1 % d)∗(x2 % d)∗⋯∗(xs1−1 % d)∗(xs1 % d)∗(xs1+1 % d)∗⋯∗(xs2 % d)∗⋯∗(xs3 % d)∗⋯∗(xst % d)∗⋯∗(xn % d)] % d
= H =H =H
= ( x 1 ∗ x 2 ∗ ⋯ ∗ x s 1 − 1 ∗ x s 1 ∗ x s 1 + 1 ∗ ⋯ ∗ x s 2 ∗ ⋯ ∗ x s 3 ∗ ⋯ ∗ x s t ∗ ⋯ ∗ ⋯ ∗ x n ) % d =( x_1 * x_2 *\cdots* x_{s_1-1}*x_{s_1}*x_{s_1+1}*\cdots*x_{s_2}*\cdots*x_{s_3}*\cdots*x_{s_t}*\cdots * \cdots * x_n ) \ \%\ d =(x1∗x2∗⋯∗xs1−1∗xs1∗xs1+1∗⋯∗xs2∗⋯∗xs3∗⋯∗xst∗⋯∗⋯∗xn) % d
也就是说,一串乘积的取余,既可以让所有项先取余再求积,也可以只让部分项先取余再求积
举个例子
( x 1 ∗ x 2 ∗ x 3 ∗ x 4 ∗ x 5 ∗ x 6 ) % d ( x_1 * x_2 * x_3 * x_4*x_5 * x_6 ) \ \%\ d (x1∗x2∗x3∗x4∗x5∗x6) % d
= [ ( x 1 % d ) ∗ x 2 ∗ x 3 ∗ x 4 ∗ x 5 ∗ x 6 ) ] % d =[ (x_1\ \%\ d) * x_2 * x_3 * x_4*x_5 * x_6 ) ]\ \%\ d =[(x1 % d)∗x2∗x3∗x4∗x5∗x6)] % d
= [ ( x 1 % d ) ∗ ( x 2 % d ) ∗ x 3 ∗ x 4 ∗ ( x 5 % d ) ∗ x 6 ) ] % d =[ (x_1\ \%\ d) * (x_2\ \%\ d) * x_3 * x_4* (x_5\ \%\ d) * x_6 ) ]\ \%\ d =[(x1 % d)∗(x2 % d)∗x3∗x4∗(x5 % d)∗x6)] % d
= [ x 1 ∗ x 2 ∗ ( x 3 % d ) ∗ ( x 4 % d ) ∗ x 5 ∗ ( x 6 % d ) ) ] % d =[ x_1 * x_2 * (x_3\ \%\ d) * (x_4\ \%\ d) *x_5 * (x_6\ \%\ d) ) ]\ \%\ d =[x1∗x2∗(x3 % d)∗(x4 % d)∗x5∗(x6 % d))] % d
= [ ( x 1 % d ) ∗ ( x 2 % d ) ∗ ( x 3 % d ) ∗ ( x 4 % d ) ∗ ( x 5 % d ) ∗ ( x 6 % d ) ) ] % d =[ (x_1\ \%\ d) * (x_2\ \%\ d) *(x_3\ \%\ d) *(x_4\ \%\ d)* (x_5\ \%\ d) * (x_6\ \%\ d) ) ]\ \%\ d =[(x1 % d)∗(x2 % d)∗(x3 % d)∗(x4 % d)∗(x5 % d)∗(x6 % d))] % d
记得最后还要再取一次余