Возможно, вы сможете немного приблизиться, используя более подходящий язык, например, Схема:
(define (series n) (if (= n 0) 2
(quotient (* 3 (series (- n 1))) 2)))
Это вычисляет 17610 цифр (series 100000)
примерно за 8 секунд на моей машине. К сожалению, (series 1000000)
все еще занимает слишком много времени, чтобы даже у более новой и более быстрой машины появилась надежда закончить через минуту.
Переключение на C ++ с большой целочисленной библиотекой (в данном случае NTL):
#include <NTL/zz.h>
#include <fstream>
#include <time.h>
#include <iostream>
int main(int argc, char **argv) {
NTL::ZZ sum;
clock_t start = clock();
for (int i=0; i<1000000; i++)
sum = (sum*3)/2;
clock_t finish = clock();
std::cout << "computation took: " << double(finish-start)/CLOCKS_PER_SEC << " seconds.\n";
std::ofstream out("series_out.txt");
out << sum;
return 0;
}
Это вычисляет серию для 1000000 за 4 минуты 35 секунд на моей машине. Это достаточно быстро, чтобы я мог почти поверить, что действительно быстрая новая машина может хотя бы приблизиться к завершению за минуту (и да, я проверил, что произошло, когда я использовал смены вместо умножения / деления - это был медленнее).
К сожалению, вычисления в замкнутой форме, предложенные другими, похоже, мало помогают. Чтобы использовать его, вам нужно вычислить постоянную K с достаточной точностью. Я не вижу вычисления K в замкнутой форме, так что на самом деле это просто сдвигает итерацию к вычислению K, и похоже, что вычисление K с достаточной точностью немного (если вообще имеет место) быстрее, чем вычисление исходного ряда.