Но чтобы вам было нескучно, предпоследнее число перед 1 может быть толко вида:
Эта банальность следует прямо из условия
.
Я надеялся у Вас есть что-то не банальное ...
Я, кстати, склонен скорее верить, что для достаточно больших
наступит
Ведь
и все прочие меняются, так почему не
?
Ну я об этом
говорил ещё во втором же сообщении темы.
У меня это видимо два в степени вектор (как поэлементная операция), PARI сразу встает на дыбы и переводит в тип с плавающей точкой; я там поэтому результат в round() обернул. А << для вектора не сделаешь, ошибка несоответствия типов. Я-то привык к Matlab-у, где возня с матрицами всегда существенно быстрее ручного цикла, а тут видимо необязательно так.
Я думаю тормоза скорее в принципе из-за работы со сложными объектами типа векторов и матриц, это же требует выделения/освобождения памяти под временные переменные (а PARI тормозит даже на простых одиночных переменных, посмотрите
выше про 48с vs 73с). Плюс наверняка тормозит (по сравнению с нормальными языками) вызов процедур. Плюс огромное количество итераций (у меня, у Вас оно превращается в огромные списки), которые тоже не быстрые даже сами по себе. Я потому и думаю что Ваш метод будет тормознее моего в любом случае - оперировать сложными объектами (списками чего угодно) всегда сложнее простого рекурсивного вызова. А если уж у Вас объём объектов превысит размер кэшей процессора (L3) или даже памяти вообще ... настанет вообще мрак со скоростью. Хотя количество итераций наверное может быть на порядки меньше моего (отсутствует рекурсивный проход глубже для каждого варианта вектора на каждом шаге), впрочем и у меня рекурсия чаще обрывается достаточно быстро. Так что вопрос кто когда быстрее - непростой.
Может быть таки соберусь и перепишу свой код (он как бы несложный) на дельфи или сразу асме, посмотрим насколько выйдет быстрее.
два в степени вектор (как поэлементная операция), PARI сразу встает на дыбы и переводит в тип с плавающей точкой;
Можно делать так, заодно не будете ограничены точностью плавающих чисел:
Код:
? apply(x->2^x,[1,2,3])
%1 = [2, 4, 8]
? apply(x->1<<x,[1,2,3])
%2 = [2, 4, 8]
apply это общее средство поэлементных операций над объектами. Как и
select для произвольных выборок по некоему условию.