2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4, 5 ... 54  След.

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


11/01/06
5710
Давно обещался расписать азы программирования на PARI/GP - пора выполнять обещания :lol:
Курс - это конечно громкое слово, у меня даже плана особого нет. Буду писать о том, что первое в голову приходит, но если у вас возникнут вопросы - задавайте, попробую ответить.

Начну, пожалуй, с небольшой рекламы. PARI/GP - это "калькулятор" (математический пакет), изначально ориентированный на теоретико-числовые расчеты, но неплохо справляющийся также с типовыми задачами линейной алгебры, полиномиальными вычислениями, и пр.
Плюсы: небольшой размер, быстрый код, бесплатный и с открытыми исходниками, может использоваться другими программами в качестве библиотеки или же пользователем из текстовой оболочки. Собственно, PARI - это ядро пакета (библиотека), а GP - это интерактивная оболочка. Этот вводный курс будет ориентирован на программирование в GP.

Ссылки на лекции:
Лекция 1, где мы будем знакомиться с оболочкой GP, вычислять $2+2$ и печатать простые числа. (идет в этом сообщении ниже)
Лекция 2, где мы познакомимся с векторами и матрицами и научимся писать небольшие программки.
Мини-лекция о файловом вводе/выводе.
продолжение следует...


Буду предполагать, что с установкой PARI/GP вы справитесь. Берется он на официальной страничке.
Под винду он поставляется в скомпилированном виде, пользователям других систем придется самим компилировать исходники (хотя во многих дистрибутивах линукса PARI/GP тоже присутствует). В общем скачайте и установите его. После этого можно приступать к первой лекции.

Лекция 1, где мы будем знакомиться с оболочкой GP, вычислять $2+2$ и печатать простые числа. :lol:

Итак, запустив PARI/GP, вы увидите примерно такую картинку:
Код:
         GP/PARI CALCULATOR Version 2.4.3 (development CHANGES-1.2161)
          amd64 running linux (x86-64/GMP-4.2.2 kernel) 64-bit version
    compiled: May 13 2008, gcc-4.3.1 20080501 (prerelease) (Debian 4.3.0-4)
                 (readline v5.2 enabled, extended help enabled)

                     Copyright (C) 2000-2008 The PARI Group

PARI/GP is free software, covered by the GNU General Public License, and
comes WITHOUT ANY WARRANTY WHATSOEVER.

Type ? for help, \q to quit.
Type ?12 for how to get moral (and possibly technical) support.

parisize = 8000000, primelimit = 500000
?

Версия и прочая информация в шапке сейчас не имеет никакого значения, так как пользоваться мы будет только базовыми возможностями (хотя имейте в виду, что пакет активно развивается и часто выходят новые версии).
На что сейчас имеет смысл обратить внимание:

для выхода из PARI/GP нужно набрать quit или просто \q и нажать enter;

для получения справки по той или иной команде нужно набрать ? и имя этой команды (ну и нажать enter) - например:
Код:
? ?quit
quit({status = 0}): quit, return to the system with exit status 'status'

Из этой справки по команде quit мы узнаем, что ей, оказывается, можно передавать аргумент, который будет возвращен PARI/GP в родительскую среду в качестве кода возврата. Впрочем, этот аргумент не обязательный и нам он в ближайшее время не понадобится.
Заметьте, что первый ? в коде выше - это промпт самой оболочки (у вас может использоваться другой символ - зависит от настроек), набирать нужно лишь ?quit.

Кстати, если вы просто наберете ? и нажмете enter, то PARI/GP покажет список разделов помощи, выбор конкретного раздела осуществляется командой ?число. Например, ?2 выдаст список функций из раздела 2: CONVERSIONS and similar elementary functions (попробуйте!)
Справка по PARI/GP доступна также на официальном сайте, в удобно отформатированном виде: http://pari.math.u-bordeaux.fr/dochtml/html/ Таким образом, познакомиться с возможностями PARI/GP можно даже его не запуская. :D

Если подробности указанные во внутренней справке вас не устраивают, можно попробовать вызвать расширенную справку по команде ?? - например, ??quit выдаст расширенную справку по команде quit и т.п.

строчка
Код:
parisize = 8000000, primelimit = 500000

