2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3, 4, 5  След.
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 15:32 
Аватара пользователя
О, сколько народу подключилось!

wrest, теперь вижу Ваше время. Понял, что надо Ваш код не из консоли запускать (как обычно делаю). Запустил прямо из Пари, а потом дал такую же команду. Количество совпало, а время засёк по часам — 80 секунд.

У grisа всего лишь 34 секунды.

Dmitriy40 в сообщении #1702967 писал(а):
forprime(p=3,1e8/2, numdiv(2*p-1)==4 && numdiv(2*p+1)==4 && kpod++; );
что даёт время 3.9с!

А вот и настоящая крутизна :-)

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 15:33 
mihaild в сообщении #1702969 писал(а):
А можно кратко - что считаем?
Цепочки из последовательных натуральных чисел, имеющих строго k=4 делителей. Чисто для тестов/иллюстрации, их миллионы за минуты находятся.

-- 23.09.2025, 15:34 --

wrest
Yadryara
Время улучшилось до 1.4с.

-- 23.09.2025, 15:36 --

Yadryara в сообщении #1702970 писал(а):
время засёк по часам — 80 секунд
В PARI есть команда ## - показать время выполнения последней команды. В данном случае - работы функции.

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 15:37 
Dmitriy40
Предлагаю вместо isprime(round(2*p/3)) писать isprime((shift(p,1)+1)\3) :mrgreen:

-- 23.09.2025, 15:40 --

Dmitriy40 в сообщении #1702971 писал(а):
Время улучшилось до 1.4с.

:( слишком быстро. Надо увеличить диапазон в 10 раз :D

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 15:42 
wrest в сообщении #1702972 писал(а):
Dmitriy40
Предлагаю вместо isprime(round(2*p/3)) писать isprime((shift(p,1)+1)\3) :mrgreen:
Согласен: до 1e9 ускоряет с 16.5с до 14.2с.

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 15:44 
Аватара пользователя
Dmitriy40 в сообщении #1702971 писал(а):
Цепочки из последовательных натуральных чисел, имеющих строго k=4 делителей
В смысле $a$ такие, что каждое из $a$, $a+1$, $a+2$ имеет ровно $4$ делителя? (т.е. является либо произведением двух различных простых, либо четвертой степенью простого)

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 15:44 
Аватара пользователя
gris в сообщении #1702966 писал(а):
Разве тройка может иметь в себе число кратное 4?

В данной задаче не может.

Dmitriy40, тогда надо на миллиард переходить. Вы меня сами учили, что результирующее время желательно иметь не менее 20 секунд.

Для сверки:

Код:
Интервал    Первонач   Полупрост         2         3        Троек
<=10^2             3           3         3         3            3
<=10^3            93          67        39        27           13
<=10^4          1429         732       291       197           71
<=10^5         18257        7321      2170      1505          379
<=10^6        214694       69811     16783     11546         2377
<=10^7       2419224      658013    130805     89606        15197
<=10^8      26538772     6186940   1049769    717517       103474
<=10^9     286024010    58236914   8636829   5885913       741791
<=10^10   3044160588   549561294  72353829  49179067      5492374

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 15:45 
Yadryara в сообщении #1702970 писал(а):
Понял, что надо Ваш код не из консоли запускать (как обычно делаю). Запустил прямо из Пари, а потом дал такую же команду.

Я обычно даю код законченной функции, которая не портит глобальные переменные и не создаёт своих, возвращает что надо (ну или печатает). Потом её запускать, да. Можно скомпилить в gp2c и потом запускать.

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 15:56 
mihaild в сообщении #1702974 писал(а):
Dmitriy40 в сообщении #1702971 писал(а):
Цепочки из последовательных натуральных чисел, имеющих строго k=4 делителей
В смысле $a$ такие, что каждое из $a$, $a+1$, $a+2$ имеет ровно $4$ делителя? (т.е. является либо произведением двух различных простых, либо четвертой степенью простого)
Да, только с поправкой что в кубе, не в четвёртой степени. Показатель степени k у простого даёт множитель k+1 в количество делителей.

-- 23.09.2025, 16:06 --

Что интересно, добавление первым условия bittest(0x6816,p%15) программу уже замедляет, хотя казалось бы должно немного ускорять.
Как и эквивалентного (но ещё более медленного) условия setsearch([1,2,4,11,13,14],p%15).

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 16:11 
Аватара пользователя
mihaild, конечно, я же прямо на A039833 ссылку дал.

Хотя степень 3-я а не 4-я. Насколько помню, можно как-то быстро установить, что кубы в пролёте и остаются только бесквадратные полупростые или, как я их называю, куары.

wrest
Здорово! А я и не знал что ещё какой-то шифт есть...

Видимо, надо уже на 10, а то и на 100 ярдов переходить. А затем переделывать и на асм и на CUDA...

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 16:30 
Yadryara в сообщении #1702979 писал(а):
Здорово! А я и не знал что ещё какой-то шифт есть...

Ну по-хорошему умножение на два натурального числа $n$ и должно заменяться или шифтом или $n+n$
Деление целого на целое с последующим округлением до целого тоже не надо плавающей арифметикой делать если их много и важна скорость. Так что эти штуки вполне как бы очевидны :)
Шифт, к слову, есть даже в экселе 8-)

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 16:36 
Yadryara в сообщении #1702979 писал(а):
Насколько помню, можно как-то быстро установить, что кубы в пролёте и остаются только бесквадратные полупростые
issquarefree и forsquarefree.
Проверить же кубы простых до 1e9 легко - циклом forprime(p=2,1e9^(1/3), x=p^3; ...).

