2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1 ... 23, 24, 25, 26, 27, 28, 29  След.

А вам пакет PARI/GP интересен?
Да 84%  84%  [ 54 ]
Нет 5%  5%  [ 3 ]
Не уверен(а) 11%  11%  [ 7 ]
Всего голосов : 64
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение19.11.2020, 21:44 
Заслуженный участник


20/08/14
8835
Россия, Москва
wrest в сообщении #1493325 писал(а):
Если это ноутбук (ограниченный термопакет), то норм,
Нет, стационарный. И частоты не меняются.
wrest в сообщении #1493325 писал(а):
Я не понял почему у вас многопоточная версия медленнее выполняет однопоточные функции, мне это ни разу не очевидно.
Заметьте что Ваш код выполняется одинаково. Видимо всё дело какие именно функции, похоже многие из них не имеют однопоточных вариантов (например внутренние функции выделения/освобождения памяти) и потому даже в однопоточном режиме возникают накладные расходы на реентабельность. Например у Вас всё время занимает factor(), у меня же много преобразований длинного числа в массив цифр и обратно, других операций с массивами, а это всё память и куча (heap), а с ней работать параллельно тяжело.

StaticZero в сообщении #1493327 писал(а):
Amdahl?
Похоже. Потому и не слишком нравится реализация многопоточных вычислений в PARI. Просто в использовании, где-то даже универсально, но медленно. Во всяком случае для моего круга задач.

(Маленький пример не про MPI)

Несколько лет назад, когда магические квадраты упорно считал, задумал запустить счёт на всех компах в локалке, но изучать MPI и прочие стандартные решения было влом, сделал чисто по колхозному: программы обращались по сети в фиксированную папку на сервере и опрашивали файлик со списком заданий, выбирали себе следующее и обновляли файлик, при этом почти вся забота о разграничении и синхронизации доступа перекладывалась на ОС. Дискретность заданий была в районе часа-двух и это прекрасно работало. Даже при сбоях, после перезапуска всё поднималось само и пересчитывало сбойные задания. Зато каждое задание обсчитывалось фактически однопоточно, просто запускалось нужное количество экземпляров программ на компах, причём их можно было смело убивать когда мешали и запускать снова. В общем колхоз, но удобно и быстро написано. И очень маленький оверхед, ведь внутри всё работало однопоточно.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 16:25 
Аватара пользователя


12/10/16
621
Almaty, Kazakhstan
когда вычисляю на Pari/GP:
1)
Код:
prodeuler(k=2, precprime(11), k)
%42 = 2310.000000000000000000000000

2)
Код:
gcd(2310, 15)
%43 = 15

3)
Код:
gcd(prodeuler(k=2, precprime(11), k), 15)
%44 = 1

Почему в третьем случае получается единица, и как получить 15 ?

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 16:40 


05/09/16
9424
Soul Friend в сообщении #1512157 писал(а):
Почему в третьем случае получается единица,

Потому же, почему и
Код:
? gcd(2310.0, 15)
%1 = 1

Soul Friend в сообщении #1512157 писал(а):
и как получить 15 ?
Целые подать на вход gcd()

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 16:47 
Аватара пользователя


12/10/16
621
Almaty, Kazakhstan
а усечь нули можно как нибудь?

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 16:48 


05/09/16
9424
Soul Friend в сообщении #1512163 писал(а):
а усечь нули можно как нибудь?

Да, например так:
Код:
? gcd(floor(prodeuler(k=2, precprime(11), k)), 15)
%1 = 15

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 16:53 
Аватара пользователя


12/10/16
621
Almaty, Kazakhstan
wrest
ооо, благодарю, а я пробовал $abc()$, не получилось.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 16:57 


05/09/16
9424
Soul Friend в сообщении #1512165 писал(а):
ооо, благодарю, а я пробовал $abc()$, не получилось.

abs() наверное. Так это модуль, для нецелых аргументов он возвращает нецелые результаты.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 17:10 
Заслуженный участник


20/08/14
8835
Россия, Москва
Вместо floor надёжнее round или floor(0.5+...), всё же погрешность в $0.5$ на много порядков менее вероятна чем погрешность в $10^{-38}$ или сколько там настроена точность вычислений. Разница может возникнуть если prodeuler вдруг выдаст число типа $2309.999999999999999$, не должна, но вдруг для каких-то (больших) аргументов ...

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение31.03.2021, 12:31 
Аватара пользователя


