2014 dxdy logo

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

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




На страницу Пред.  1 ... 18, 19, 20, 21, 22, 23, 24 ... 55  След.

А вам пакет PARI/GP интересен?
Да 83%  83%  [ 58 ]
Нет 6%  6%  [ 4 ]
Не уверен(а) 11%  11%  [ 8 ]
Всего голосов : 70
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение04.07.2019, 22:31 
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 
Аватара пользователя
wrest, похоже, надо заменить listkill(M) на kill(M), тем более, что про первую говорят obsolete.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение04.07.2019, 22:59 
maxal в сообщении #1403272 писал(а):
тем более, что про первую говорят obsolete.

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

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение16.07.2019, 10:55 
Отвечаю на свой вопрос (см. 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 
Если я правильно понимаю, то после local() все определённые в ней локальные переменные будут видны в любой функции, вызванной из данной. Даже не обязательно определённых лишь в этой же. Т.е. видимость локальных переменных определяется не синтаксисом, как с my(), а динамикой (дерева) вызовов. Интересное отличие.
Вызов функции по self мне кажется связан не с видимостью переменных, а с определением функции внутри другой функции и анонимным рекурсивным вызовом.

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

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение16.07.2019, 12:40 
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 
Хотел бы обратить внимание на способ поиска экстремума функции.
В 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 
 i  Сообщение karonetua отделено в Карантин.:«Из: интерактивный курс: введение в программирование на PARI/GP»

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение17.09.2019, 14:45 
Аватара пользователя
Поставил, запустилось командой gp (linux). Работает, но что и как пока не понимаю. Однострочные команды, приведенные здесь, выполнят с таким же выводом. Многострочный код как запустить? Если вводить построчно, работает. Можно ли записать код в файл и потом запустить?

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение17.09.2019, 14:54 
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 
Я часто запускаю файл командой gp.exe -q file.gp (под виндой понятное дело). "-q" для подавления лишней инфы при старте. Удобно тем что если в конце файла есть \q, то программа из файла отрабатывает и возвращается обратно в консоль. И можно пользоваться любым текстовым редактором вместо уродского встроенного редактора строки. И можно перенаправлять вывод в файл или дальше по конвейеру.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение17.09.2019, 15:17 
Аватара пользователя
Спасибо. Получилось, как написал wrest .
А с комплексными числами эта система работает?

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение17.09.2019, 15:20 
Snegovik в сообщении #1415524 писал(а):
А с комплексными числами эта система работает?

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

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

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение23.10.2019, 20:35 
Здравствуйте, а есть ли возможность в этом 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 

(Оффтоп)

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

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

 
 
 [ Сообщений: 825 ]  На страницу Пред.  1 ... 18, 19, 20, 21, 22, 23, 24 ... 55  След.


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