Показатели в C и Python дают разные ответы - PullRequest
1 голос
/ 18 июня 2020

Пытался выполнить Малую теорему Ферма и заметил, что она не работает в C, поэтому я попробовал ее в Python, и она сработала нормально.

Маленькая теорема Ферма

https://mathworld.wolfram.com/FermatsLittleTheorem.html

Ответ должен дать мне 1, но я получаю 13.

Python экспонента (рабочая)

prime_num = 13**(17-1)

>665416609183179841
prime_num%17 = 1

C экспонента (не работает)

double prime_num = pow(13,17-1)

>665416609183179904
fmod(prime_num,17) = 13

Ответы [ 3 ]

1 голос
/ 18 июня 2020

Вам нужно использовать long long, если вам нужна точность. Проблема в том, что мощи нет, поэтому все сводится к простому умножению.

long long n, val;
int ii;

n = 13LL;
val = n;
for (ii = 2; ii < 17; ++ii)
    val *= n;
printf("%lld\n", val);
printf("%lld\n", val % 17LL);
1 голос
/ 18 июня 2020

В C функция pow () принимает и возвращает значения с плавающей запятой двойной точности, которые являются приблизительными.

В Python оператор ** выполняет операцию, используя Python целые числа, увеличиваются в размере (память, используемая для хранения значения). Если перед операцией вы принудительно использовали числа с плавающей запятой, вы, вероятно, получили бы те же результаты.

В C вы можете попробовать написать другую функцию мощности, которая работала бы с uint64_t (unsigned long long), и увидеть если это сработает.

0 голосов
/ 18 июня 2020

Проблема заключалась в том, что я должен был использовать powl(), который возвращает длинное двойное значение вместо двойного, и я также должен был использовать fmodl(), который возвращает остаток с длинным двойным типом.

C код рабочий

long double prime_num = powl(13,17-1);
>665416609183179841
fmodl(primen_num,17);
>1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...