говорит нам о том, что под свои нужды PARI/GP захапала 8000000 байтов памяти (примерно 8 мегабайт) и создала список всех простых чисел меньших 500000. Простые числа используются во многих встроенных процедурах и их готовый список ускоряет вычисления.
Если PARI/GP ругнется на нехватку памяти, то можно ей выделить больше памяти командой allocatemem:
Код:
? allocatemem(2^27)
  *** allocatemem: Warning: new stack size = 134217728 (128.000 Mbytes).

а если PARI/GP ругнется на нехватку предвычисленных простых чисел, то увеличить длину списка простых можно командой default(primelimit,N) как в этом примере:
Код:
? primepi(10^6)
  *** primepi: not enough precomputed primes, need primelimit ~ 1000000.
? default(primelimit,10^6)
%1 = 1000000
? primepi(10^6)
%2 = 78498

Здесь мы попытались вычислить функцию $\pi(10^6)$ - количество простых чисел меньших $10^6$, но количества предвычисленных простых нам не хватило для получения результата. После увеличения их количества, искомое значение было вычислено: $\pi(10^6)=78498.$

Из последнего примера также видно, что результаты исполнения команд нумеруются как %1, %2 и т.д. и становятся доступны в таком виде для дальнейших вычислений:
Код:
? 2+2
%3 = 4
? %3*2
%4 = 8


Теперь давайте напечатаем числа от 1 до 10 - для этого познакомимся с конструкцией цикла for( индекс = A, B, тело_цикла ), в которой индекс бежит от целого числа A до целого числа B с шагом 1:
Код:
? for( i = 1, 10, print(i) )
1
2
3
4
5
6
7
8
9
10

А теперь тоже самое в строчку и через запятую:
Код:
? for( i = 1, 10, print1(i,", ") )
1, 2, 3, 4, 5, 6, 7, 8, 9, 10,

Как видно из этих примеров, команда print1() отличается от print() тем, что у нее нет перевода строки в конце.

Напоследок познакомимся со специальным видом цикла - цикл по простым числам:
forprime( индекс = A, B, тело_цикла ), в котором индекс бежит по всем простым числам в отрезке [A,B]:
Код:
? forprime( i = 1, 100, print1(i,", ") )
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,

Здесь мы напечатали все простые в пределах первой сотни.

На этом первую лекцию будем считать оконченной. Вопросы?

 Профиль  
                  
 
 
Сообщение20.05.2008, 17:21 
Заслуженный участник
Аватара пользователя


03/03/06
648
maxal

спасибо за знакомство с программой.

По лекции у меня вопросов нет, наверное, потому, что я эту программу не ставил пока.

Но у меня есть принципиальный вопрос --- зачем она нужна? Поясню. Когда я начинал использовать системы компьютерной математики, начал с Maple, то это как, правило сводилось к проверке интегралов, поиску пределов --- вообщем, к тем вещам, которыми балуются несерьезные студенты. Со временем задачи стали серьезнее, в отличие от исполнителя, и возникла необходимость делать "вкрапления" из собственного программного кода. Здесь я преимущество отдаю MatLab. Вывод: в Maple и MatLab все необходимые инструменты, лично для меня, "под рукой". Если опустить некоторые вопросы, связанные с этими СКМ, например, лицензию, требуемые ресурсы компа, порой и огрехи кода, то эти программы практически идеальны. + эти программы не заставляют пользователя дополнительно думать о таких вещах, как объем необходимой память (хотя я не говорю, что это плохо или хорошо).

Наверное, у этой программы широкие возможности по интеграции с другими приложениями и по написанию собственного кода, но применительно к каким задачам она особенно хороша?

 Профиль  
                  
 
 
Сообщение20.05.2008, 19:44 
Заслуженный участник
Аватара пользователя


07/03/06
1898
Москва
maxal, спасибо. Я уж думал хорошей идеи не суждено быть реализованной. :)
По этой вводной части вопросов у меня нет.

reader_st
По поводу - зачем все это нужно. Во-первых, Maple далеко не идеальное средство при работе с большими числами. Например, попробуйте реализовать модульное возведение в большую степень в лоб. Во-вторых, вопрос похож на такой: зачем нам Linux, когда есть Windows. Мне кажется, что научный софт должен быть с открытым кодом, это стимулирует исследования и способствует развитию самого софта.

 Профиль  
                  
 
 
