| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
请问我为什么 WA 了? ---- 万分感谢!将代码贴出来请人帮忙实在是实在是没办法了哦....
我自己测试数据一个也没有出错过啊....却 WA 了不知多少次了!
我连运算结果都进行测试了, 应该没什么问题啊.
可能出问题的就该是 miller-rabin 了. 但是我都开到 32 次测试了.
希望哪位兄台可以帮忙看看, 3x ~~~~
#include <stdio.h>
#include <stdlib.h>
typedef long long lltype;
const int MAX_COUNT = 32;
lltype fMyRand();
//back = (a*b)%num
lltype fMultiModular(const lltype &a, lltype b, const lltype &n);
//miller-rabin法测试素数, count 测试次数
bool miller_rabin(const lltype &n, int count);
// d == a^b(mod n)
lltype modular_exp(const lltype &a, lltype b, const lltype &n);
//a and b can be any integer in [-2147483647, 2147483647]
lltype fGCD(const lltype &a, const lltype &b);
//allFactor[0] 记录了 factor number
void fFindFactor(const lltype &num, lltype *allFactor);
lltype pollard_rho(const lltype &c, const lltype &num);
int main()
{
//printf("%I64d\n", fMultiModular(123, 235, 23));
srand( 215348768 );
int nCase, i;
lltype num, minAns, allFactor[64];
for (scanf("%d", &nCase); nCase > 0; --nCase)
{
scanf("%I64d", &num);
if ( miller_rabin(num, MAX_COUNT) == true )
{
for (int t = 1; t <= 10; ++t)
if ( miller_rabin(num, MAX_COUNT) == false )
t /= t-t;
printf("Prime\n");
}
else
{
//for ( ; ; );
*allFactor = 0;
fFindFactor(num, allFactor);
minAns = num + 1;
lltype test(1);
if ( *allFactor >= 63 )
for ( ; ; );
//for (i = *allFactor; i > 0; --i)
for (i = 1; i <= *allFactor; ++i)
{
if ( allFactor[i] < minAns )
minAns = allFactor[i];
if ( miller_rabin(allFactor[i], MAX_COUNT) == false )
i /= i - i;
test *= allFactor[i];
}
if ( minAns <= 1 || minAns >= num || test != num )
//test /= test-test;
for ( ; ; ) ;
printf("%I64d\n", minAns);
}
}
//scanf("%#");
return 0;
}
lltype fMyRand()
{
lltype result = 0;
for (int i = 0; i <= 61; ++i)
if ( (rand()) & 0x1 )
result += 1LL<<i;
return result;
}
lltype pollard_rho(const lltype &c, const lltype &num)
{
//srand( rand()%100000000 + 21423547 );
int i(1), k(2);
//lltype x = rand() % num;
lltype x = fMyRand() % num;
lltype y = x, comDiv;
do
{
++i;
x = (fMultiModular(x, x, num) + num - c + num) % num;
if ( x == y )
break;
comDiv = fGCD((y-x+num+num)%num, num);
if ( comDiv > 1 && comDiv < num )
return comDiv;
if ( i == k )
{
y = x;
k <<= 1;
}
}while ( true );
return num;
}
void fFindFactor(const lltype &num, lltype *allFactor)
{
if ( miller_rabin(num, MAX_COUNT) == true )
{
allFactor[++(*allFactor)] = num;
return;
}
lltype factor;
do
{
//factor = pollard_rho(rand()%(num-1) + 1, num);
factor = pollard_rho(fMyRand()%(num-1) + 1, num);
//factor = pollard_rho(1, num);
}while ( factor >= num );
fFindFactor(factor, allFactor);
fFindFactor(num/factor, allFactor);
}
//back = (a*b)%num ( n <= 2^62)
lltype fMultiModular(const lltype &a, lltype b, const lltype &n)
{
if ( n <= 0 )
//throw ( -44 );
for ( ; ; ) ;
lltype back(0), temp(a % n);
b %= n;
while ( b > 0 )
{
if ( b & 0x1 )
back = (back + temp) % n;
temp = (temp<<1) % n;
b >>= 1;
}
return back;
}
// d == a^b(mod n)
lltype modular_exp(const lltype &a, lltype b, const lltype &n)
{
lltype d(1), dTemp(a % n); //当前二进制位表示的是进制数值
while ( b > 0 )
{
if ( b & 0x1 )
d = fMultiModular(d, dTemp, n);
dTemp = fMultiModular(dTemp, dTemp, n); //这里需要注意一些问题, 如果 n 很大, 可能会超出范围!!!!
b >>= 1;
}
return d;
}
//miller-rabin法测试素数, count 测试次数
bool miller_rabin(const lltype &n, int count)
{
srand( rand() % 1000000 + 2431757 );
if ( n == 1 )
return false; //n should be >= 1 below
lltype a; //为了谨慎起见用了 lltype, 而没有用 int
for (int i = 1; i <= count; ++i)
{
//a = rand() % (n-1) + 1;
a = fMyRand() % (n-1) + 1;
//a = (i+12536489) % (n-2) + 2;
if ( modular_exp(a, n-1, n) != 1 )
return false;
}
return true;
}
//a and b can be any integer in [-2147483647, 2147483647]
lltype fGCD(const lltype &a, const lltype &b)
{
return b == 0 ? a : fGCD(b, a%b);
}
/*
10
18014398509481987
9007199254740993
55
128
125
18014398509481987
9007199254740993
149
2
3
5
10
*/
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator