Ну я бы тогда начинал с простого, не большего корня n.
Несущественно.
и шёл бы вниз по опять же precprime() а не просто по нечётным.
Вы правы, пока простых хватает, то так быстрее:
Код:
? default(primelimit)
%1 = 51000000
? x=5*3^30;forstep(p=precprime(sqrtint(x)),1,-2,if(x%p==0&&ispseudoprime(p),print(x/1e15,"e15:",p);break));
1.0294556604732450000000000000000000000e15:5
time = 1,826 ms.
? x=5*3^30;p=sqrtint(x)+1;while((p=precprime(p-1))>2,if(x%p==0,print(x/1e15,"e15:",p);break));
1.0294556604732450000000000000000000000e15:5
time = 3,230 ms.
Но когда простых перестаёт хватать, то ситуация быстро меняется на обратную:
Код:
? x=53*3^30;forstep(p=precprime(sqrtint(x)),1,-2,if(x%p==0&&ispseudoprime(p),print(x/1e15,"e15:",p);break));
10.912230001016397000000000000000000000e15:53
time = 6,006 ms.
? x=53*3^30;p=sqrtint(x)+1;while((p=precprime(p-1))>2,if(x%p==0,print(x/1e15,"e15:",p);break));
10.912230001016397000000000000000000000e15:53
time = 10,858 ms.
Хм... максимальный простой делитель может быть больше чем корень...
Хм, это я походу с минимальным спутал ...
Ну тогда не с корня, а с половины числа.
Но соотношения почти не изменятся. только порог чисел станет не квадрат лимита, а сам удвоенный лимит.
-- 18.01.2024, 02:39 --grisВот только для таких малых чисел, у которых именно минимальный простой делитель не более сотен тысяч, конструкция
f=factor(x);f[#f,1] отрабатывает сильно быстрее (менее сотой секунды). Без циклов и лишнего кода.