2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1 ... 33, 34, 35, 36, 37, 38, 39 ... 54  След.

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


05/09/16
12067
waxtep в сообщении #1571716 писал(а):
В общем, My(), oh, my(), программируй, не зевай!

Да, но однажды мне понадобилось и local(). Там сложный случай был :) Надо было чтобы процедура выполнялась рекурсивно, но запоминала уже достигнутые результаты, пока полностью не выполнится, и потом бы достигнутое удаляло. my() ограничивает область видимости самой процедурой и не позволяет спускасть переменные вниз, вызываемым процедурам. Также, в PARI не передачи параметров ссылками (кроме отдельных случаев во встроенных функциях). Поэтому понадобилась хитрость с local(). Разработчики подсказали.
Вот тут: post1405301.html#p1405301

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


13/08/08
14495
моделируется совпадение числа орлов при 3 и 5 бросаниях монеты
{N=100000; k=0;
for( i=1,N,
if(random(2)+random(2)+random(2)
== random(2)+random(2)+random(2)+random(2)+random(2), k++));
print(k," ",N," ")}

можно ли без циклов просуммировать n раз random(2)?

waxtep, спасибо!

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


07/01/16
1612
Аязьма
gris в сообщении #1571722 писал(а):
можно ли без циклов просуммировать n раз random(2)?
Можно так: vecsum(vector(n,i,random(2)))

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


05/09/16
12067
gris в сообщении #1571722 писал(а):
можно ли без циклов просуммировать n раз random(2)?

n=1000;x=sum(i=1,n,random(2))
Тут n количество слагаемых, т.е. sum(i=1,1,random(2)) - одно слагаемое.
А я как-то подзабыл. Сумма же будет распределена по Пуассону, да? Ну если надо много складывать, может как-то укоротить можно, не складывая, а формулу придумать? Это конечно читерство будет, но мало ли :)

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


13/08/08
14495
wrestПо-моему, по Гауссу, нормально. Да хочется проверить на натурных испытаниях и красиво :-)

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


13/08/08
14495
Вот забавное: дан нулевой вектор длиной N. Внутрь него помещается единичка и на каждом шаге случайно смещается на один шаг в соседнюю позицию.

{N=7;A=vector(N);n=random(N)+1; A[n]=1;
for(i=1,100, for(j=1,N, print1 (A[j])); print(" ");
A[n]=0; if(random(2)==0,n=n-1,n=n+1);
if(n==0,n=2,n==N+1,n=N-1); A[n]=1;
)}
1000000
0100000
1000000
0100000
0010000
0100000
1000000
0100000
. . .

Вроде бы работает, но как лучше? Хорошо ли такое использование If или лучше расписывать?
Можно ли в PARI/GP организовать простенький ввод с монитора некоторого числа в ответ на запрос в имеющемся цикле?
надеюсь на подсказки :oops:

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


05/09/16
12067
Не очень понятен вопрос. Остаётся ли он тем же, если блуждать должна не единичка а скажем пятерка? В чем задача? Печатать вектор на каждом шаге?

Ввод с клавиатуры
? print1("Enter a:");a=input();
Enter a:789

? print(a)
789
?

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


13/08/08
14495
wrest, спасибо. Конечно же, ввод с клавиатуры. Причём, смотрел же в мануал и видел input, но думал, что это из файла :oops:
Всё работает, как хотелось.
{N=3;A=vector(N);n=random(N)+1; A[n]=1;
for(i=1,12, print("enter ckeck position:");
m=input();
if (m<1 || m>N, print("incorrect position not in 1 to ",N);break);
if(m==n, print("you won at step ",i); break);
A[n]=0; if(random(2)==0,n=n-1,n=n+1);
if(n==0,n=2,n==N+1,n=N-1); A[n]=1;
)}

