Ещё идейка по ускорению вычисления
.
Само вычисление корня кубического, напомню, не нужно. Вернее, нужно, но крайне редко. Нужна только проверка куб ли данное число, а вычисление-то так редко делается что хоть столбиком можно.
Вот будет забавно если ispower примерно так и действует ...
Я тоже надеюсь, что ispower действует максимально эффективно, но вряд ли использует таблицы предвычисленных кубов или "хеши".
-- 08.08.2018, 19:45 --И разумеется это делать лишь если проверка по модулю не отвергла
.
Да, как проверку-то делать?
Вот есть у меня число
90909 и есть вектор
v в котором перечислены все возможные остатки от деления кубов на это число, их
1365.
Теперь берем какое-нибудь (проверяемое) число, делим его на
90909 с остатком и проверяем не получился ли какой-нибудь из этих
1365?
Делаем вектор со всеми кубическими вычетами по модулю:
90909Код:
v=vector(90909,i,i^3%90909)
Оставляем в векторе только неповторяющиеся остатки:
Код:
v=vecsort(v,,8)
Заводим функцию, проверяющую на потенциальную кубичность:
Код:
iscube(n)=my(d=90909);r=n%d;if(vecsearch(v,r),return(1),return(0))
Смотрим примерно
10^7 проверок
Код:
? for(i=10^6,10^7,iscube(i))
*** last result computed in 6,335 ms.
? for(i=10^6,10^7,ispower(i,3))
*** last result computed in 1,107 ms.
Что-то не так...
Повышаем ставки:
Код:
? for(i=10^9,10^9+10^7,iscube(i))
? ##
*** last result computed in 7,051 ms.
? for(i=10^9,10^9+10^7,ispower(i,3))
? ##
*** last result computed in 875 ms.
Все равно фигня.
Конструкция без вызова функции, а роверки прямо по месту улучшает в два раза но все равно работает долго:
Код:
? for(i=10^9,10^9+10^7,vecsearch(v,i%90909))
? ##
*** last result computed in 2,090 ms.