2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1 ... 27, 28, 29, 30, 31, 32, 33 ... 54  След.

А вам пакет PARI/GP интересен?
Да 83%  83%  [ 58 ]
Нет 6%  6%  [ 4 ]
Не уверен(а) 11%  11%  [ 8 ]
Всего голосов : 70
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.03.2022, 18:24 


05/09/16
12041
waxtep
Возможно, сначала преобразование вектора во множество (убирает повторения и сортирует вектор), а затем уже операции над множествами.
Два множества по 10000 элементов вычлись мгновенно
? sv1=Set(vector(10000,i,random()));
? ##
*** last result computed in 4 ms.
? sv2=Set(vector(10000,i,random()));
? ##
*** last result computed in 5 ms.
? sv3=setminus(sv1,sv2);
? ##
*** last result computed in 0 ms.
?

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


20/08/14
11709
Россия, Москва
Посортируйте вектора (vecsort), а потом setminus отрабатывает за доли секунды даже на пятимиллионных векторах:
Код:
? default(parisize,6*10^8)
  ***   Warning: new stack size = 600000000 (572.205 Mbytes).
? a=primes([1,10^8]); b=vector(#a,i,i*6+1);
time = 922 ms.
? c=setminus(b,a);
time = 281 ms.
? #a
%1 = 5761455
? #c
%2 = 4700720
?

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


07/01/16
1607
Аязьма
Ой-ой-ой, отставить панику, это я один из векторов (совершенно неожиданно) формирую за какое-то безумное время. Сам расчет элементов менее минуты, но созданный мною наворот из concat и if почему-то безумно замедляет. Пока вопрос снимаю

-- 30.03.2022, 18:57 --

Dmitriy40 в сообщении #1551440 писал(а):
отрабатывает за доли секунды даже на пятимиллионных векторах
Да, я что-то не то делаю при формировании одного из векторов, пардон, буду разбираться.

-- 30.03.2022, 19:15 --

Вот в чем закавыка: закомментированный вариант функции sm3 безумнейше тормозит:
Используется синтаксис Matlab M
sm(n)={if(n<2, return(0)); while(1-isprime(n), n=n-numdiv(n)+1); return(n)};

\\sm3(s,f)={ng=matrix(1,2); for(k=s, f, if((g=sm(k))<k, ng=concat(ng,[k,g]))); return(ng)};

sm3(s,f)={ng=matrix(f-s+1,2); for(k=s, f, ng[k-s+1,1]=k;); for(k=s, f, if((g=sm(k))<k,ng[k-s+1,2]=g;)); return(ng)};

sm4(s,f)={ng=sm3(s,f); pp=Set(ng[,2]); return(pp)};

sm5(s,f)={p0=primes([1,f]); pp=sm4(s,f); sgp=setminus(p0,pp) ; return(sgp)};
В то время как раскоменнтированый, хоть и выглядит несимпатично, отрабатывает быстро и дальше проблем тоже нет. В чем здесь некорректность, работа с неинициализированной памятью, или какая-то более банальная ошибка?

-- 30.03.2022, 19:19 --

wrest в сообщении #1551437 писал(а):
Два множества по 10000 элементов вычлись мгновенно
Да, не в том месте проблема, а ранее, тоже честно говоря для меня загадочная (дополнил свой последний комментарий)

-- 30.03.2022, 19:45 --

Или, если без попробовать без индусского кода, как-то так:
Используется синтаксис Matlab M
sm(n)={if(n<2, return(0)); while(1-isprime(n), n=n-numdiv(n)+1); return(n)};

sm5(s,f)={p0=primes([1,f]); pp=Set(vector(f-s+1,k,if((g=sm(s+k-1))<s+k-1,g,0))); sgp=setminus(p0,pp) ; return(sgp)};

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


07/01/16
1607
Аязьма
Возник такой еще вопрос, пытаюсь запустить один из примеров рисовалки из хэлпа, но получаю ошибку:
Код:
(01:35) gp > ploth(X=-1,1, sin(1/X), "Recursive")
  ***   at top-level: ploth(X=-1,1,sin(1/X),"Recursive")
  ***                              ^---------------------
  *** sin: precision too low in mpcosm1.
Насколько я смог понять, mpcosm1 - внутренняя функция, на которую опирается вычисление косинусов и синусов, но... кхм как с ней бороться и что я делаю не так, - непонятно

-- 31.03.2022, 01:52 --

Думал, что проблема в окрестностях нуля, но нет - около единицы почему-то:
Код:
(01:50) gp > ploth(X=-1,1-1e-19, sin(1/X), "Recursive")
%16 = [-1.0000000000000000000, 1.0000000000000000000, -0.9999985392207986212, 0.9999985392207986212]
(01:50) gp > ploth(X=-1,1-1e-20, sin(1/X), "Recursive")
  ***   at top-level: ploth(X=-1,1-1e-20,sin(1/X),"Recursive")
  ***                                    ^---------------------
  *** sin: precision too low in mpcosm1.

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


20/08/14
11709
Россия, Москва
waxtep
Вызываете синус со слишком большим аргументом, и PARI не хватает точности представления чисел чтобы получить остаток от деления на $2\pi$.
И это не лечится.
Исключите слишком близкие к нулю координаты по X (ближе чем примерно $10^{-30}$ для стандартной точности в 38 цифр). Например так:
Код:
? ploth(X=-1,1, if(abs(X)>10^-30, sin(1/X), 0.1), "Recursive")
[-1.0000000000000000000, 1.0000000000000000000, -0.9999985392207986212, 0.9999985392207986212]

Или перейдите в поле рациональных чисел (не знаю как), в нём синус должен вычисляться точнее.

Проблема около нуля: когда оно остановилось по ошибке наберите X и посмотрите чему он равен:
Код:
? ploth(X=-1,1-10^-29, sin(1/X), "Recursive")
  ***   at top-level: ploth(X=-1,1-10^-29,sin(1/X),"Recursive")
  ***                                     ^---------------------
  *** sin: precision too low in mpcosm1.
  ***   Break loop: type 'break' to go back to GP prompt
break> X
-5.000000001161704870 E-30
break> 1/X
-1.9999999995353180522 E29
break>

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


07/01/16
1607
Аязьма
Dmitriy40 в сообщении #1551472 писал(а):
Проблема около нуля: когда оно остановилось по ошибке наберите X и посмотрите чему он равен:
Тоже так подумал, но, реально проблема почему-то около единицы, - дополнил свой предыдущий комментарий примером
Dmitriy40 в сообщении #1551472 писал(а):
Код:
*** Break loop: type 'break' to go back to GP prompt
break> X
А как Вы такую штуку делаете? Это надо какой-то параметр отладки выставить?

-- 31.03.2022, 02:12 --

Код:
ploth(X=-1,1, if(abs(X)>10^-30, sin(1/X), 0.1), "Recursive")
О, спасибо! Так работает

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


20/08/14
11709
Россия, Москва
waxtep в сообщении #1551473 писал(а):
Тоже так подумал, но, реально проблема почему-то около единицы, - дополнил свой предыдущий комментарий примером
Вы ошибаетесь, беда около нуля, за ноль в положительные числа он вообще не заходит. А то что Вы туда добавили вещественное число лишь чуточку сместило точку возникновения ошибки.
waxtep в сообщении #1551473 писал(а):
А как Вы такую штуку делаете? Это надо какой-то параметр отладки выставить?
У меня изначально так работает. Но вообще да, выставьте default(breakloop,1) и будет Вам счастье (кстати сам не знал про эту возможность).
Текущие параметры можно посмотреть по \d.

-- 31.03.2022, 02:21 --

waxtep в сообщении #1551473 писал(а):
О, спасибо! Так работает
Зацените график если вместо 0.1 поставить просто 0 ... :mrgreen: О причинах не спрашивайте, не знаю.

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


07/01/16
1607
Аязьма
Dmitriy40 в сообщении #1551474 писал(а):
выставьте default(breakloop,1) и будет Вам счастье
Йес! Спасибо
Dmitriy40 в сообщении #1551474 писал(а):
Зацените график если вместо 0.1 поставить просто 0 ... :mrgreen: О причинах не спрашивайте, не знаю.
Жуть :-) ну, они пишут, что "Although plotting is not even a side purpose of PARI..."
Кстати, эту беду можно еще вот так победить, поменять количество точек для рекурсивного рисунка на нечетное, тогда мы видимо успешно промахиваемся мимо нуля:
Код:
(02:25) gp > ploth(X=-1,1, sin(1/X), "Recursive",7)
%1 = [-1.0000000000000000000, 1.0000000000000000000, -0.9999955771745117072, 0.9999548190565817896]
(02:26) gp > ploth(X=-1,1, sin(1/X), "Recursive",8)
  ***   at top-level: ploth(X=-1,1,sin(1/X),"Recursive",8)
  ***                              ^-----------------------
  *** sin: precision too low in mpcosm1.


