|
发表于 2005-12-24 10:10:06
|
显示全部楼层
sorry, 是 log(m)
前面有人提到过
Post by DoDo
这一点我倒是也想到了,不过要求x^m%n也是件痛苦的事。我先寻找使得x^k%n=1 的k,再通过x^(m%k)%n来得到结果。但是k最大可能大到n-1,这时如果m足够大,那么这一部分的复杂度是n。不知道logk的算法是如何实现的。
代码如下
[PHP]
#include <stdio.h>
typedef unsigned long int t_ul;
int main()
{
/* x ^ m % n */
t_ul x = 0;
// t_ul m = 100000000; // 在 m > n 的情况下, 求 x ^ m % n 最坏情况下复杂度是 2n
t_ul m = 10000000; // 在 m < n 的情况下, 求 x ^ m % n 最坏情况下复杂度是 m
t_ul n = 89999931;
t_ul a = 1;
t_ul b = 1;
t_ul k = 200000000;
t_ul i = 0;
for (i = 2; i < k; i++) {
x = a + b;
if (x > n) x -= n;
b = a;
a = x;
}
printf("x = %u\n", x);
/* next step */
t_ul t = 1;
t_ul count = 0;
do {
t = t * x;
while (t >= n) t -= n;
} while ((++count < m) && (t != 1));
if (count < m) {
t_ul tm = m % count;
t = 1;
while (tm--) {
t = t * x;
while (t >= n) t -= n;
}
}
printf("%u ^ %u mod %u = %u\n", x, m, n, t);
return 0;
}
[/PHP] |
|