理论分析:
把矩阵 T:=
1 1
1 0
乘到 (fib(n-1) fib(n-2))^t 上就可以得到 (fib(n) fin(n-1)). 所以求 (fib(n+1) fib(n)) 相当于计算 T^n (1,0)^t。
若 a 是半群 A 的一个元素,则总可以用本节说讲的方法计算 a^n. 这种方法实际上是从右向左扫描 n 的比特,也可以采用从左向右扫描比特方法。
如果 a 在 A 中有逆且容易求出,则计算的开销可以进一步减少。
参考资料:
- 关于 fib 序列的计算,可以参考我 blog 上的一个帖子:[计算 Fibonacci 数的一些注记]
- 关于 fibonacci 数列的一般性介绍,可以参考维基百科的词条: [Fibonacci Number].
- 关于 Fibonacci 的生平,可以参考维基百科的词条: [Fibonacci].
![]()
Leonardo of Pisa (Fibonacci)
1170~1250
意大利数学家
1009 , 10007, 100003, 1000003
执行 100 次的时间
1009: 5
10007: 12
(* 5 (sqrt 10)) =15.811388300841898
执行 1000 次的时间
1009: 45
10007:130
(* 45 (sqrt 10))=142.30249470757707
执行 10000 次的时间
1009: 224
10007:940
(* 224 (sqrt 10))=708.350195877717
执行 100000 次的时间
1009: 2153
10007: 7060
(* 2153 (sqrt 7060))=6808.383802342521
执行 500000 次的时间
1090: 9968
10007: 32669
(* 9968 (sqrt 10))=31521.583716558405
100000 次
100003:19649
1000003:62005
Is your result compatible with the notion that programs on your machine run in time proportional to the number of steps required for the computation?
理论分析:
- 如果 n 是个素数,a in [0, n). 根据 Fermat 小定理,有 a^(n-1)=1 (mod n)。
- n-1 是偶数,可以写成 2^mk 的形式,其中 k 是奇数。于是 a^(n-1)=1 可以改写为 a^(2^m k)。
- 设 b=a^k,考虑以下序列
B=( b, b^2, b^8, ..., b^(2^m k) ) (mod n)
序列中的每个均是其后继模 n 意义下的平方根。
- 当 n 为素数时, 模 n 意义下, 1 仅有两个平方根 1 和 -1 (这是 MR 测试用来区分素数、合数的关键。对于合数 n,1 的平方根可以多于两个)。
- B 序列可能的模式为
模式 1:(? ? ? ... ? ? ? -1 1 ... 1)
模式 2:(1 1 1 ... 1 1 1 1 1 ... 1)
其中 `?' 为 1, -1 以外的数,而且第一种模式包括 (-1, 1, 1, ..., 1)
- mr 测试的大致步骤为,依次计算 B 序列中的数(除了最后一个),
- 如果一上来就是 1,则是模式 2,可以马上返回,概率推断 n 为素数。
- 如果在途中碰到一个 -1,则是模式 1, 可以马上返回,概率推断 n 为素数。
- 如果在途中遇到 1(但不是B0),则不是前述两种模式,必定为合数。
- 如果在途中一直没有碰到 1, -1,则计算到倒数第二项终止。由于倒数第二项是末项的平方根,但不是 1,-1,所以末项必定不是 1, 从而 n 也必定是个合数。
代码说明:
- pot2 返回一对 cons e.o,如果 n=2^m k,则 e=m, k=o.
- make-test-fun 的返回值是一个函数,包含了必要的参数。之后每执行其返回值一次,就进行了一次随机的 mr-test.
- make-test-fun 中的 second-check 是对序列检查的第二部分(对 B0 的检查比较特殊,之后的检查是 second-check)。
- mr-test 的流程为用 make-test-fun 生成测试函数,并绑定在 f 上。用 loop 函数实现循环测试。
参考资料:
- 关于 Miller-Rabin 素性测试的一般性描述,可以参考维基百科的词条:[Miller–Rabin primality test]
- 对于 Miller-Rabin 测试的更深入讨论,如失误概率的大小等,可以参考更专业的文献。比如裴定一的 [算法数论].
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |