摘要: 【引理】如果p是一个素数的话,那么对任意一个小于p的正整数a,a, 2a, 3a, ..., (p-1)a除以p的余数正好是一个1到p-1的排列。(例如,5是素数,3, 6, 9, 12除以5的余数分别为3, 1, 4, 2,正好就是1到4这四个数。) 【证明】( 反证法)假如结论不成立的话,那么就是说有两个小于p的正整数m和n使得na和ma除以p的余数相同。不妨假设n>m,则p可以整除a(n-m)。但p是素数,那么a和n-m中至少有一个含有因子p。这显然是不可能的,因为a和n-m都比p小。【Fermat小定理(Fermat's Little Theorem)】如果p是素数,a是 阅读全文
posted @ 2012-01-18 18:48 狼の禅 阅读(1877) 评论(1) 推荐(1) 编辑
摘要: 利用二进制扫描的方法快速的计算abmod c,显然用常规方法计算74237mod 4233计算量过大。基本原理:(a×b)mod c=((amod c)×b)mod c例如:35mod 7=3(101)2mod 7=((3(100)2mod 7)×3)mod 7=((9(10)2mod 7)×3)mod 7=(((9mod 7)(10)2mod 7)×3)mod 7=((2(10)2mod 7)×3)mod 7=((4(1)2mod 7)×3)mod 7=(4×3)mod 7=5实现代码如下(C语言版)1 int 阅读全文
posted @ 2012-01-18 15:44 狼の禅 阅读(1102) 评论(0) 推荐(1) 编辑
摘要: 求最大公约数的Euclid算法需要用到大量的取模运算,这在大多数计算机上是一项复杂的工作,相比之下减法运算、测试数的奇偶性、折半运算的执行速度都要更快些。二进制最大公约数算法避免了Euclid算法的取余数过程。二进制最大公约数基于下述事实:若a、b都是偶数,则gcd(a,b)=2*gcd(a/2,b/2)若a是奇数、b是偶数,则gcd(a,b)=gcd(a/2,b/2)若a、b都是奇数,则gcd(a,b)=gcd((a-b)/2,b)因此可写出二进制最大公约数算法如下(C语言版): 1 int gcd(int a,int b){ 2 int c=1; 3 while(a-b){... 阅读全文
posted @ 2012-01-18 14:16 狼の禅 阅读(1082) 评论(0) 推荐(1) 编辑
我要啦免费统计