2014 dxdy logo

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

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




На страницу Пред.  1 ... 51, 52, 53, 54, 55  След.

А вам пакет PARI/GP интересен?
Да 83%  83%  [ 58 ]
Нет 6%  6%  [ 4 ]
Не уверен(а) 11%  11%  [ 8 ]
Всего голосов : 70
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение02.05.2024, 22:42 
Dmitriy40 в сообщении #1637834 писал(а):
Заметьте что 144*5e6=720e6, в 10 раз меньше 7ГБ!

А... да, 0,7ГБ отъелось на 5 млн. чисел порядка $10^{44}$. Но претензии к управлению размером стека остаются
parisize = 8000000, primelimit = 500000
? nf=Map()
%1 = Map([;])
? for( i=1, 5000000, mapput(nf,random(10^22)*10^22+random(10^22),0) );
? sizebyte(nf)
%3 = 719999816
? sizebyte(nf)/#nf+0.
%4 = 143.99996320000000000000000000000000000
?

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение24.06.2024, 19:28 
Аватара пользователя
Как можно коротко записать/вычислить число вида
n=(((((13^3-7)^3-7)^3-7)^3-7)^3-7)^3-7;
с k парами скобок? Что-то типа рекурсивной процедуры?
Я придумал только
n=13; k=7; for( i=1,k-1, n=n^3-7);

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение24.06.2024, 20:00 
Забавный непрактичный вариант:
fold((x,y)->x^3-y,[13,7,7,7,7,7,7,7]);

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение24.06.2024, 20:29 
Аватара пользователя
Dmitriy40, спасибо!
Уже применил в своих корыстных целях в виде
n=fold((x,y)->x^3-7*y,[13,9,19,19,9]);
Работает! Надо изучить.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение13.08.2024, 19:40 
Забавно работает сравнение:
Код:
? Mod(2,3)==5
%1 = 1
Т.е. равно. По модулю.
Я раньше думал что сравнивается лишь числитель (т.е. эквивалентно lift(Mod(2,3))==5).

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение23.08.2024, 03:36 
Аватара пользователя
Dmitriy40 в сообщении #1649812 писал(а):
Я раньше думал что сравнивается лишь числитель (т.е. эквивалентно lift(Mod(2,3))==5).

Сравнение a==b в PARI/GP всегда вычисляется через сравнение разности a-b с нулем. Здесь мы имеем:
Код:
? Mod(2,3) - 5
%1 = Mod(0, 3)

Т.е. тип t_INT приводится к t_INTMOD, а не наоборот.
И, кстати, называть значение вычета "числителем" (как и его модуль "знаменателем") не принято.

-- Thu Aug 22, 2024 19:58:24 --

