《算法概论》Note_第一章_数字的算法

第0章 序言

引入:书籍和算法
从Fibonacci数列开始:递归算法与(保存了前面状态的)动态规划算法、以及习题4中使用矩阵的求法
大O符号:大O的精确定义,大O的特性(简化表达)

第1章 数字的算法

两个问题:非常困难的因子分解和非常简单的素性测试(算法该词的来源)

1.基本算术

1. 加法:加法的复杂度应为O(n),n为所输入数字的位数,但该O(n)是考虑编码到硬件中的加法的(不同于一般意义上),或当整数较大时需要有一个超过字长的考虑(此时n为数字所占字的个数)。在算法层面,不考虑硬件或者数字在字长内时,加法的复杂度应为O(1)
2. 乘法:
(1)二进制乘法:在这里插入图片描述
复杂度为O(n²),因为有n*(n-1)次加法操作
(2)AI Khwarizmi的十进制乘法:
左边的数除2,并弃掉小数部门,右边的数加倍,把右边的对应左边是奇数的行加起来就是乘法结果。
在这里插入图片描述
复杂度也为O(n²),且实际上本质与二进制乘法相同(左边除2操作相当于选取了2的幂次)
(3)AI算法的另一种表示:
在这里插入图片描述
乘法和除法的伪代码:
在这里插入图片描述
---------------------------------------------------------------------------------------------------------------------------------------------------在这里插入图片描述
与乘法一样,除法的时间复杂度也是O(n²)

2.模运算

模运算与替代准则,替代准则可以简化模运算;
替代准则:x=x1(mod N) 且 y=y1(mod N),则有 x+y=(x1+y1)(mod N) 以及 xy=(xy)(mod N)。
1. 模的加法和乘法:对于不超过n的两个数x1和y1的模的加法,其x和y都不超过N,x+y最大为2(N-1),则只需要一次加减法就可以使得x+y到N以内,即模的加法与加法的的时间复杂度只差1个常数项,那么模的加法的时间复杂度为O(n);同样的,对于模的乘法,xy的乘积最大值为(N-1)²,这个数最多占2n位长,而之前普通除法的时间复杂度是平方时间,所以模的乘法的时间复杂度即x乘y的时间复杂度与xy除以N的复杂度之和,仍为O(n²)
2. 模的指数运算:xy mod N的算法,首先可以用x1 mod N——>x2 mod N——>x3 mod N——>x4 mod N——>…——>xy mod N这样的方法来确保不会产生很大的中间值;其次可以再对上述过程优化为x1 mod N——>x2 mod N——>x4 mod N——>x8 mod N——>…——>x2log[y] mod N,而这次的每一次平方的时间复杂度是O(log2N),而这一次只有log y次乘法;为求得xy mod N,可以将xy 写为xy1 +xy2+xy3,其中y1、y2和y3都是2的幂次(在二进制表示中只有1位为1),举例:求x25,x25 = x16 +x8+x1 = x11012 = x10002 +x10002+x00012,由此有:

function modexp(x,y,N)
—————————————————
Input:Two n-bit integers x and N,an integer exponent y
Output:x^y mod N
if y = 0: return 1
z = modexp(x,ceil[y/2],N)
if y is even: return z^2 mod N
else: return x·z^2 mod N

算法可表示如下:
在这里插入图片描述
令n为x,y和N三个数中位长最长者对应的位数,对于乘法运算,算法最多在n次调用后终止,而在每次调用中都乘以长为n位的数(对于模N,则不用此),因此总运行时间位O(n3);
3. Euclid的最大公因数算法:如何计算x和y的最大公因数,有Euclid规则:若正整数x≥y,那么gcd(x,y) = gcd(x mod y,y);所以有Euclid最大公因数算法如下:

function Euclid(a,b)
————————————————
Input: Two integers a and b with a ≥ b ≥ 0
Output: gcd(a,b)
if(b = 0): return a
return Euclid(b,a mod b)

有引理:若a ≥ b,那么 a mod b < a/2。则这意味着经过了两次连续操作后,a和b这两个参数都至少在原来各自取值上减半,若初始为n位,则最多经2n次调用就会达到边界条件,而每次调用都包含一个平方时间的除法操作,所以总运行时间为O(n3);
4. Euclid算法的一种扩展:如何确定a和b的公因数d是它们的最大公因数?有引理:若d整除a和b,同时存在整数x和y,使得d = ax + by成立,那么一定有d = gcd(a,b)。可以用一下算法求取x,y和d:

