我已經正常工作。 代碼 -C語言 - 費馬理論驗證器無法正常工作
#include <stdio.h>
#include <math.h>
int quadtest(unsigned long long int a, unsigned long long int b, unsigned long long int c, unsigned int n)
{
if ((pow(a,n)+pow(b,n))==pow(c,n))
return 1;
else
return 0;
}
main()
{
unsigned long long int a;
unsigned long long int b;
unsigned long long int c;
unsigned int n;
n=3;
for(n; n<50; n++)
{
//printf("\nn=%u",n);
for(c=2; c<500; c++)
{
printf("\ntrying now c=%llu and n=%u",c,n);
for(b=2; b<500; b++)
{
for(a=2; a<500; a++)
{
quadtest(a,b,c,n);
if (quadtest(a,b,c,n)==1)
{
printf("\n|||||||||||||||||||||||WORKS|||||||||||||||||||||||||||||||||");
break;
}
//printf("\na=%llu, n=%u b=%llu c=%llu",a,n,b,c);
}
if (quadtest(a,b,c,n)==1)
break;}
if (quadtest(a,b,c,n)==1)
break;
}
if (quadtest(a,b,c,n)==1)
break;
}
if (quadtest(a,b,c,n)==1)
printf("\nthe correct values are a=%llu,b=%llu,c=%llu,n=%u",a,b,c,n);
else
printf("\nfermats theory is correct");
}
從我的立場,我正確編碼的一切,(我只用了50範圍內和500,所以我其實可以在我的電腦上運行它,沒有它字面上每天服用)。所以我編譯了Cygwin中的程序(我需要使用它),花了大約15分鐘左右,然後停在「正確的值是a = 381,b = 2,c = 381,n = 7 「這顯然是不正確的。我不確定問題是什麼或如何解決這個問題。我認爲它與記憶有關,但我仍然不確定這是一個什麼樣的解決方案。
我是這麼認爲的,我不是肯定的是什麼使我對範圍內解決這個問題。我想改變b <500到pow(b,n)小於一個數字,但我不確定那個數字是多少。 – Alex 2013-03-10 22:16:15
@Alex問題是'pow()'對不精確的浮點數進行操作。使用重複乘法實現您自己的冪函數,它將起作用。 – 2013-03-10 22:17:12
@Alex使用'unsigned long long',除了浮點值精度有限的問題之外,您很快就會發生溢出。如果你想運行一個正確的蠻力,你需要bignums。 – 2013-03-10 22:19:54