除法
- 记:a | b 表示 a 整除 b
- q=a div d; r=a mod d —– a=dq+r
101 = 11 * 9+2————— 9=101 div 11; 2=101 mod 11
模算术
- m整除 a-b 时 称 a 模 m 同余 b。
记: a ≡ b (mod m)——- 同余式
17是否模6同余5———17 ≡ 5(mod 6) : 6 整除 17-5a ≡ b (mod m) 当且仅当 a mod m=b mod m
模m算术
- a+mb=(a+b) mod m
- a⋅mb=(a⋅b) mod m
整数的表示和算法
整数的表示
n=akbk+ak−1bk−1+......+a1b+a0进制转换
241=2*120 +1
120=2*60 + 0
60 =2*30 + 0
30= 2*15 + 0
15= 2*7 + 0
7= 2*3 + 1
3= 2*1 + 1
1= 2*0 + 1
(241)10=(11100001)
算法 : 构造b进制展开式
procedure base b expansion
q:=n
k:=0
while q≠0
ak:=1 mod b
q:=q div b
k:=k+1
return(ak−1......a1a0)
整数加法运算
原理:
a=(an−1....a1a0)2和 b=(bn−1.....b1b0)a0+b0=c0∗2+s0 —— c0是进位
a1+b1+c0=c1∗2+s0
sn=cn−1 是首位例子 : a=(1110) 和 b=(1011)
a0+b0=0+1=0∗2+1 —– c0=0,s0=1
a1+b1+c0=1+1+0=1∗2+0 —— c1=1,s1=0
a2+b2+c1=1+0+1=1∗2+0 —– c2=1,s2=0
a3+b3+c2=1+1+1=1∗2+1 —– c3=1,s3=1
s4=c3=1
a+b=(11001)
算法 : procedure add
a和b分别是整数展开式:(an−1....a1a0)和(bn−1.....b1b0)
c:=0for j:=0 to n−1
{
d:=⌊(aj+bj+c)/2⌋
sj:=aj+bj+c−2d
c:=d
sn:=c
}
return ( snsn−1......s0 )复杂度=O(n)
整数乘法运算
原理:
ab=a(b020+b121+......+bn−12n−1)
=a(b020)+a(b121)+.....+a(bn−12n−1)例子:a=(110) 和 b=(101)
ab0∗20=(110)2∗1∗20=(110)2
ab1∗21=(110)2∗0∗21=(0000)2
ab2∗22=(110)2∗1∗22=(11000)2
相加 (110)+(0000)+(11000)=(11110)
- 算法
for j:= 0 to n-1
if b_j=1 then c_j := a 移位j位
else c_j:=0
p:=0
for j:=0 to n-1
p:=p+c_j
return p {p=ab}
- 复杂度: O(n2)
模指数运算
原理:
n=(ak−1.....a1a0) 计算 bn
bn=bak−12k−1+.....+a1∗2+a0=bak−12k−1.....ba1∗2ba0例子: 3644 mod 645
644=(1010000100)
x=1 and power=3 mod 645=3
i=0: 因为
a0=0
, 所以 x=1 和 power=
32
mod 645= 9 mod 645=9;
i=1: 因为
a1=0
, 所以 x=1 和 power=
92
mod 645= 81 mod 645=81;
i=2: 因为
a2=1
, 所以 x=1*81 mod 645=81 and power=
812
mod 645= 6561 mod 645 =111;
i=3: 因为
a3=0
, 所以 x=81 and power=
1112
mod 645=12321 mod 645=66;
i=4: 因为
a4=0
, 所以 x=81 and power=
662
mod 645=4356 mod 645=486;
i=5: 因为
a5=0
, 所以 x=81 and power=
4862
mod 645=236196 mod 645=126;
i=6: 因为
a6=0
, 所以 x=81 and power=
1262
mod 645=15876 mod 645=396;
i=7: 因为
a7=1
, 所以 x=(81*396) mod 645=471 和 power=
3962
mod 645=1568176 mod 645=81;
i=8: 因为
a8=0
, 所以 471 和 power=
812
mod 645=6561 mod 645=111;
i=9: 因为
a9=1
, 所以有x=(471*111) mod 645=36
- 算法:
x:=1
power := b mod m
for i := 0 to k-1
if $a_i$=1 then x:=(x*power) mod m
power :=(power*power) mod m
return x {x等于 bn mod m}
- 复杂度: O((logm)2logn)
素数
- 素数: 每个大于1的整数,只能被1或者本身整除,称为素数
*试除法
- n是一个合数,则n必有一个素因子小于或者等于 n−−√
- 若整数不能被小于或者等于其平方根的素数整除,则就是素数
101—– 101−−−√的素数是2,3,5,7 ;因为101不能被2,3,5,7整除,故101是素数
*埃拉托斯特尼筛选
*素数定理
- 当x无限增长的时候,不超过
x
的 素数个数与
x/lnx 之比趋于1
最大公约数
- 能整除两个整数的最大整数为这两个整数的最大公约数
- 记: gcd ( a, b )
- 两个数互素则最大公约数是1
*素因数分解法求最大公约数
- 正整数: a 和 b的素因子分解是
a=pa11pa22.....pann 和 b=pb11pb22.....pbnn
gcd(a,b)= pmin(a1,b1)1pmin(a2,b2)2......pmin(an,bn)n
*素因数分解法求最小公倍数
- lcm= pmax(a1,b1)1pmax(a2,b2)2......pmax(an,bn)n
*欧几里得算法
- 算法
a=bq+r , 其中 a, b, q 和 r 均为整数,则 gcd(a,b)=gcd(b,r)
- 例子
662 = 414*1+248
414 = 248*1+166
248 = 166*1+ 82
166= 82*2 +2
82=2*41
所以 gcd(414,662)=2
- 算法
x:=a
y:=b
while y 不等于 0
r:= x mod y
x:= y
y:= r
return x (gcd(a ,b)是x)
gcd的线性组合
- 贝祖定理: gcd(a,b)=sa+tb
- 例:gcd(6,14)=2 ,而 2=(-2)*6+ 1*14
求解同余方程
*线性同余方程
ax≡b(mod m)
如果 a 和 m 为互素的整数,且m>1,则 a模m的逆存在
- aa¯≡1(mod m) 成立的 a¯ 是逆
*中国剩余定理
- 令
m1,m2,....,mn
为大于1的两两互素的正整数,
a1,a2,....an
是任意数。则
x≡a1(mod m1)
x≡a2(mod m2)
……
x≡an(mod mn)
有唯一的模 m=m1m2.....mn 的解
*费马小定理
- 如果p是素数,a是一个不能被p整除的整数,则
ap−1≡1(mod p) ,且 对于每个 a有, ap≡a(mod p)
- 例子:计算 7222 mod 11
710≡
1(mod 11)
所以对于每个正整数k, 有
(710)k≡1(mod 11)
222=22*10+2
—> 7222=722∗10+2=(710)2272≡(1)22∗49≡5(mod 11)
同余应用
*散列函数
*伪随机数
线性同余法:模数 m, 倍数 a, 增量 c 和种子 x0 ;
2<=a<m
0<=c<m
0<=x0<m
生成伪随机序列
xn+1=(axn+c)modm例子: xn+1=(7xn+4)mod 9
x1=7x0+4 mod 9=7∗3+4 mod 9=25 mod 9=7
x2=7x1+4 mod 9=7∗7+4 mod 9=53 mod 9=8
……
- c=0 则为纯倍增生成器