wrest в сообщении #1637205 писал(а):
Изготовление вектора [коэффициентов] из полинома:
? vector(#P,i,polcoef(P,#P-i))
%3 = [1, 5, 3, 4]

Можно просто Vec(P) или Vecrev(P) в зависимости от того, с какого конца хочется начинать перечислять коэффициенты.

-- Thu Aug 22, 2024 20:03:30 --

gris в сообщении #1637800 писал(а):
Вопрос: Нельзя ли в forvec применять переменные вектора? Типа
forvec( s=[[1,222],[i1,224],[i2,226]], ...)
То есть изящно сделать
for( i1=1,222, for( i2=i1+1,224, for( i3=(i2+1,226, ... )))

Для этого у forvec() есть третий параметр flag:
Код:
? ?forvec
forvec(X=v,seq,{flag=0}): v being a two-component vectors of length n, the sequence is evaluated with X[i] going from v[i][1] to v[i][2] for i=n,..,1 if flag is zero or omitted. If flag = 1 (resp. flag = 2), restrict to increasing (resp. strictly increasing) sequences. As a shortcut, v being a vector of nonnegative integers allows to loop over representatives of Z^n/vZ^n.

Так как вы хотите, чтобы индексы суммирования были упорядочены строго, то ставим флаг равным 2:
Код:
forvec( s=[[1,222],[1,224],[1,226]], ..., 2 )

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.08.2024, 15:24 
Аватара пользователя
Спасибо. Вот ещё вопрос: Возведение в натуральную степень и по модулю.
2 ^ 12 = 1 mod(3); gp > 3^21%43 = 42
Беда в том, что показатели степени очень большие и при вычислении напрямую overflow in lg(). Я такую штуку "изобрёл" .
Как я представляю(a%md)^n=a%md^nи остаток можно считать постоянно при возведении в степень. То есть вначале формируется вектор из степеней в с показателем $2^i$ с применением модуля, а потом всё перемножается:
Код:
{ n=76871;    p=12450785994384756536;    md=37;
   pd=digits(p,2);
   pd=Vecrev(pd);
   vp=vector(#pd);
   vp[1]=n%md;
   for( i=2,#vp,vp[i]=vp[i-1]^2%md);
   m=1;for(i=1,#vp, if(pd[i],m=m*vp[i]%md) );
   printf("%d ^ %d = %d mod(%d)\n",n,p,m,md); }

76871 ^ 12450785994384756536 = 34 mod(37)

Считается мгновенно и памяти не просит.
Но я думаю, что есть для этой цели специальные короткие команды. Где почитать? И при обычном возведении происходит какая-то оптимизация процесса? Dmitriy40 Спасибо.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение30.08.2024, 15:46 
gris
Не надо ничего изобретать, есть уже готовое:
Код:
? Mod(76871,37)^12450785994384756536
%1 = Mod(34, 37)

А если действительно хочется узнать как оно так быстро и просто вычисляется, то смотрите алгоритмы быстрого возведение в степень по модулю. Но в PARI их применять не потребуется.

 
 
 
 forvec forever!
Сообщение03.09.2024, 19:23 
Аватара пользователя
Сильно упрощённая модель. Задан цикл по вектору и вектор, который обязательно появляется в этом цикле. Надо предсказать, на каком шаге.
Несложно делается, но нет ли волшебной палочки?
Строится вспомогательный вектор из числа шагов для изменения на единицу i-ой позиции в очередном векторе перебора.
При небольшой доработке можно из любой системы счисления переводить в десятичную!

Код:
wd=[[1,2],[1,3],[1,17],[1,22]];
f=[2,3,7,22];
nw=#wd;
wpk=vector(nw);wpk[nw]=1;
forstep(i=nw-1,1,-1,wpk[i]=wpk[i+1]*wd[i+1][2] );
print(vecsum(vector(nw-1,i,(f[i]-1)*wpk[i] ) )+f[nw]);

k=0;
forvec(v=wd,k++;if(v==f, break)); print(k)

2024
2024

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение18.10.2024, 13:28 
$\mathsf{}$Здравствуйте. Впервые столкнулся с такой проблемой:если в программе много переменных,можно ли в PARI индексировать их обычным образом,вроде $x_i$ (конечно,индекс будет каким-то образом писаться в одной строке с буквой x1,x2,...).И как тогда,например,в цикле for присваивать значения этим переменным типа $\mathsf{for(i=1,30,x_i=...)}$?

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение18.10.2024, 13:41 
genk
Индексированные переменные это и есть вектор (массив): x=vector(100); x[53]=123+x[13]; for(j=1,#x, x[j]=j*prime(j) ).
Кстати если нет зависимости значений друг от друга, то присвоение можно делать прямо в момент объявления: x=vector(100,j, j*prime(j)). Можно и с зависимостями, но придётся вычисление сделать через if с проверкой индексов.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение19.10.2024, 10:22 
Dmitriy40
Спасибо,предельно ясно.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение04.11.2024, 11:50 
 i  Выделена тема «Сверхъестественные пифагоровы тройки до 100 разрядов»

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение12.11.2024, 18:20 
Здравствуйте.Меня интересует такой вопрос:может ли PARI вычислять базис Грёбнера в $\mathbf{Q[x_1,x_2,\dots,x_n]}$ для идеала,порожденного многочленами f_1,f_2,\dots,f_k? С одной стороны,есть простой алгоритм(например,Бухбергера),который вроде бы "по плечу" такому продвинутому калькулятору.Но я не нашел подходящей функции(не будешь же проверять полсотни функций в разделе "Общие числовые поля",начинающиеся с ideal... Поиск по функциям,в названии которых есть часть basis или grobner тоже ничего не дал.Или я что-то пропустил?

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение21.11.2024, 23:42 
В версии 2.17 от 30 сентября наконец сделали праймориал:
"allow n# for the primorial of n (product of primes <= n)"
Зато forprime испортили, в ней баги полезли.

 
 
 [ Сообщений: 824 ]  На страницу Пред.  1 ... 51, 52, 53, 54, 55  След.


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