C++ Mod power或totient逻辑问题
下面是我改编的一些代码,它处理euler totient函数和幂模函数。每个C++ Mod power或totient逻辑问题,c++,modulus,greatest-common-divisor,C++,Modulus,Greatest Common Divisor,下面是我改编的一些代码,它处理euler totient函数和幂模函数。每个n,f2总是3而不是各种数字。有人看到错误吗phi(n)和modpow(n)这两种方法似乎都能正常工作 #include <iostream> using namespace std; int gcd(int a, int b) { while (b != 0) { int c = a % b; a = b; b = c; }
n
,f2
总是3
而不是各种数字。有人看到错误吗phi(n)
和modpow(n)
这两种方法似乎都能正常工作
#include <iostream>
using namespace std;
int gcd(int a, int b)
{
while (b != 0)
{
int c = a % b;
a = b;
b = c;
}
return a;
}
int phi(int n)
{
int x = 0;
for (int i=1; i<=n; i++)
{
if (gcd(n, i) == 1)
x++;
}
return x;
}
int modpow(int base, int exp, int mod) // from stackoverflow
{
base %= mod;
long long result = 1;
while (exp > 0)
{
if (exp & 1)
result = (result * base) % mod;
base = (base * base) % mod;
exp >>= 1;
}
return result;
}
int f2(int n) // f(f(n)) mod n
{
long long a = modpow(2, n, phi(n)) + 1;
return (modpow(2, a, n) + 1) % n;
}
// ...
int main()
{
int n = 520001;
while (true)
{
cout << "f2 " << f2(n) << endl;
if (f2(n) == 0)
{
// ...
}
n += 2;
}
return 0;
}
#包括
使用名称空间std;
内部gcd(内部a、内部b)
{
而(b!=0)
{
int c=a%b;
a=b;
b=c;
}
返回a;
}
整数φ(整数n)
{
int x=0;
对于(int i=1;i 0)
{
if(exp&1)
结果=(结果*基础)%mod;
基数=(基数*基数)%mod;
exp>>=1;
}
返回结果;
}
int f2(int n)//f(f(n))模n
{
长a=modpow(2,n,φ(n))+1;
返回(modpow(2,a,n)+1)%n;
}
// ...
int main()
{
int n=520001;
while(true)
{
如果base>=65536,coutbase*base将超过int的大小。请尝试此修复程序,似乎有效:
int modpow(int base, int exp, int mod) // from stackoverflow
{
base %= mod;
long long result = 1;
while (exp > 0)
{
if (exp & 1)
result = (result * base) % mod;
base = (int)(((long long)base * (long long)base) % mod);
exp >>= 1;
}
return (int) result;
}
在任何情况下,基址都是=65536
,其余的代码将在510000左右停止n
基址将在主循环中更新。对mod power的第一次调用将计算(2^520001)%518100。在第五个循环中,它正在计算(2^16*2^16)%518100=>(2^32)%518100=>(0)%518100,因为2^32超出了整数的大小,导致第五个循环后的base=0。使用(长-长)强制转换修复,输出是945827379578163741,…我知道了,我忘记了长强制转换的一对括号。