2014 dxdy logo

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

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




На страницу Пред.  1 ... 23, 24, 25, 26, 27, 28, 29 ... 55  След.

А вам пакет PARI/GP интересен?
Да 83%  83%  [ 58 ]
Нет 6%  6%  [ 4 ]
Не уверен(а) 11%  11%  [ 8 ]
Всего голосов : 70
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение19.11.2020, 21:44 
wrest в сообщении #1493325 писал(а):
Если это ноутбук (ограниченный термопакет), то норм,
Нет, стационарный. И частоты не меняются.
wrest в сообщении #1493325 писал(а):
Я не понял почему у вас многопоточная версия медленнее выполняет однопоточные функции, мне это ни разу не очевидно.
Заметьте что Ваш код выполняется одинаково. Видимо всё дело какие именно функции, похоже многие из них не имеют однопоточных вариантов (например внутренние функции выделения/освобождения памяти) и потому даже в однопоточном режиме возникают накладные расходы на реентабельность. Например у Вас всё время занимает factor(), у меня же много преобразований длинного числа в массив цифр и обратно, других операций с массивами, а это всё память и куча (heap), а с ней работать параллельно тяжело.

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

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

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

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 16:25 
Аватара пользователя
когда вычисляю на 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 
Soul Friend в сообщении #1512157 писал(а):
Почему в третьем случае получается единица,

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

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

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

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 16:48 
Soul Friend в сообщении #1512163 писал(а):
а усечь нули можно как нибудь?

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

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 16:53 
Аватара пользователя
wrest
ооо, благодарю, а я пробовал $abc()$, не получилось.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 16:57 
Soul Friend в сообщении #1512165 писал(а):
ооо, благодарю, а я пробовал $abc()$, не получилось.

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

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2021, 17:10 
Вместо floor надёжнее round или floor(0.5+...), всё же погрешность в $0.5$ на много порядков менее вероятна чем погрешность в $10^{-38}$ или сколько там настроена точность вычислений. Разница может возникнуть если prodeuler вдруг выдаст число типа $2309.999999999999999$, не должна, но вдруг для каких-то (больших) аргументов ...

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение31.03.2021, 12:31 
Аватара пользователя
Работает ли gcd() внутри цикла for() ?
Пол дня пытаюсь вычислить короткий код, не работает, if( gcd() ) внутри if-а работает, а когда добавляешь for( if( gcd() ) ) , не вычисляет. Проверил все переменные, запятые(, ;) и скобки(), синтаксический запись кода правильная, да и на выходе должна выдавать значения, но не зависает и ничено не выдаёт.
p.s: внутри gcd() есть переменные от for().

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение31.03.2021, 13:17 
Разумеется работает:
Код:
? 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 
Аватара пользователя
Код:
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 
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 
Аватара пользователя
Dmitriy40
да, работает, спасибо.
снизил с precprime(b^2)# на precprime(2*b+2)#

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение31.03.2021, 15:39 
Soul Friend
Достаточно и просто $b\#$, precprime не нужно: в диапазоне до $b^2$ (включительно) все составные числа имеют минимум один из делителей не больше $b$ и gcd() его "увидит". А $b$ у Вас и так гарантированно простое.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение31.03.2021, 15:46 
Аватара пользователя
Код:
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$, чтобы получить реальное количество простых близнецов.

 
 
 [ Сообщений: 825 ]  На страницу Пред.  1 ... 23, 24, 25, 26, 27, 28, 29 ... 55  След.


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