2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1 ... 18, 19, 20, 21, 22  След.

А вам пакет PARI/GP интересен?
Да 85%  85%  [ 46 ]
Нет 4%  4%  [ 2 ]
Не уверен(а) 11%  11%  [ 6 ]
Всего голосов : 54
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение04.07.2019, 22:31 


05/09/16
7079
maxal
Попробовал. Переменная M остается наполненной после завершения работы функции:
? kill(M)
? p(70,30)
time = 100 ms.
%17 = 3910071
? #M
%18 = 0
? p(70,30)
time = 100 ms.
%19 = 3910071
? #M
%20 = 1292

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


11/01/06
5430
wrest, похоже, надо заменить listkill(M) на kill(M), тем более, что про первую говорят obsolete.

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


05/09/16
7079
maxal в сообщении #1403272 писал(а):
тем более, что про первую говорят obsolete.

Про global() говорят тоже самое :)
Да, kill() убивает. Но только (ессно) если переменной не существовало до вызова функции. Если была, то она наполняется.

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


05/09/16
7079
Отвечаю на свой вопрос (см. post1403201.html#p1403201 ).
Ответ получен путем переписки с разработчиками pari/gp в пользовательском списке рассылки.

Вот текст который работает: "главная" функция p() содержит в себе вспомогательную функцию memo_p(). Вспомогательная работает рекурсивно, но при этом использует переменную M (в которой происходит мемоизация), созданную в "главной" функции. Собственно рекурсивный вызов делается не по имени функции а анонимно, путем вызова self(). А затем уже, после описания рекурсивной функции memo_p() происходит её вызов в теле главной функции p().

Код:
p(n,k) =
  {
    local(M = Map()); /* Do not use my() here, use local() !! */
    my(memo_p = (N,K)-> my(res);
       if(N==0 && K==0,
          return(1));
       if(K<1,
          return(0)); 
       if(mapisdefined(M,[N,K],&res),
          return(res));
       if(K>=N,
          res=numbpart(N);
          mapput(M,[N,K],res);
          return(res));
       res=self()(N,K-1)+self()(N-K,K);
       mapput(M,[N,K],res);
       return(res));
    memo_p(n,k);
  }

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


20/08/14
6076
Россия, Москва
Если я правильно понимаю, то после local() все определённые в ней локальные переменные будут видны в любой функции, вызванной из данной. Даже не обязательно определённых лишь в этой же. Т.е. видимость локальных переменных определяется не синтаксисом, как с my(), а динамикой (дерева) вызовов. Интересное отличие.
Вызов функции по self мне кажется связан не с видимостью переменных, а с определением функции внутри другой функции и анонимным рекурсивным вызовом.

Так что Ваша задумка решается похоже одной лишь local(M=...). Правда не проверял.

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


05/09/16
7079
Dmitriy40 в сообщении #1405310 писал(а):
Так что Ваша задумка решается похоже одной лишь local(M=...). Правда не проверял.

Так проверьте :mrgreen:
Dmitriy40 в сообщении #1405310 писал(а):
Если я правильно понимаю, то после local() все определённые в ней локальные переменные будут видны в любой функции, вызванной из данной.
Да, поэтому сперва мне предложили решение в виде комплекта из двух функций. Одна - рекурсивная, но использует внешнюю по отношению к ней переменную (массив накопленных решений) с конкретным именем (М). А вторая - в которой определяется переменная M с массивом накопленных значений как local() и затем вызывается рекурсивная.
То есть, примерно так:

Вызываемая (рекурсивная) функция
Код:
memo_p(n,k)=
{
my(z); /* в z будет результат */
/* несколько строк пропущены */
if(mapisdefined(M,[n,k],&z),return(z)); /* проверка во _внешней_ по отношению к функции memo_p() переменной M */
z=memo_p(n,k-1)+memo_p(n-k); /* рекурсивный вызов */
mapput(M,[n,k],z); /* запоминание промежуточного результата */
return(z)
}

Вызывающая (нерекурсивная функция):
Код:
p(n,k)=
{
local(M=Map());
memo_p(n,k)
}

Но это "не чистое" решение, поскольку в этом комплекте рекурсивная функция memo_p() должна использовать в теле конкретное имя "внешней" переменной M. Упрятывание одной функции в другую разрешает эту несовершенность.

P.S. В версии 2.12 будет реализовано использование ссылок на аргументы, т.е. можно будет передавать в функцию не значение (копию) аргумента, а ссылку на него (и таким образом менять значение аргумента внутри вызываемой функции, чего сейчас делать нельзя в пользовательских функциях -- при вызове пользовательской функции туда передается копия аргумента, её можно менять, но при выходе из функции эта копия уничтожается). Правда, для указания на то что это ссылка, а не сама переменная, будет использоваться тильда, а не амперсанд (амперсанд используется сейчас для указания на то, что передается ссылка в некоторых "системных" функциях). Так что гибкость программирования увеличивается, что хорошо, но немного боязно.

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


05/09/16
7079
Хотел бы обратить внимание на способ поиска экстремума функции.
В pari/gp имеется функция solve() которая ищет ноль выражения в заданном диапазоне.
А также, обратите внимание что символ ' обозначает производную.

Таким образом, вызов solve(x=a,b,f'(x)) ищет аргумент экстремума выражения (функции) на заданном отрезке. Ну а f(solve(x=a,b,f'(x)) ищет сам экстремум.

Пример.
? f(x)=2*(x^(2)+(2*x^(2)*(8-9*x))/(7*x^(3)+16*x^(2)-8*x+8))+(1-2*x)^(2)+2*(1-2*x)^(2)*(8-9*(1-2*x))/(7*(1-2*x)^(3)+16*(1-2*x)^(2)-8*(1-2*x)+8);
? solve(x=0,1,f'(x))
%1 = 0.15140133168961972027583311014532766597193697748664
? f(solve(x=0,1,f'(x)))
%2 = 0.75009871688425136211871520102751169120961747839512
? f''(solve(x=0,1,f'(x)))
%3 = 9.2475338478079074180576283901242551429276360810757


Так что для поиска экстремумов не надо дописывать ничего, производная считается (численно) встроенным способом. Тип экстремума определяем по знаку второй производной (которую вычисляем добавляя два штриха '' после имени функции).
Очень удобно, я считаю!

P.S. Чтобы solve() работала, на концах интервала функция должна иметь разные знаки.

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


09/05/12
19252
Кронштадт
 i  Сообщение karonetua отделено в Карантин.:«Из: интерактивный курс: введение в программирование на PARI/GP»

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


30/04/19
127
Поставил, запустилось командой gp (linux). Работает, но что и как пока не понимаю. Однострочные команды, приведенные здесь, выполнят с таким же выводом. Многострочный код как запустить? Если вводить построчно, работает. Можно ли записать код в файл и потом запустить?

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


05/09/16
7079
Snegovik в сообщении #1415521 писал(а):
Можно ли записать код в файл и потом запустить?

Можно, см. команду read или \r

gp > ?? read

(Оффтоп)

read({filename}):

Reads in the file filename (subject to string expansion). If filename is omitted, re-reads the last file that was fed into
gp. The return value is the result of the last expression evaluated.

If a GP binary file is read using this command (see Section se:writebin), the file is loaded and the last object in the file
is returned.

In case the file you read in contains an allocatemem statement (to be generally avoided), you should leave read instructions
by themselves, and not part of larger instruction sequences.

Variants. readvec allows to read a whole file at once; fileopen followed by either fileread (evaluated lines) or filereadstr
(lines as non-evaluated strings) allows to read a file one line at a time.

The library syntax is GEN gp_read_file(const char *filename).

gp >

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


20/08/14
6076
Россия, Москва
Я часто запускаю файл командой gp.exe -q file.gp (под виндой понятное дело). "-q" для подавления лишней инфы при старте. Удобно тем что если в конце файла есть \q, то программа из файла отрабатывает и возвращается обратно в консоль. И можно пользоваться любым текстовым редактором вместо уродского встроенного редактора строки. И можно перенаправлять вывод в файл или дальше по конвейеру.

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


30/04/19
127
Спасибо. Получилось, как написал wrest .
А с комплексными числами эта система работает?

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


05/09/16
7079
Snegovik в сообщении #1415524 писал(а):
А с комплексными числами эта система работает?

Наберите sqrt(-1)

P.S. Рекомендую открыть и ознакомиться с https://pari.math.u-bordeaux.fr/pub/par ... efcard.pdf

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


23/10/19
3
Здравствуйте, а есть ли возможность в этом PARI/GP обрезать числа и записать в файл? Например записать, только первые 2,3,4...1000,2000,3000 итд цифры степеней 2, for(i=0,1048576, write("c:/file.txt",2^i))

Или он, как в python, будет скорость записи терять при преобразовании в str?

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


27/04/09
26010

(Оффтоп)

Что значит «как в Python»? Может, это проблема алгоритма, а не языка самого по себе.

(Если решите на это отвечать, лучше создать новую тему, чтобы тут не мешало. :-))

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 329 ]  На страницу Пред.  1 ... 18, 19, 20, 21, 22  След.

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



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

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


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

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