wrestПрактически без потери скорости можно упростить до:
k=log(2)/log(10);for(i=500000,550000,print(2^i\10^floor(max(i*k-1000,0)))).
Кстати Вы про
max забыли и короткие числа у вас выводятся неправильно (дополняются нулями
справа).
Там все-тки стартовая степень-то полмиллиона, а не единица... Протаймить лучше с ней, наверное.
Я
протаймил весь диапазон до
, получилось 6 минут. Причём для 1000 цифр, а не трёх. Ваш код в тех же условиях (1000 цифр) для
выполняется за 15с, мой за 10с.
-- 24.10.2019, 02:07 --Сравнение вариантов:
Код:
? z=500000;n=2^z;k=log(2)/log(10);for(i=1,50000,n=n+n;e=(z+i)*k;x=floor(e-1000);x=(n\10^x))
time = 1min, 21,184 ms.
? z=500000;n=2^z;k=log(2)/log(10);for(i=1,50000,n=n+n;e=(z+i)*k;x=floor(max(e-1000,0));x=(n\10^x))
time = 1min, 20,997 ms.
? k=log(2)/log(10);for(i=500000,550000,x=(2^i\10^floor(max(i*k-1000,0))))
time = 1min, 21,792 ms.
? pr=10^(logint(2^500000,10)+1);d=max(1,pr\10^1000);for(i=500000,550000,x=2^i;if(x>=pr,d*=10;pr*=10);x\=d)
time = 17,379 ms.
Для сравнения, на ассемблере без особых оптимизаций весь диапазон до
считается за 22с (вместо 6 минут на PARI/GP), а с оптимизацией под AVX2 меньше трёх секунд.