算法_1: 数论

除法

  • 记: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-5

  • a b (mod m) 当且仅当 a mod m=b mod m

模m算术

  • a+mb=(a+b) mod m
  • amb=(ab) mod m

整数的表示和算法

  • 整数的表示
    n=akbk+ak1bk1+......+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  q0
ak:=1 mod b
q:=q div b
k:=k+1

return(ak1......a1a0)


整数加法运算

  • 原理:
    a=(an1....a1a0)2 b=(bn1.....b1b0)

    a0+b0=c02+s0 —— c0
    a1+b1+c0=c12+s0
    sn=cn1 是首位

  • 例子 : a=(1110) 和 b=(1011)

    a0+b0=0+1=02+1 —– c0=0,s0=1
    a1+b1+c0=1+1+0=12+0 —— c1=1,s1=0
    a2+b2+c1=1+0+1=12+0 —– c2=1,s2=0
    a3+b3+c2=1+1+1=12+1 —– c3=1,s3=1
    s4=c3=1

a+b=(11001)

  • 算法 : procedure add

    ab(an1....a1a0)(bn1.....b1b0)
    c:=0

    for j:=0 to n1
    {
    d:=(aj+bj+c)/2
    sj:=aj+bj+c2d
    c:=d
    sn:=c
    }
    return ( snsn1......s0 )

  • 复杂度=O(n)


整数乘法运算

  • 原理:
    ab=a(b020+b121+......+bn12n1)
    =a(b020)+a(b121)+.....+a(bn12n1)

  • 例子:a=(110) 和 b=(101)

ab020=(110)2120=(110)2
ab121=(110)2021=(0000)2
ab222=(110)2122=(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=(ak1.....a1a0) 计算 bn
    bn=bak12k1+.....+a12+a0=bak12k1.....ba12ba0

  • 例子: 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—– 1012,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



求解同余方程

*线性同余方程

  • axb(mod m)

  • 如果 a 和 m 为互素的整数,且m>1,则 a模m的逆存在

  • aa¯1(mod m) 成立的 a¯ 是逆

*中国剩余定理

  • m1,m2,....,mn 为大于1的两两互素的正整数, a1,a2,....an 是任意数。则
    xa1(mod m1)
    xa2(mod m2)
    ……
    xan(mod mn)

有唯一的模 m=m1m2.....mn 的解

*费马小定理

  • 如果p是素数,a是一个不能被p整除的整数,则

ap11(mod p) ,且 对于每个 a有, apa(mod p)

  • 例子:计算 7222 mod 11

710 1(mod 11)
所以对于每个正整数k, 有
(710)k1(mod 11)
222=22*10+2

—> 7222=72210+2=(710)2272(1)22495(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=73+4 mod 9=25 mod 9=7
x2=7x1+4 mod 9=77+4 mod 9=53 mod 9=8
……

  • c=0 则为纯倍增生成器

*校验码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值