-- 31.03.2022, 02:36 --

Вот она, попалась:
Код:
break> ploth(X=-1,1, sin(1/X), "Recursive",9)
  ***   at top-level: ploth(X=-1,1,sin(1/X),"Recursive",10)
  ***                              ^------------------------
  ***   in function sin: ploth(X=-1,1,sin(1/X),"Recursive",9)
  ***                                      ^------------------
  *** _/_: impossible inverse in divrr: 0.E-38.
  ***   Break loop: type 'break' to go back to GP prompt
break[2]> X
0.E-38


-- 31.03.2022, 02:44 --

Dmitriy40 в сообщении #1551474 писал(а):
Зацените график если вместо 0.1 поставить просто 0 ...
Это видимо вот что:
мануал писал(а):
For instance you should never plot recursively an odd function in a symmetric interval around 0. Try
Код:
ploth(x = -20, 20, sin(x), "Recursive")

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


20/08/14
11709
Россия, Москва
waxtep в сообщении #1551475 писал(а):
Код:
break[2]>
Не забывайте теперь после каждой ошибки выходить на самый верхний уровень командами break, вот тут этого не сделали и запустили новую команду в контексте запущенной предыдущей. Могут появиться самые разные неприятные побочные эффекты.
А просто нажатие Enter приведёт к продолжению выполнения прерванной (например по Ctrl+C) программы/функции. Например можно поменять какие-то переменные и продолжить выполнение дальше.

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