Мне неловко обсуждать здесь саму задачу, а не чисто PARI, хотя цель была именно в реализации именно на нём них. Ну разве чуть-чуть. Единичка это просто индикатор.
Вот игра: некто ловит единичку, которая бегает по массиву.
Надо поймать за минимум шагов. Что-то знакомое, но не помню :-( . Если ячеек одна, то победа на первом же шаге, для 2 или 3 гарантируется на втором. Я прикинул алгоритм и для четырёх и пяти, но это не для этой темы.
Кстати, а что будет с переменной цикла for после его завершения? Вот эксперимент:
{p=0; for(n=1,4,n++;p++; print(n," ", p)); print(n," ", p)}
2 1
4 2
2 2

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


20/08/14
11783
Россия, Москва
gris в сообщении #1572433 писал(а):
Кстати, а что будет с переменной цикла for после его завершения?
Восстановит своё глобальное значение. Цикл перекрывает её локально, ровно как объявление локальной переменной в блоке/функции. Пример у Вас плохой, n уже было чему-то равно до цикла, вот понятнее:
Код:
? print(n);for(n=1,3,print1(n,", ")); print;print(n)
n
1, 2, 3,
n
? n=33;print(n);for(n=1,3,print1(n,", ")); print;print(n)
33
1, 2, 3,
33
?

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


13/08/08
14495
Dmitriy40, а как правильно проверять, что цикл дошёл до конца?
{E=0;for(i=40,48,
if(issquare(i),E=1;print(i);break));
if(E==0, print("NO"))}

Так как-то тоскливо. Может быть так?
{for(i=40,48,
if(issquare(i),print(i);return(E=1)) );
if(E!==1, print("NO"))}

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


20/08/14
11783
Россия, Москва
gris в сообщении #1572440 писал(а):
а как правильно проверять, что цикл дошёл до конца?
Как правильно не знаю, делаю именно так, через дополнительный флаг. Или отдельный счётчик итераций (который непринципиально отличается от флага).
Return это вроде из другой оперы, для циклов применяются next/break.

Но смотря что вообще делает цикл, а то бывает его можно заменить чем-то другим что будет и быстрее (условной выборкой select или готовыми примитивами типа vecsearch).

Да, и ещё: не стоит привыкать менять переменную цикла в самом цикле for, многие языки такой вольности не позволяют (и не любой цикл в PARI позволит её менять), потом будет труднее переучиваться. Нужен цикл с изменением переменной внутри - делайте цикл сами из while/until.

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


13/08/08
14495
Dmitriy40, согласен. Просто интересно, какие хитрости позволительны. Для изучения синтаксиса. Ну и подразнить обывателей запутанными конструкциями. Всерьёз, конечно, ни к чему.

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


13/08/08
14495
Вот такая штука:
{N=4; H=vector(6);
for(i1=1,N,for(i2=1,N,for(i3=1,N, print1(i1,i2,i3); print();
)))}
111
112
...
443
444

На самом деле мне бы нужен перебор по массиву H неопределённой длины M вида (1111...1) до (MMMM...M)
Ну типа компактного {M=3;forperm(M,H, ... )}, только другого вида :?
Так и хочется запустить цикл в M+1-pичной системе счисления от $(10^M-1)/M \to (10^M-1)$

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


20/08/14
11783
Россия, Москва
Ну так и запустите. Посчитайте аккуратно сколько нужно итераций ($N^M$ или $(N-1)^M$) и переберите их все обычным циклом. А преобразовать линейный номер итерации в правильный для дальнейших вычислений можно заменой системы счисления ii=fromdigits(digits(i,N))+111 (ага, и 111 выразить через M как у Вас). И кажется у Вас попутаны M и N в разных местах.

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


07/01/16
1612
Аязьма
gris в сообщении #1572453 писал(а):
Ну и подразнить обывателей запутанными конструкциями.
Если и это важно, то скромное digits() можно завернуть в более загадочное
Код:
arr_fill(a,n)={return(vector(#a^n,i,vector(n,j,iferr(a[(d=digits(i-1,#a))[j-n+#d]+1],ERR,a[1]))))};
Эта штука возвращает вектор векторов длины n с элементами из входного вектора a:
Код:
(01:19) gp > arr_fill(["a","bb","7"],2)
%1026 = [["a", "a"], ["a", "bb"], ["a", "7"], ["bb", "a"], ["bb", "bb"], ["bb", "7"], ["7", "a"], ["7", "bb"], ["7", "7"]]

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 810 ]  На страницу Пред.  1 ... 33, 34, 35, 36, 37, 38, 39 ... 54  След.

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



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

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


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

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