function extended-Euclid(a,b)
————————————————————————
Input: Two postive integers a and b with a ≥ b ≥ 0
Output: Integers x,y,d such that d = gcd(a,b) and ax + by = d
if b = 0: return (1,0,a)
(x`,y`,d) = extended-Euclid(b,a mod b)
return (y`,x`-ceil[a/b]y`,d)

5.模的除法:模的除法定义:若ax = 1(mod N),则x为关于a (mod N) 的一个乘法逆元。(推导过程:有y/a (mod N) = yx (mod N) ,则两边同时除以y,有1/a (mod N) = x (mod N) ,即1 (mod N) = ax (mod N) )注意模的除法(乘法逆元)运算不一定总是存在。有模的除法定理:对于任意的a mod N,当且仅当a与N互素时,a 有一个模N的乘法逆元。若该逆元存在,则可以在O(n3)时间内,通过扩展Euclid算法求得。

3.素性测试

费马小定理:如果p是一个素数,那么对于任意的1≤a<p,有ap-1=1(mod p)。
简略证明:若a = 3,p = 7,有 {1,2,…,6} = { 3·1 mod 7,3·2 mod 7,…,3·6 mod 7 },如下图
在这里插入图片描述
将左边括号内数字相乘,右边相乘有:6!= 3·6!(mod 7),约掉 6!,可以得到 ap-1=1(mod p),一般性推广略。
事实上,费马小定理不是一个充要条件,有一部分合数也可以用费马小定理的表达式表示,这部分合数称为Carmichael数。除了Carmichael数之外所有的合数都不能用费马小定理的表达式表达。且有 引理:对于某些与N互素的a,有 aN-1 ≠ 1 mod N,那么对于a < N的至少一半的可能取值,N将无法通过费马测试。即当若待测试数M,若M为素数,则对于所有 a<M,都有 aM-1=1(mod M) 成立。若M不为素数,则对于所有 a<M,至多有一半 aM-1=1(mod M) 成立。
1. 素数的随机生成:Lagrange素数定理:令π(x)为 ≤x 的素数的个数,则有 π(x) ≈ x/(ln x),或者更准确的,在这里插入图片描述;我们可以用Format测试来获得“工业级素数”。

4.密码学

Rivest-Shamir-Adleman(RSA)密码机制,密码学基本机制:
在这里插入图片描述
1. 密钥机制:一次一密乱码本和AES:在one-time pad机制下,Alice和Bob预先见面,两人私下商定一个二进制位串r,r与Alice即将发送的重要信息x的长度一样,都是n位,加密和解密都是取要加密的或者要解密的二进制位串 x 与 r 进行按位运算;与一次一密类似的有AES密钥机制,即Alice和Bob约定好一个定长的二进制位串 r 。
2. RSA:RSA机制下,Alice和Bob不需要提前会面,Alice可以使用Bob的公钥进行加密,而Bob利用自己的私钥解密。需要找到一个双向映射(加密映射和解密映射)来确定RSA的公钥和私钥,确定此双向映射可以利用如下性质:随机选取两个不同的素数 p 和 q ,并令N = pq。对任意与(p-1)(q-1)互素的整数e,有以下性质成立:
(1)映射 x ——> xe) mod N是定义在集合{0,1,…,N-1}上的双向映射;
(2)另外,容易得到该映射的逆映射:令 d 为 e 模 (p-1)(q-1) 操作的逆,则对于所有的 x ∈ {0,1,…,N-1},有(xe)d = x mod N.
第一个性质告诉我们映射 x ——> xe) mod N 是一个对消息 x 进行加密的合理方式,因为加密过程没有丢失任何信息,而第二个性质告诉我们解密是如何进行的(证明略)。RSA的安全性主要基于以下一个简单假设:给定N,e以及y = xe mod N,想要计算 x 将是十分困难的。

5.通用散列表

1. 散列表:用通用散列表存储IP地址示例:
在这里插入图片描述
2. 散列函数族:可以借用数论的知识来生成一个函数族使得散列的冲突最小(略);
">本章主要讲了一些有关于加减等运算的算法复杂度以及一些关于密码学基础的如取模、素性等相关知识,还有通用散列表等相关内容。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值