Сообщение20.05.2008, 19:55 
Модератор
Аватара пользователя


11/01/06
5710
Как я уже сказал, PARI/GP ориентирована на теоретико-числовые вычисления: модулярная арифметика, числовые поля, полиномы, степенные ряды, комбинаторика, линейная алгебра (в том числе над кольцом целых чисел), решетки, эллиптические кривые и т.д.
Интегралы он не берет (если только не от полиномов или степенных рядов), пределы не вычисляет - для таких задач нужно использовать другие пакеты.

В отличие от всяких монстров типа маплов с матлабами, PARI/GP - очень маленький пакет (размер дистрибутива меньше более чем в 100 раз), ну и свободный к тому же.

Насчет не думать об объеме памяти - это плохо. Сколько раз у меня получалось, например, так, что мапл уходил в глубокие раздумья и начинал дуром есть память, вызывая активный своппинг, а оболочка переставала реагировать на действия пользователя (в частности, не было возможности прервать все это безобразие). В PARI/GP над этим полный контроль - если памяти не хватает (о чем PARI/GP сообщит, а также скажет сколько ему нужно), ее всегда можно выделить в разумных пределах (исходя из объема физической памяти) - если же разумных пределов также не хватает, то нужно задуматься о перенесении вычислений на более мощный компьютер.

 Профиль  
                  
 
 
Сообщение20.05.2008, 20:34 
Заслуженный участник
Аватара пользователя


07/03/06
1898
Москва
maxal писал(а):
...а оболочка переставала реагировать на действия пользователя (в частности, не было возможности прервать все это безобразие).

Просто люди из Waterloo похоже забыли про многопоточность или приоритеты процессов некорректно расставили, потому что эта беда часто происходит даже если памяти еще хватает. Впрочем, это уже offtop.
А есть ли PARI/GP online-калькулятор?

 Профиль  
                  
 
 
Сообщение20.05.2008, 20:45 
Модератор
Аватара пользователя


11/01/06
5710
juna писал(а):
А есть ли PARI/GP online-калькулятор?

Да, здесь например: https://sagecell.sagemath.org/ (нужно выбрать Language: GP в меню)

 Профиль  
                  
 
 
Сообщение20.05.2008, 20:57 
Заслуженный участник
Аватара пользователя


03/03/06
648
juna


Как раз самый популярный ответ на вопрос, что предпочесть Linux или Windows, который мне давали именно в том и состоит, что в Linux есть практически все что нужно для работы. Это так, к слову.

maxal

меня интересует реализация численных алгоритмов. Раз Вы упомянули линейную алгебру: умеет ли программа перемножать матрицы, не хотелось бы писать все самому, тогда уж лучше что знаю. Ну и было бы неплохо, если бы эта программа считала производную, поскольку частенько бывает нужно посчитать вектор- градиент или матрицу Гессе.

 Профиль  
                  
 
 
Сообщение20.05.2008, 21:24 
Модератор
Аватара пользователя


11/01/06
5710
reader_st писал(а):
меня интересует реализация численных алгоритмов. Раз Вы упомянули линейную алгебру: умеет ли программа перемножать матрицы, не хотелось бы писать все самому, тогда уж лучше что знаю. Ну и было бы неплохо, если бы эта программа считала производную, поскольку частенько бывает нужно посчитать вектор- градиент или матрицу Гессе.

В PARI/GP линейная алгебра реализована над числовыми полями, поэтому никаких гессианов и прочих объектов из анализа там нет. Зато есть поддержка матриц/форм Смита, Гессенберга, Гильберта, Фробениуса, Эрмита и т.п.
Более подробно с возможностями можно познакомиться в он-лайновом описании функций:
http://pari.math.u-bordeaux.fr/dochtml/html/

 Профиль  
                  
 
 
Сообщение20.05.2008, 22:24 
Заслуженный участник
Аватара пользователя


07/03/06
1898
Москва
maxal писал(а):
juna писал(а):
А есть ли PARI/GP online-калькулятор?

