В вашем примере отсутствует 64 = 4 ^ 3, а 729 = 9 ^ 3.
Вы хотите, чтобы множество всех {n ^ m}, пройденных в числовом порядке, m нечетное, n целое и n> 1. Мы знаем, что (для n> 1) это увеличение или n или m увеличит это значение, но если не считать вычислений, мы не можем сравнивать многое другое.
Существует два очевидных «двойных» способа сделать это: отслеживать самую высокую базу n, которую вы рассматриваете, и для всех баз, меньших этой, следующий показатель m, который нужно рассмотреть. Затем выберите самый маленький и сравните его с n ^ 3. Или наоборот - отслеживайте наивысший показатель m и для каждого показателя, меньшего этого, отслеживайте наивысшее используемое основание, найдите наименьшее и сравните его с добавлением 2 ^ m.
Для эффективного отслеживания этих номеров вам нужно сохранить их в очереди с приоритетами . Теперь вы все еще хотите свести к минимуму количество записей в очереди приоритетов за раз, поэтому мы хотим выяснить, какой из этих двух методов лучше справляется с этой задачей. Оказывается, что для достижения заданной точки требуются гораздо более высокие значения n. При числе k наибольшее увиденное значение m будет log_2 из k, а наибольшее увиденное значение n будет k ^ (1/3).
Итак, у нас есть очередь приоритетов с элементами (v, n, m), где значение v = n ^ m.
add_priority_queue(2^3, 2, 3)
for m in 5, 7, ....
v = 2^m
while value(peek(queue)) <= v:
(v1, n1, m1) = pop(queue)
if v1 != v print v1
add_priority_queue((n1+1)^m1, n1+1, m1)
add_priority_queue(2^m, 2, m)
Обратите внимание, что нам нужно проверить v1 = v: у нас может быть 2 ^ 9 = 512 = 8 ^ 3, и только один должен быть распечатан, верно?
Реализация на Haskell со случайной очередью приоритетов, захваченной hackage .
import Data.MeldableHeap
dropMin q = maybe empty snd (extractMin q)
numbers = generate_values (insert (2^3, 2, 3) empty) 5
generate_values q m = case findMin q of
Nothing -> []
Just (v1, n1, m1) -> case compare v1 (2^m) of
EQ -> generate_values (insert ((n1+1)^m1, n1+1, m1) (dropMin q)) m
LT -> v1 : generate_values (insert ((n1+1)^m1, n1+1, m1) (dropMin q)) m
GT -> 2^m : generate_values (insert (3^m, 3, m) q) (m + 2)
main = sequence_ (map print numbers)
У меня в данный момент пробег 177403008736354688547625 (это 23 цифры) и вывод открытого текста 1,3 ГБ через 8 минут