wrest в сообщении #1702981 писал(а):
Деление целого на целое с последующим округлением до целого тоже не надо плавающей арифметикой делать
В PARI 2*p/3 вычисляется целочисленно (в рациональных числах). Вот если любое из трёх чисел сделать с точкой, то да, будет плавающая точка.

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 16:42 
Dmitriy40 в сообщении #1702973 писал(а):
Согласен: до 1e9 ускоряет с 16.5с до 14.2с.

Не устаю удивляться прогрессу гаджетов. У меня в телефоне 2023 года выпуска, до 1е9 считается 10.4с, в планшете 2022 года выпуска -- 13.4с

-- 23.09.2025, 16:43 --

Dmitriy40 в сообщении #1702982 писал(а):
В PARI 2*p/3 вычисляется целочисленно (в рациональных числах).

А, точно!

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 16:46 
Аватара пользователя
Спасибо. Лет 100 Экселем не пользовался.

Структура троек получается такой:

Код:
  1-e   2-e   3-e       qr mod 12
   qr    2p    3p               1
   3p    2p    qr              11

Причём надо помнить, что простые $p$ конечно различны, как и простые $q$ и $r$, но обычно это не указывается индексами, ибо длинные цепочки тогда трудно изобразить. Мировой рекорд — аж 20 последовательных натуральных чисел.

Кстати, в графе "Полупрост" я как раз считаю количество куаров.

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 17:27 
Yadryara
Вы выражаетесь очень как бы это сказать... загадочно (cryptic).
В частности, я считываю "2p" как "два умножить на p" и сходу не понимаю как числа 2p и 3p могут идти одно за другим кроме случая p=1, но в этом случае я уже не понимаю как перед числами 2,3 может быть какое-то число qr кроме как если q=1, r=1.
Так что я далее игнорирую тут сутевую чссть, если мне сразу непонятно кто на ком стоял, как и в темах про кортежи, включая обсуждение как пристроить первую гипотезу Харди-Литтлвуда для их поиска.
Просто сообщаю, для вашего сведения так сказать.

 
 
 
 Re: Как писать быстрые программы
Сообщение23.09.2025, 17:42 
Аватара пользователя
wrest

То есть я специально отдельно оговорил, что числа различны и на индексах экономим, а Вы это спокойно проигнорили ?

wrest в сообщении #1702988 писал(а):
В частности, я считываю "2p" как "два умножить на p" и сходу не понимаю как числа 2p и 3p могут идти одно за другим кроме случая p=1,

Вот, болдом и шрифтом выделяю:

Yadryara в сообщении #1702984 писал(а):
Причём надо помнить, что простые $p$ конечно различны,

То есть подразумевается более корректная запись: $2p_1$ и $3p_2$.

 
 
 [ Сообщений: 63 ]  На страницу Пред.  1, 2, 3, 4, 5  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group