私は、0から999までのすべての素数冪を決定する必要がある個人的なプロジェクトに取り組んでいました。私は数学が特に得意ではないため、次のハムフィストブルートフォースアプローチに疲れました。
bool constexpr is_prime(int imp)
{
return imp == 1 ? false : (imp % imp == 0 && imp % 1 == 0 && [&imp]{ for(int i = 2; i < imp; ++i) if(imp % i == 0) return false; return true;}());
}
bool is_prime_power(int imp)
{
for(int i = 1; i < 1000; ++i)
if (is_prime(i))
for (int j = 0; j < 100; ++j)
if (imp == pow(i, j))
return true;
return false;
}
0 ... 30の場合、出力は次のようになります(A000961による):
1 2 3 4 5 7 8 9 11 13 16 17 19
しかし、これは私が代わりに得るものです:
1 2 3 4 5 7 8 9 11 16 19
13と17はどこに消えましたか?
私のアプローチでは論理的な問題を見つけることができなかったので、私は自分のpow()関数を実装しました。
double constexpr _pow(double base, double exp)
{
return exp == 0 ? 1 : base*pow(base, exp - 1);
}
ここで、math.hからpow()の代わりに自分のバージョンの_pow()を呼び出すと、出力は例外として表示されます。私の実装は間違っていますか?そうでない場合、math.hのpow()は正しく機能しません。何がこれを引き起こしているのか考えていますか?