Я работал над личным проектом, в котором мне нужно было определить все степени простых чисел от 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);
}
Теперь, если я вызову свою версию _pow() вместо pow() из math.h, вывод будет отображаться как исключенный. Моя реализация неверна? В противном случае pow() из math.h не может работать правильно. Любая идея, что вызывает это?