数论(算法概述)-阿里云开发者社区

开发者社区> 开发与运维> 正文

数论(算法概述)

简介:
  1. 模运算

模运算很有用, 最常用的是钟表.
还有二进制负数的补码, 有2n 个数, [-2n-1 , 2n-1 -1]

正数当然直接表示成2进制即可, 对于负数就需要用补码, 即[1, 2n-1 ] 的二进制表示的取反再加一.

以前对这个补码不理解, 所以也一直记不住, 其实:

Any number in the range -2n-1 to 2n-1 - 1 is stored modulo 2n. Negative numbers -x therefore end up as 2n -x.

原来如此.

模运算对于加,减,乘,指数运算, 都很容易理解, 也都可以先进行模运算再加减乘. 就是除比较复杂, 后面会谈到.

  1. 最大公约数-euclid算法

Euclid's rule: If x and y are positive integers with x >= y, then gcd(x, y) = gcd(x mod y, y)

对于这个的证明, 用反证显而易见.

我们还可以得到以下定理:

Lemma: If a > b, then a mod b < a/2.

这个的证明分为两种情况b>a/2, ba/2的时候, a mod b < a/2是显然的.

当b

有了这个定理, 我们可以知道euclid算法每次递归都会做x mod y, 因为x mod y < x/2, 所以每次递归x的位数都会减1(2进制).

所以euclid的算法最多需要递归len(x)+len(y), 即2n次

而每次递归都要做个除法算x mod y, 这个是O(n2 ), 所以算最大公约数是O(n3 )的.

扩展euclid算法

由上面的算法我们可以算出两个数的最大公约数, 但是如果给出d是最大公约数, 怎么验证呢.

Lemma: If d divides both a and b, and d = ax + by for some integers x and y, then necessarily
d = gcd(a, b).

证明: 首先d<= gcd(a, b)的, 这个显然. 而d = ax + by, ax + by是可以整除gcd(a,b)的, 所以d也可以整除gcd(a,b), 即d>=gcd(a,b). 得证.

扩展euclid算法就是可以证明在用euclid算法算最大公约数的时候可以一起算出x, y. 所以x, y是一定存在, 且可以找出的.

模除法

4/3 mod N 这个应该怎么算

4* 1/3 mod N, 4 mod N是没有问题的, 那么1/3 mod N应该怎么算了, 这个确实看上去没法算.

3* 1/3 = 1 (mod N), 把1/3换成x, 3x = 1 (mod N), 而 x = 1/3 (mod N), 所以我们只需求出x的整数解.

We say x is the multiplicative inverse(乘法逆元素) of a modulo N if ax = 1 (mod N).

而这个x是否能解出是有条件的, 比如2x = 1 (mod 6)就无解.

Modular division theorem: For any a mod N, a has a multiplicative inverse modulo N if and only if it is relatively prime to N.

即当a和N互质的时候, 这个x是有解的.

ax + Ny = 1 (互质, 所以最大公约数为1), 两边mod N

ax = 1 mod N, 而这个x是可以通过扩展euclid算法求出的, 所以复杂度也是O(n3 )的.

且x有解时, a和N一定互质

ax mod N = ax - KN = 1, 两边除gcd(a, N)

而ax-KN/gcd(a,N)一定是个整数, 所以1/gcd(a,N)也一定是个整数, 所以gcd(a, N)只能为1.

质性判定

给一个整数怎么判断是否是质数? 费马小定理

Fermat's little theorem If p is prime, then for every 1 <= a < p,
ap-1 = 1 (mod p):

证明: 我们可证(p-1)!*ap-1 = (p-1)! (mod p) 是成立的. 对p取模, 余数的可能性为[1,p-1]

S = {1, 2, ... , p-1} = {a 1 mod p, a 2 mod p, ..., a * (p - 1) mod p} 可证这两个集合是一样的

由于P是质数, p和[1,p-1]中的数都互质, 所以上面的式子两边都除(p-1)!, 得证.

但费马小定理只能保证质数都满足这个条件, 但不能保证满足条件的都是质数.

如341 = 11* 31 is not prime, 但它就满足费马小定理

不过这种例子很少见, 称为Carmichael numbers

而且对于合数, 即不满足费马小定理的数, 可以证明至少有一半以上的a值不满足.

Lemma: If aN-1 != 1 mod N for some a relatively prime to N, then it must hold for at least
half the choices of a < N.

所以判断一个数是否为质数, 只需多随机抽取k个a, 来判断是否满足ap-1 = 1 (mod p), 错判的概率为1/2k , k足够大时, 正确的概率很大.

而要随机生成大质数, 方法也很简单.

Lagrange's prime number theorem: the number of primes <= x 无限接近 x/(ln x).

也就是说质数是很多的, 于是找质数就是随机生成一个规定长度的整数, 然后判断是否为质, 不是继续找.

公钥加密 RSA

Property: Pick any two primes p and q and let N = pq. For any e relatively prime to (p -1)(q - 1):

The mapping x -> xe mod N is a bijection on {0, 1, ... ,N-1}.Moreover, the inverse mapping is easily realized:

let d be the inverse of e modulo (p -1)(q -1). Then for all x {0,...,N- 1},
(xe )d = x mod N:

找两个大质数p, q, 然后N = pq, 找一个e与 (p -1)(q -1)互质.

加密的时候用xe mod N得到x的密文, 所以e, N为公钥, 公开的

d为私钥, ed = 1 mod(p -1)(q -1), 因为e与 (p -1)(q -1)互质, 所以d必有解.

解密的时候用(xe )d mod N 来得到原文x.

RSA就是机遇大数分解非常的难, 所以你知道N, 但是无法短时间内知道p, q, 即得不到d.

证明(xe )d = x mod N:

ed = 1 mod(p -1)(q -1), 即 ed = 1+k(p -1)(q -1)

(xe )d = x1+k(p -1)(q -1)

由于p,q都是质数, 所以xp-1 = 1 (mod p)

x1+k(p -1)(q -1) - x 可以被p整除, 同样可证可被q整除, 由于p,q都是质数, 所以也可以被N = pq 整除

即(xe )d - x =0 mod N

所以得证.

本文章摘自博客园,原文发布日期:2011-07-04

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章