2014 dxdy logo

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

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




На страницу Пред.  1 ... 56, 57, 58, 59, 60

А вам пакет PARI/GP интересен?
Да 83%  83%  [ 60 ]
Нет 6%  6%  [ 4 ]
Не уверен(а) 11%  11%  [ 8 ]
Всего голосов : 72
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.11.2025, 08:50 
Аватара пользователя
EUgeneUS
Есть еще, вроде бы, библиотечка для python, cypari2.
Соответственно, можно написать необходимый код на питоне, а потом сделать экзешник pyinstaller'ом.
Это все чисто теоретически, сам не проверял.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.11.2025, 10:00 
EUgeneUS в сообщении #1708344 писал(а):
Утилита gp2c может ли работать во Виндой?

Нет.
EUgeneUS в сообщении #1708344 писал(а):
а) переводим код PARI в С на системе с Линуксом.

Ну код pari (самой библиотеки libpari) и так на C
EUgeneUS в сообщении #1708344 писал(а):
б) получившийся код на С компилируем в Винде для создания исполняемого файла под Виндой?

Скорее всего нет. Например, pari использует для собственно вычислений https://ru.wikipedia.org/wiki/GNU_Multi ... on_Library - придётся разбираться как устанавливать в win32 её так, чтобы она была доступна pari. Либо использовать какую-то их ( pari) вычислительную библиотеку которую они сами не рекомендуют если есть GMP.
EUgeneUS в сообщении #1708344 писал(а):
И не очень понял, если мы переводим код в С, а потом компилируем в исполняемый файл,

Насколько я понимаю, тут нет "исполняемого файла" в том понимании как вы задаёте вопрос (типа .exe и куча .dll как в виндовс). Результатом компиляции в C и затем в бинарный формат архитектуры (x86-64 или arm64/aarch64) являются библиотеки (аналог .dll). Аналогом .exe тут является gp, который организует вам интерфейс пользователя, вызывает вашу скомпилированную функцию в библиотеке (которые вызывают функции в libpari, которые вызывают функции в GMP).

Мэйнстримный путь - это linux, в венде соответственно WSL/WSL2 ( https://en.wikipedia.org/wiki/Windows_S ... _for_Linux ). Собственно pari/gp для венды так и сделано: обёрнуто в https://en.wikipedia.org/wiki/MinGW куда положены скомпилированные под x86 код gp, libpari, GMP и т.п., плюс как-то переработан файловый ввод-вывод.

Я не очень твёрдо это всё понимаю, но общее представление такое.
Лично я практически сразу избавился от вендовой версии pari/gp в пользу регулярной, под WSL
Тоже и в гаджетах на андроид: попробовал андроидное приложение и отказался в пользу регулярной pari/gp, даже собирал из исходников. Поскольку ядром андроид является linux, то выполняется всё нативно (но, правда, без поддержки мультипотока). Сейчас в репозиториях termux для андоид есть pari/gp и собирать самому не надо. Но кстати в этих репозиториях нет gp2c. А под ubuntu в WSL -- есть и gp2c тоже.

P.S. С точки зрения ваших трудозатрат на изучение и реализацию, пойти нативным путём установив WSL/WSL2 и там установив pari/gp и gp2c будет намного короче. :mrgreen:

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.11.2025, 12:13 
EUgeneUS в сообщении #1708344 писал(а):
а) переводим код PARI в С на системе с Линуксом.

Если тут вы имели в виду тот код на C который производит gp2c, то там есть засада в том, что потом неясно что с этим кодом делать "руками". gp2c добавляет специфический раздел с инструкциями (для себя) как надо компилировать код на C в библиотеку, в приведенном мной примере это
Код:
*-*- compile-command: "/data/data/com.termux/files/usr/bin/gcc -c -o ktest.gp.o -O3 -Wall -fno-strict
-aliasing -fomit-frame-pointer -fPIC -I\"/data/data/com.termux/files/usr/include\" ktest.gp.c && /data
/data/com.termux/files/usr/bin/gcc -o ktest.gp.so -shared -O3 -Wall -fno-strict-aliasing -fomit-frame-
pointer -fPIC -Wl,-shared ktest.gp.o -lc -lm -L/data/data/com.termux/files/usr/lib -lpari"; -*-*/

Это существенно определяется положением дел в вашей системе: где что расположено.
Далее, для компиляции вам потребуются как минимум заголовки от libpari
Код:
#include <pari/pari.h>