07/01/16
1607
Аязьма
Dmitriy40, спасибо! Будем ломать и строить :-)

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


20/08/14
11709
Россия, Москва
Камрады, кто-то может пояснить что за хрень иногда происходит и как её побороть?
Код:
  ***   at top-level: .................;f=alarm(1,factor(x));
  ***                                             ^----------
  *** factor: user interrupt after 1h, 1min, 57,270 ms
  ***   Break loop: <Return> to continue; 'break' to go back to GP prompt
break>
  ***   at top-level: ..............;alarm(3,s[d]=numdiv(x));
  ***                                             ^----------
  *** numdiv: user interrupt after 3h, 35min, 58,240 ms
  ***   Break loop: <Return> to continue; 'break' to go back to GP prompt
break>
Если текст вдруг съедет, то стрелка указывает на factor и numdiv.

В упор не понимаю почему user interrupt, если никакой юзер там и близко ничего не делал, а вылетает программа сама и на разных числах. Причём по Enter вполне нормально продолжает считать дальше, т.е. ошибка не критическая. И по всему ошибка должна быть e_ALARM, а вовсе не e_USER (e_ALARM я дальше сам обрабатываю).
Если в остановившимся PARI руками ввести ровно ту же команду factor или numdiv вместе с alarm, то возникает совершенно правильная e_ALARM и никаких user interrupt нет и в помине.
Возникает спонтанно, повторный запуск тех же вычислений проходит нормально.
От версии PARI не зависит, проверил и на самой последней.

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


11/12/16
13833
уездный город Н
Dmitriy40
Что у Вас с настройками сна и гибернации? Не связан ли "user interrupt" с попытками компа уйти в сон или гибернацию?

(Оффтоп)

при запуске скриптов от VAL столкнулся с подобным:
1. При переходе в сон комп действительно засыпал. Но при выходе из сна - счет продолжался.
2. (Предположительно) при переходе в гибернацию счет ВНЕЗАПНО завершался. Так как PARI/GP запускал через ярлык, окна с командной строкой закрывались, и диагностика терялась.
Что интересно, при расчете 15-12 с использованием "ускорителей" такого не было (комп не пытался уснуть или впасть в гибернацию, хотя настройки такие были). Предполагаю это связано с тем, что в этом случае происходило регулярное обращение к HDD.

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


20/08/14
11709
Россия, Москва
Ни в сон ни в спячку сам не уходит, он работает 24/7/365 (кроме вычислений крутятся ещё другие сервисы).
При останове в одном потоке в остальных счёт продолжается (пока тоже не вылетят, например за ночь вылетели три потока из 4-х, с разницей более чем в 5ч).
Главное не понимаю почему не ту ошибку вываливает, или даже вообще не ошибку (ошибки я как раз перехватываю и обрабатываю). Смахивает на глюк CPU/RAM или самого PARI.

Бесит меня этот глюк, один поток 11ч проработал, а другой трижды за час вылетел. :-(

По скриптам VAL — так там же включен лог, в нём всё должно быть.

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


16/08/05
1153
Dmitriy40
Может включение дэбага подскажет что происходит: ключи \g, \gm, \gf, \h?

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


20/08/14
11709
Россия, Москва
Попробую сейчас запустить с включенным дебагом ... Но учитывая что глюка можно ждать от десятка минут до десятка часов ...
Пытался я включить дебаг для тестового запуска этих команд, но глюка не произошло, а непонятной инфы вывалилось море.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 809 ]  На страницу Пред.  1 ... 27, 28, 29, 30, 31, 32, 33 ... 54  След.

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



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

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


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

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