2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1 ... 48, 49, 50, 51, 52

А вам пакет PARI/GP интересен?
Да 82%  82%  [ 56 ]
Нет 6%  6%  [ 4 ]
Не уверен(а) 12%  12%  [ 8 ]
Всего голосов : 68
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение02.02.2024, 15:51 
Заслуженный участник
Аватара пользователя


13/08/08
14452
wrest, скрипт, конечно. Вывод только для контроля.
По 5788765_10 = [5,8,5,4,5,13]_16: [0,4,5,8,13] По условию, переписанная в _k запись числа должна содержать не менее l цифр. В противном случае она дополняется ведущими нулями. У нас получилось шесть цифр, а надо минимум семь. Добавляем ноль в множество. Если уже был, то не страшно. Кстати, это позволяет предотвратить ситуацию с нулём:
0_10 = []_6: [0] :wink: Ему возвращается положенная по справедливости цифра.

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


05/09/16
11533
gris
А, ну тогда все хорошо. Лишнего нет, всё по делу.

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


13/08/08
14452
Вот ещё дурацкая задачка.
На вход подаются десятичные натуральные числа от $0$ до $2^l-1$, которые преобразуются в двоичное число длины $l$, в котором по заданному правилу переставляются цифры, что в конце концов преобразуется в десятичное число.
Код:
{ln=12;
vc=[3,6,5,7,1,11,9,12,2,4,8,10];
foreach( [0,1,13,24,577,4000],n,
  vd=digits(n,2); printf("%5d: %d\n ",n,vd);
  vd1=vector( ln,i, if (vc[i]>#vd, 0, vd[vc[i]]) );
  printf("      %d to %d\n", vd1,fromdigits(vd1,2) );
)}
    0: []
       [0,0,0,0,0,0,0,0,0,0,0,0] to 0
    1: [1]
       [0,0,0,0,1,0,0,0,0,0,0,0] to 128
   13: [1,1,0,1]
       [0,0,0,0,1,0,0,0,1,1,0,0] to 140
   24: [1,1,0,0,0]
       [0,0,0,0,1,0,0,0,1,0,0,0] to 136
  577: [1,0,0,1,0,0,0,0,0,1]
       [0,0,0,0,1,0,0,0,0,1,0,1] to 133
4000: [1,1,1,1,1,0,1,0,0,0,0,0]
       [1,0,1,1,1,0,0,0,1,1,0,0] to 2956

Вот как то так вроде бы работает. Перестановка задаётся вектором vc одна на все числа.Предполагается, что всё задано корректно.
Нет ли более простого подхода?

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


20/08/14
11177
Россия, Москва
Для перестановки вектора или матрицы есть vecextract. Как раз по списку номеров элементов.

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


13/08/08
14452
Спасибо. Вот ещё сделанное на коленке.
Надо получить все векторы длиной m с элементами от 1 до k
Код:
{k=6;m=3;
n=k^m-1;
for( i=0,n,
  d=digits(i,k);
  v=vector( m, i, if( i>#d, 1, d[i]+1) );
  print(v);
)}
[1, 1, 1], [2, 1, 1], [3, 1, 1], [4, 1, 1], [5, 1, 1], [6, 1, 1],
[2, 1, 1], [2, 2, 1], [2, 3, 1],     ...     , [6, 6, 5], [6, 6, 6]

Вот бы каким-то флагом получить digits с обязательными ведущими нулями до постоянной длины.
типа digits5 (389)=[0,0,3,5,9];

+++ 16:35 Спасибо! Ещё больше полюбилforvec :D :D

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


20/08/14
11177
Россия, Москва
gris в сообщении #1631476 писал(а):
Надо получить все векторы длиной m с элементами от 1 до k
forvec(x=vector(m,i,[1,k]), print(x))
gris в сообщении #1631476 писал(а):
Вот бы каким-то флагом получить digits с обязательными ведущими нулями до постоянной длины.
digitsN(x,k,n)=my(r=digits(x,k)); if(#r<n, r=concat(vector(n-#r),r)); return(r);

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


20/08/14
11177
Россия, Москва
Как интересно: оказывается ограничение на размер памяти, которое allocatemem и default(parisize) и default(parisizemax), не влияет на размеры списков и хештаблиц (Map):
Код:
? default(parisize)
%1 = 4000000
? default(parisizemax)
%2 = 0
? m=Map();
? for(i=1,10^6,mapput(m,i,i%257))
? sizebyte(m)
%5 = 67984452
При ограничении в 4М хештаблица непринуждённо заняла 68М. :shock:

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


20/08/14
11177
Россия, Москва
Ещё интересное наблюдение: нулевые значения векторов занимают меньше места:
Код:
\\gp64:
? for(i=-3,3,x=[i];print(i,":",sizebyte(x));)
-3:40
-2:40
-1:40
0:32
1:40
2:40
3:40
? for(i=-3,3,x=vector(1000,k,i);print(i,":",sizebyte(x));)
-3:32008
-2:32008
-1:32008
0:24008
1:32008
2:32008
3:32008
? x=vector(1000,k,k%2);print(sizebyte(x));
28008
? x=matrix(100,100);print(sizebyte(x));
241608
? x=matrix(100,100,i,j,1);print(sizebyte(x));
321608
? x=matrix(100,100,i,j,(i+j)%2);print(sizebyte(x));
281608

\\gp32:
? for(i=-3,3,x=[i];print(i,":",sizebyte(x));)
-3:20
-2:20
-1:20
0:16
1:20
2:20
3:20
С одной стороны хорошо, экономия памяти, с другой стороны видимо тратится дополнительное время на изменение размеров элементов. И тогда если большинство элементов будут не нулевыми, то выгоднее инициализировать вектора (и матрицы) сразу ненулевыми значениями. Правда разница если и будет, то лишь на многомиллионных векторах.

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


05/09/16
11533
gris
Изготовление полинома из вектора [коэффициентов]
? v=[1,5,3,4]
%1 = [1, 5, 3, 4]
? P=Pol(v,x)
%2 = x^3 + 5*x^2 + 3*x + 4
?

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

Ну а дальше читать тут: https://pari.math.u-bordeaux.fr/dochtml ... eries.html

P.S. Ой, а вопрос то пропал. Ну ладно, не пропадать же ответу :mrgreen:

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


13/08/08
14452
wrest, спасибо за ответ. Я просто устыдился того, что не подготовился к вопросу и удалил его :oops: Буду читать FM по вашему совету и наверняка ещё спрошу более конкретнее :-) .

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


13/08/08
14452
gp > polrootsreal(Polrev(primes(2)))
[-0.6666666666666666666666666667]

gp > polrootsreal(Polrev(primes(2434)))
[-0.9960369895432265521556781771]

gp > polrootsreal(Polrev(primes(2435)))
[]

polrootsreal(Polrev(primes(2437)))
[-0.9966912680420351022436326790, -0.9965933340278384751512797067]

gp > polrootsreal(Polrev(primes(2481)))
[-0.9969186916238192378345112206, -0.9964288608776514354529335606]

сегодня вдруг увидел и проверил.
кстати, можно решать квадратные уравнения
polrootsreal(Pol([1,-5,6]))
[2.000000000000000000000000000, 3.000000000000000000000000000]

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 776 ]  На страницу Пред.  1 ... 48, 49, 50, 51, 52

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



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

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


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

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