Затем там инструкции по инициализации функции в gp (которые вам не нужны если не будет gp) и дальше собственно код, который использует функции и типы libpari.
Например вот тут
Код:
        for (x = gen_1; gcmp(x, max_xy) <= 0; x = gaddgs(x, 1))

для вычисления x=x+1 применяется x = gaddgs(x, 1) которая скорее всего в конечном итоге (трудно проверить) вызывает одну из функций сложения в GMP или во внутреннем ядре арифметики произвольной точности, в зависимости от того как собрана pari/gp

То есть получаемый в результате работы gp2c код пользовательской функции на C в конечном итоге не является независимым, он зависит от того, как в вашей системе установлена pari/gp

Вся эта заморочка происходит в том числе от того, что pari/gp оперирует числами произвольной точности и даже простая операция инкремента счетчика цикла на единицу оказывается замороченной в реализации, т.к. счетчик, даже будучи беззнаковым целым числом, может например превышать длину 32 или 64 бит и за этим надо все время следить. Это цена за беспроблемность для пользователя. Вы можете написать на C и будет работать быстрее, если вам не нужна будет произвольная точность везде. Иначе ваш путь лежит через изобретение своей или использования имеющейся библиотеки типа GMP, которая безопасно (без потери точности, без переполнения) складывает 1+1=2 или умножает 2х2=4 два числа, и при этом учитывает архитектуру процессора (например разрядность регистров) на которой код запускается...

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.11.2025, 14:34 
Да, и по старорежимной терминологии, gp2c надо бы назвать транслятором, по производимому им результату -- файлу *.gp.c
Остальное (в том числе "исполняемый файл") производит системная и следовательно системозависимая машинерия -- системный компилятор C (который на самом деле тоже транслятор, в низкоуровневый код типа языка ассемблера), собственно компилятор (из условного asm в инструкции процессора), упаковщик, линковщик и т.п.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.11.2025, 18:33 
Аватара пользователя
wrest
Спасибо за развернутые ответы.
Из них понял главное - пытаться сделать из кода на PARI\GP исполняемый файл под винду - это закат Солнца вручную.
wrest в сообщении #1708348 писал(а):
Мэйнстримный путь - это linux, в венде соответственно WSL/WSL2 ( https://en.wikipedia.org/wiki/Windows_S ... _for_Linux ).


ИМХО, в таком случае, "мейнстримовый путь" - это отдельная машина под Линуксом. Ну и, в случае успеха все "счеты" надо переводить под Линукс.

пианист в сообщении #1708345 писал(а):
Есть еще, вроде бы, библиотечка для python, cypari2.

Спасибо за информацию. Но пока отложим, попытаюсь неспешно пойти по "мейнстримовому пути".

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.11.2025, 20:43 
EUgeneUS в сообщении #1708364 писал(а):
ИМХО, в таком случае, "мейнстримовый путь" - это отдельная машина под Линуксом. Ну и, в случае успеха все "счеты" надо переводить под Линукс.

С чего бы? WSL2 будет работать околонативно по скорости. Ну, у меня так. Если у вас какие-то цепочки есть, файлы выводятся и вводятся в WSL несложно. Предполагается же, что скрипт работает достаточно долго, иначе зачем компилировать...

-- 05.11.2025, 20:43 --

EUgeneUS в сообщении #1708364 писал(а):
Из них понял главное - пытаться сделать из кода на PARI\GP исполняемый файл под винду - это закат Солнца вручную.

Типа того, да. :mrgreen:

-- 05.11.2025, 21:06 --

EUgeneUS в сообщении #1708364 писал(а):
Но пока отложим, попытаюсь неспешно пойти по "мейнстримовому пути".

Хорошо бы 11-ю венду. В ней очень удобный терминал. Вот этот https://learn.microsoft.com/ru-ru/windo ... al/install
Хотя пишут, что и в 10-й есть (наверное я на 11 перешёл до того, как он появился в 10-й). Вы можете так его настроить так, что при открытии сразу будет запускаться gp.
Собсно особой разницы с pari/gp под венду вы и не заметите тогда. Что там, что там командная строка.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.11.2025, 21:15 
wrest
А в этом терминале можно будет вызвать другой gp скрипт из данного? Типа как я делаю r=externstr("gp.exe -q second.gp")?

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.11.2025, 21:42 
Dmitriy40 в сообщении #1708372 писал(а):
А в этом терминале можно будет вызвать другой gp скрипт из данного?

Ну это не свойство терминала, это свойтво gp и оболочки. Да, можно
Код:
root@DR-LENOVO:/home/wrest# cat hello.gp
print("hello from another instance");
\q
root@DR-LENOVO:/home/wrest# gp -q
? r=externstr("gp -q hello.gp")
cpu time = 1 ms, real time = 129 ms.
["hello from another instance"]
?

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение06.11.2025, 01:10 
Dmitriy40
Кстати, в WSL можно запускать и вендовые программы. Не знаю правда будут ли они что-то возвращать. Т.е. вы можете из линуксового wsl- ного pari/gp запустить "вендовый" (который .exe). :mrgreen: прогресс, однако.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение09.11.2025, 13:43 
О пользе компиляции.
Имеем вот такую функцию:
Код:
g_f(N)={
my(v=vectorsmall(precprime(N-3)\2+1)); forprime(p=3,#v*2-1, v[#v-p\2]=1);
my(q=apply(x->(x+1)\2,vecextract(Vecrev(Pol(v)^2),[1..N\2])));
q[2]=1;
return(q);
}

Она возвращает массив из значений функции Гольдбаха. Обсуждалось вот тут «Гипотеза о симметричных простых близнецах»

Обнаружил что компиляция через gp2c этого кода -- ухудшает производительность!
Само оборачивание в функцию ухудшает, но это понятно (возвращаемый вектор объёмный).
Интерпретируемая функция для N=10^7 работает 4,8сек, а скомпилированная -- 6,5сек и ест больше стека.
Так что если уже наворотили максимальное избавление интрпретатора от for циклов, то компиляция может даже ухудшить.

Теперь берём по логике такую же функцию:
Код:
g_f_D(N)={
my(v=vectorsmall(precprime(N-3)\2+1));
forprime(p=3,#v*2-1, v[#v-p\2]=1);
my(ff=Pol(v)^2);
my(q=vectorsmall(N\2,n, (polcoef(ff,n-1)+1)\2));
q[2]=1;
return(q);
}

Её отличие (автор Dmitriy40 ) в том что для вектора результатов используется тип вектора t_VECSMALL
Для N=10^7 функция работает 5сек.
Компилируем, запускаем и получаем:
Код:
? g_f_D(10^7);
  *** g_f_D: Warning: increasing stack size to 800000000.
  *** g_f_D: Warning: increasing stack size to 1600000000.
  ***   at top-level: g_f_D(10^7)
  ***                 ^-----------
  *** g_f_D: overflow in t_INT-->long assignment.
?

Переполнился long! Неожиданно... Мы там возводим в квадрат многочлен из $10^7$ членов, так что переполняться вроде и не должно. Но вот, надо иметь в виду.
Посмотрел, переполняется в строке my(q=vectorsmall(N\2,n, (polcoef(ff,n-1)+1)\2));

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение09.11.2025, 15:13 
wrest
Указывайте пожалуйста разрядность ОС и целевого исполняемого файла, 32 или 64, это критично, под 32 некоторые функции работают ограниченно (по крайней мере в PARI/GP под виндой), например нельзя выделить массив размером более нескольких миллионов элементов независимо от типа и свободной памяти. Возможно тут аналогичная ошибка.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение09.11.2025, 15:31 
Dmitriy40 в сообщении #1708719 писал(а):
Указывайте пожалуйста разрядность ОС и целевого исполняемого файла, 32 или 64,

андроид, 64 бит
aarch64-linux running android (portable C/GMP-6.3.0 kernel) 64-bit version

Но там не именно переполнение, т.к. та же ошибка и с N=10, это глюк какой-то gp2c
Если запускать как
gp2c-run -g gen-d.gp
то ошибка возникает

А если запускать как
gp gen-d.gp.run
то не возникает.

Но gp2c-run (это скрипт командной строки) именно это и должен делать: сперва компилировать, потом создавать файл .run и запускать его с gp.

Файл .run
Код:
install("init_gen_d","v","init_gen_d","./gen-d.gp.so");
install("g_f_D","D0,G,","g_f_D","./gen-d.gp.so");


Так что с gp2c могут быть сюрпризы.
Установка его на android планшет тоже была помороченной.
Собирать пришлось из исходников. В системе не оказалось динамической библиотеки libpari и пришлось устанавливать (её тоже не было) статическую, команды компиляции были с ошибками в общем через тернии к звёздам, но это особенности среды termux в андроиде. Хорошо хоть не пришлось пересобирать сам gp, хотя и это я освоил уже :mrgreen:

В WSL2 (ubuntu 24.04 lts) всё установилось и норм заработало само.

 
 
 [ Сообщений: 897 ]  На страницу Пред.  1 ... 56, 57, 58, 59, 60


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