Да, здесь например: http://modular.math.washington.edu/calc/

А как им пользоваться? Ввожу, например, в окно "Evaluate in" 2+3 , нажимаю на PARI и наблюдаю белый лист.

 Профиль  
                  
 
 
Сообщение20.05.2008, 22:32 
Модератор
Аватара пользователя


11/01/06
5710
juna, его вроде убрали :( - прочитайте инфу сверху страницы - там ссылки на другие калькуляторы SAGE даны. Из SAGE вызов процедур PARI/GP осуществляется примерно так: print gp('2+3')
См. https://sagecell.sagemath.org/

 Профиль  
                  
 
 Лекция 2
Сообщение21.05.2008, 11:34 
Модератор
Аватара пользователя


11/01/06
5710
Лекция 2, где мы познакомимся с векторами и матрицами и научимся писать небольшие программки.

Сразу скажу, что массивов как таковых в PARI/GP нет. Функции одномерных массивов выполняют векторы, а двумерных - матрицы. А вот массивов размерности большей 2-х нет совсем, но они нам и не понадобятся.

Векторы создаются командой vector, а матрицы командой matrix, аргументом которых в простейшем случае является размерность. По умолчанию создаваемые векторы и матрицы заполняются нулями. Нумерация индексов в векторах и массивах всегда начинается с 1.
В этом примере мы создаем вектор $v$ и матрицу $M$, меняем значения их элементов и печатаем измененные $v$ и $M$:
Код:
? v=vector(10)
%1 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
? v[1]=1 
%2 = 1
? print(v)
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
? M=matrix(2,5)
%3 =
[0 0 0 0 0]

[0 0 0 0 0]

? M[3,4]=7
  ***   array index (3) out of allowed range [1-2].
? M[2,4]=7
%4 = 7
? print(M)
[0, 0, 0, 0, 0; 0, 0, 0, 7, 0]

Результат последней команды показывает как матрица записывается в строчном виде: перечисляются элементы каждой строки через запятую, а сами строки разделены точкой с запятой, и все это заключено в квадратные скобки. То есть, например, определить матрицу $\begin{pmatrix}1&2\\3&4\end{pmatrix}$ можно так:
Код:
? [1,2;3,4]
%6 =
[1 2]

[3 4]


Важно заметить, что у vector и matrix есть варианты с функциональным заполнением создаваемых векторов/матриц: vector( длина, индекс, функция_от_индекса ) и matrix( число_строк, число_столбцов, индекс_по_строкам, индекс_по_столбцам, функция_от_индексов ):
Код:
? u = vector(5, i, i^2)
%7 = [1, 4, 9, 16, 25]
? K = matrix(3,5,i,j,i*j)
%8 =
[1 2 3 4 5]

[2 4 6 8 10]

[3 6 9 12 15]

В этом примере мы создали вектор, состоящий из квадратов чисел от 1 до 5, и матрицу, являюшуюся таблицей умножения размером $3\times 5$.
Попробуем их перемножить:
Код:
? K*u
  *** _*_: impossible multiplication t_MAT * t_VEC.

Возникшая ошибка связана с тем, что векторы по умолчания являются вектор-строками, а умножать матрицу нам нужно на вектор-столбец. Не велика беда, нужно лишь транспонировать вектор u с помощью постфиксного оператора ~:
Код:
? K*u~
%9 = [225, 450, 675]~

Как видим, в результате получается опять же вектор-столбец, о чем говорит тильда в конце его строчной записи. То есть [225, 450, 675] - это вектор-строка, а вот [225, 450, 675]~ - это уже вектор столбец. Кстати, тильдой можно транспонировать и матрицы (хотя для этого же есть фунция mattranspose):
Код:
? K~             
%10 =
[1 2 3]

[2 4 6]

[3 6 9]

[4 8 12]

[5 10 15]

? K~ == mattranspose(K)
%11 = 1

Операция == - это тестирование равенства, результатом является либо 0 (ложь), либо 1 (истина). Как видим, в этом примере результат K~ совпадает с результатом mattranspose(K).

Заметим, что набирать длинные команды в PARI/GP просто засчет автоматического донабора (пользователям консоли в линуксе эта возможность хорошо известна как bash autocomplete).
Например, вместо длинного mattranspose достаточно набрать matt и нажать кнопку TAB - PARI/GP автоматически догадается, что вы хотите набрать mattranspose и сам донаберет оставшиеся символы. Если же вариантов донабора много, то после однократного нажатия TAB ничего не произойдет, а вот если его нажать его во второй раз, то PARI/GP покажет все возможные варианты. Например, набрать mata и нажав TAB два раза, вы увидите:
Код:
? mata
matadjoint     matalgtobasis

Теперь набрав еще одну букву, скажем, d и нажав TAB, вы получите слово matadjoint(), так как никаких неоднозначностей тут уже нет.

Если необходимо выполнить несколько команд в одной строке (или в теле цикла, например), то нужно их разделить точкой с запятой. То есть создать вектор u, матрицу K и перемножить их можно было в одну строку:
Код:
? u = vector(5, i, i^2); K = matrix(3,5,i,j,i*j); K*u~
%12 = [225, 450, 675]~

Или вот так можно напечатать все простые числа вида $n^2+1$, где $150\leq n\leq 300$:
Код:
? for(n=150,300, t=n^2+1; if( isprime(t), print1(t,", ") ) )
22501, 24337, 25601, 28901, 30977, 32401, 33857, 41617, 42437, 44101, 50177, 52901, 55697, 57601, 62501, 65537, 67601, 69697, 72901, 78401, 80657, 90001,

Из этого примера мы узнаем о конструкции if( условие, код_если_выполнено ), которая в более общем виде выглядит как if( условие, код_если_выполнено, код_если_не_выполнено ), а также о функции isprime(), которая тестирует целые числа на простоту. Она возвращает 1, если аргумент является простым числом, 0 в противном случае.

Кстати, точка с запятой может служить также для подавления вывода результата команды на экран. Сравните:
Код:
? x = 2+3
%13 = 5
? x = 2+3;

Команды абсолютно идентичные по действию, но результат первой печатается на экране, а второй - нет.

Ну и напоследок о том, как набирать многострочные команды - их нужно всего лишь заключить в { }. Если присутствует открывающаяся фигурная скобка, но еще нет закрывающейся, то PARI/GP не будет реагировать на нажатие enter как сигнал к выполнению кода. Пример, который мы разбирали выше, но в многострочном варианте:
Код:
? { for(n=150,300,                                           
  t=n^2+1;                                   
  if( isprime(t), print1(t,", ") )
) }
22501, 24337, 25601, 28901, 30977, 32401, 33857, 41617, 42437, 44101, 50177, 52901, 55697, 57601, 62501, 65537, 67601, 69697, 72901, 78401, 80657, 90001,


На этом Лекцию 2 будем считать законченной. Вопросы?

 Профиль  
                  
 
 
Сообщение21.05.2008, 17:26 
Заслуженный участник
Аватара пользователя


03/03/06
648
maxal

еще раз спасибо (за линейную алгебру). Придется организовать что-то вроде FAQ, когда дело дойдет до конкретной задачи.

 Профиль  
                  
 
 
Сообщение09.07.2008, 03:17 
Модератор
Аватара пользователя


11/01/06
5710
Пример использования PARI/GP для решения одной арифметической задачки: http://dxdy.ru/post131875.html#131875

 Профиль  
                  
 
 
Сообщение28.02.2009, 19:04 


16/08/05
1153
Есть ли где-нибудь в сети примеры кода PARI/GP для работы с эллиптическими кривыми: определение целых/рациональных точек, ранг кривой, преобразование к стандартной форме?

 Профиль  
                  
 
 
Сообщение28.02.2009, 19:48 
Модератор
Аватара пользователя


11/01/06
5710
dmd
вот тут есть простенький примерчик: http://dxdy.ru/post48041.html#48041
вот здесь тоже есть кое-какие примеры: http://www.ma.utexas.edu/cnt/cnt-frames.html

однако, целые точки на эллиптических кривых PARI/GP искать не умеет.
приводить к стандартной форме - только с помощью сторонних программ (jac_cubic по ссылке выше)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 810 ]  На страницу 1, 2, 3, 4, 5 ... 54  След.

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



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

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


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

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