12/10/16
621
Almaty, Kazakhstan
Работает ли gcd() внутри цикла for() ?
Пол дня пытаюсь вычислить короткий код, не работает, if( gcd() ) внутри if-а работает, а когда добавляешь for( if( gcd() ) ) , не вычисляет. Проверил все переменные, запятые(, ;) и скобки(), синтаксический запись кода правильная, да и на выходе должна выдавать значения, но не зависает и ничено не выдаёт.
p.s: внутри gcd() есть переменные от for().

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение31.03.2021, 13:17 
Заслуженный участник


20/08/14
8835
Россия, Москва
Разумеется работает:
Код:
? for(i=1,30,if(gcd(i,30)==1,print1(i," ");););
1 7 11 13 17 19 23 29
Приводите ваш нерабочий код, посмотрим.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение31.03.2021, 14:16 
Аватара пользователя


12/10/16
621
Almaty, Kazakhstan
Код:
for(k=1, 10, my(a=prime(k), b=prime(k+1), c=0); for(m=1, b^2-a^2, if(gcd(floor(prodeuler(x=1, precprime(b^2), x)), a^2+m)==1&&gcd(floor(prodeuler(x=1, precprime(b^2), x)), a^2+m+2)==1, c=c+1)) ; print(a, "; ", c))

Хотел вычислить количества простых близнецов между $a^2$ и $b^2$ проверя на взаимопростоту с праймориалом
Код:
precprime(b^2)#
с помощью
Код:
prodeuler()

где а=prime(k); b=prime(k+1) - две соседи простые числа (не только близнецы).
Ну а "k" перебирается циклом.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение31.03.2021, 15:12 
Заслуженный участник


20/08/14
8835
Россия, Москва
Soul Friend
Ну и почему Вы решили что gcd() не работает? Они очень даже работают, просто в проверяемом интервале нет близнецов имеющих наименьший простой делитель больше чем $b^2$.
Например в интервале $(a^2 \ldots b^2)=(3^2 \ldots 5^2)=(9 \ldots 25)$ все числа (и близнецы и нет, и простые и составные) имеют делители не превосходящие $23$, что делает их не взаимно простыми с $23\#=\operatorname{precprime}(b^2)\#$.
Т.е. Вы просто что-то не то посчитали, а gcd() работают как надо.

Отдельный вопрос что уже для $k=4$ Вы пытаетесь считать $113\#$ и floor ругается на точность вычислений с плавающей точкой (38 знаков не хватает для правильного округления). Потому prodeuler мне и не нравится и предпочитаю праймориалы считать руками (p=1;forprime(i=1,x,p*=i);), так хотя бы сразу гарантированно выдаётся целое число, пусть даже и огроменное.

Ну что вместо for и prime стоит пользоваться специализированными forprime и forstep (нечётные $m$ гарантированно не подходят), а также выносить из цикла вычисления не зависящие от переменной цикла (например праймориала или $a^2$ идя переменной цикла сразу от $a^2$ до $b^2$) — дело ваше конечно, хотите лишних тормозов и вероятности ошибок/опечаток, их и получите.

-- 31.03.2021, 15:27 --

Думаю Вы взяли не тот праймориал, надо было или $b\#$ или $a^2\#$ (в данном случае без разницы, но первый разумеется лучше так как числа меньше), но никак не $b^2\#$.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение31.03.2021, 15:33 
Аватара пользователя


12/10/16
621
Almaty, Kazakhstan
Dmitriy40
да, работает, спасибо.
снизил с precprime(b^2)# на precprime(2*b+2)#

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение31.03.2021, 15:39 
Заслуженный участник


20/08/14
8835
Россия, Москва
Soul Friend
Достаточно и просто $b\#$, precprime не нужно: в диапазоне до $b^2$ (включительно) все составные числа имеют минимум один из делителей не больше $b$ и gcd() его "увидит". А $b$ у Вас и так гарантированно простое.

 Профиль  
                  
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение31.03.2021, 15:46 
Аватара пользователя


12/10/16
621
Almaty, Kazakhstan
Код:
for(k=1, 15, my(a=prime(k), b=prime(k+1), c=0, p=1); forprime(i=1,precprime(2*b+2),p*=i);for(m=1, b^2-a^2, if(gcd(p, a^2+m)==1&&gcd(p, a^2+m+2)==1, c=c+1)) ; print("  ", a, "; ", c))

ну, по пути вычисления я хотел исключить составные с простыми множителями больше $b$, чтобы получить реальное количество простых близнецов.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 428 ]  На страницу Пред.  1 ... 23, 24, 25, 26, 27, 28, 29  След.

Модераторы: maxal, Toucan, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group