C++ Mod power或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; }

下面是我改编的一些代码,它处理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;
    }
    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,…我知道了,我忘记了长强制转换的一对括号。