2014 dxdy logo

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

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




На страницу Пред.  1 ... 42, 43, 44, 45, 46, 47, 48 ... 55  След.

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

(Оффтоп)

Я сейчас откатился в теме и искал, не написано ли что про вектора векторов векторов. Не нашёл.
Согласен, что потребность в средствах решения исходит из задачи, но ведь неизвестно, что за задача будет завтра предложена. А можно заранее потренироваться с различных умениях, и они внезапно пригодятся. Конечно, этот подход к жизни хорош для школьного возраста, потом на него и времени не хватает, но потом время появляется :-) .

В данном случае меня интересует конструкция A[n].
Адресация v[2][3][5][7] к элементу в многоуровневой пирамиде вложенности у меня получилась методом тыка, но в документации я тоже ничего не нашёл. А где прочитать правило применения конструкций вида[A]?
например, для прежнего вввектора
print(a[2][3][1..2])
[231,232]
print(a[1..2][1][1])
[111,112,113]

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение22.05.2023, 13:53 
Dmitriy40 в сообщении #1594736 писал(а):
Учитывая отсутствие стандартных типов данных для матриц размерности выше второй,

Для матриц определены всякие сложения-умножения-обращения и т.п. Потому они и есть в стандарных структурах данных.
$n$-мерный вектор это набор из $n$ компонент. 5-ти мерный - 5 компонент (5 чисел, в простом случае) :)
Для чего может понадобиться именно массив данных с тремя индексами так вот сразу представить трудно, но главное даже не это, а то, какие могут быть "стандартные" процедуры для таких массивов? Ну вот для матриц (обычных) есть всякие там определители и тому подобное. Для векторов могут быть определны скалярные произведения, векторные произведения. А что полезно-вычислительного можно сделать с "3-мерной матрицей чисел"?
gris в сообщении #1594711 писал(а):
Какие есть средства обработки?
Тут вопрос - а какие нужны? :mrgreen:

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение22.05.2023, 13:56 
gris
В документе gp_refcard.pdf (как я его себе для удобства обзываю, взят кстати на родном сайте PARI/GP, рекомендую!) прямо на первой (из всего 4-х, стоит всегда иметь перед глазами) странице:
Цитата:
Select Components
Caveat: components start at index n = 1.
n-th component of x -- component(x, n)
n-th component of vector/list x -- x[n]
components a, a + 1, . . . , b of vector x -- x[a..b]
(m, n)-th component of matrix x -- x[m, n]
row m or column n of matrix x -- x[m,], x[, n]
Дальше достаточно очевидно: если есть одномерный объект A[], то выбор его элемента будет A[3], а если его элементы сложного типа (например тоже вектора), то выбор элемента внутреннего объекта будет A[3][2], и так далее.
Интересные примеры адресации векторов есть в документации gp_users.pdf (тоже моё название) на странице 24 в пункте 2.3.14, например адресация с конца вектора.
Пример вложенной адресации есть для матриц внизу 26-й страницы:
Цитата:
All this is recursive, so if M is a matrix of matrices of : : : , an expression such as M[1,1][,3][4] = 1 is perfectly valid (and actually identical to M[1,1][4,3] = 1), assuming that all matrices along the way have compatible dimensions.
Пример вложенных векторов есть на 371-й странице.

-- 22.05.2023, 14:19 --

wrest в сообщении #1594745 писал(а):
А что полезно-вычислительного можно сделать с "3-мерной матрицей чисел"?
Я в общем больше думал не о примитивных типах, а об массивах. А они часто нужны довольно большой размерности (трёхмерное поле температур, или векторов намагниченности, или тензорное поле; и не обязательно только трёхмерное, размерностей может быть и сильно больше). Конечно их можно набрать из векторов, но не всегда это удобно.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение22.05.2023, 14:33 
Dmitriy40 в сообщении #1594748 писал(а):
А они часто нужны довольно большой размерности (трёхмерное поле температур,

Ну а что это? Регулярная координатня сетка, к каждому узлу которой прибиты температуры?
Dmitriy40 в сообщении #1594748 писал(а):
и не обязательно только трёхмерное, размерностей может быть и сильно больше

Так я ж и говорю, например для обозначения координаты в трехмерном пространстве достаточно трех чисел. В четырехмерном - четырех чисел.
Многомерные массивы, разумеется, сделать можно. Вопрос-то был -
gris в сообщении #1594711 писал(а):
К чему можно применять? Какие есть средства обработки?
Я тут с вами согласен:
Dmitriy40 в сообщении #1594736 писал(а):
Средства обработки или отсутствуют (как и сами такие типы данных), или базируются на том что это всё же вектора.
Но можно считать что если вы не знаете зачем это нужно -- то оно вам и не нужно.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение22.05.2023, 14:54 
wrest в сообщении #1594751 писал(а):
Ну а что это? Регулярная координатня сетка, к каждому узлу которой прибиты температуры?
Да. Или более сложные структуры (математические вектора, тензоры, списки, наборы оных, в разных вариациях).

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.05.2023, 08:54 
Аватара пользователя
забавная конструкция встретилась
forprime( p=1,60, nextprime(p+1)-p==2 && print1(p, ", "))
3,5,11,17,29,41,59,

прямо для oeis :-)
это что же — if не нужен???
А нельзя ли то, что напечатано в консоли PARI/GP легко помещать в буфер обмена windows?

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.05.2023, 09:42 
gris в сообщении #1595232 писал(а):
это что же — if не нужен???

Это такой забавный лайфхак. PARI анализирует логическое выражение слева-направо, и если в конструкции A && B оказывается, что A ложно, то вычислять B нет смысла, так что B просто не выполняется.
Соответственно если переставить A и B местами, то работать будет не так (в выражении B && A вычисление B будет производиться всегда), запустите
? forprime( p=1,60, print1(p,", ") && nextprime(p+1)-p==2)
Кстати сам результат A && B в этом выражении всегда ложь, т.к. print() возвращает 0
Запустите например
? a=2;a=print(a);print(a)
Но я бы, пожалуй, не советовал так делать.
gris в сообщении #1595232 писал(а):
А нельзя ли то, что напечатано в консоли PARI/GP легко помещать в буфер обмена windows?

Ну это же не консоль PARI, это консоль Windows, так что работает как работает.
А что там нелёгкого? Выделил и нажал enter...

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.05.2023, 09:55 
Аватара пользователя
спасибо. Это баловство, конечно, но иногда хочется получить что-то побыстрее.
с консолью беда :oops:
вот я в окошке получил
(09:47) gp > forprimes( p=7,60,p%7==2&&print(p))
23
37
79
(09:47) gp >

И как мне выделить 23?

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.05.2023, 09:57 
gris в сообщении #1595241 писал(а):
И как мне выделить 23?

Мышкой...
В свойствах консоли посмотрите (кликните на левый верхний угол), должна быть галка тут
Изображение

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.05.2023, 10:02 
Аватара пользователя
мне наверное надо и по винде читать руководства :oops:
Получилось! Я всё-таки очень хороший ученик :-)
23
37
79
У меня, правда, "свойства" > "правка" > "выделение мышью" (винда 7, попроще)

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.05.2023, 10:20 

(Оффтоп)

gris в сообщении #1595244 писал(а):
У меня, правда, "свойства" > "правка" > "выделение мышью" (винда 7, попроще)

Мне кажется этой галке Quick Edit Mode в свойствах консоли, что у меня на скриншоте, сто лет в обед (по крайней мере с Windows 2000 если не раньше).

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.05.2023, 10:34 
Аватара пользователя

(Оффтоп)

wrest, ну вот в свойствах
"Размер курсора",
"Запоминание команд" : размер буфера, Количество, Отбрасывать повторения. Я чувствую, что это полезно и надо изучить
"Правка": выделение мышью, быстрая вставка.
Винда кириллическая (Да благословит... имя его и приветствует :!: Где простенький смайлик восторга??? Вчера только видел ЕС на празднике кириллицы)

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.05.2023, 10:44 

(Оффтоп)

gris
А, ну это просто перевод на русский, это не от версии виндовс зависит а от локализации интерфейса. Оно там всегда было. Ну, почти всегда.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.05.2023, 12:25 
gris
wrest в сообщении #1595239 писал(а):
Но я бы, пожалуй, не советовал так делать.
И я тоже, настоятельно.
Экономия трёх символов (if(,) за вычетом &&) потом обязательно выльется вам (или не вам!) в дополнительные трудности с пониманием и редактированием. Эмпирические правила оформления кода придумали не просто так. А на скорость выполнения кода такая экономия если и влияет, то совсем не сильно, тем более в не столь простых программах.

Вообще же PARI позволяет делать странные (но удобные) вещи, например мне буквально вчера понадобилась такая конструкция:
while(aa=precprime(a-1); bb=nextprime(b+1); aa+bb==dd , a=aa; b=bb)
Т.е. вместо простого условия сначала делается предварительная работа, а условие проверяется лишь от последнего оператора (сравнения). Потому что результат предыдущих операторов в условии не нужен и подавляется символом ";". И такая замена одиночного оператора на целый список операторов допустима вообще везде, например можно в print(p,a) сделать что-то вроде print(b=p*2+a;c=b\3;d=2^(b+a%c);p+d,a) и напечатано будет два значения, p+d и a.
Это кстати очень похоже на объявление функции: там тоже куча предварительных действий, а в качестве результата возвращается значение последнего вычисленного оператора (если нет явного return).

(Оффтоп)

gris в сообщении #1595241 писал(а):
но иногда хочется получить что-то побыстрее.
с консолью беда :oops:
вот я в окошке получил
(09:47) gp > forprimes( p=7,60,p%7==2&&print(p))
23
37
79
(09:47) gp >
Куда торопитесь? Тут сразу две опечатки: и "s" в forprimes лишняя (т.е. такой код вообще не заработает), и 79>60 не получите. :mrgreen:
Кстати есть команда forprimestep(p=7+2,60,7,print(p)), выдающая ровно тот же результат, правда вероятно медленнее.
Ради интереса проверил скорость разных вариантов (по первому и трём последним делать не стоит):
Код:
? n=0; forprime(p=7,10^9, p%7==2&&n++); n
time = 7,458 ms.
8474795
? n=0; forprime(p=7,10^9, if(p%7==2, n++)); n
time = 7,472 ms.
8474795
? n=0; forprimestep(p=7+2,10^9,7, n++); n
time = 13,870 ms.
8474795
? n=0; forstep(p=7+2,10^9,7, ispseudoprime(p)&&n++); n
time = 23,729 ms.
8474795
? n=0; forstep(p=7+2,10^9,7, n+=ispseudoprime(p)); n
time = 39,906 ms.
8474795
? sum(i=1,10^9\7, ispseudoprime(7*i+2))
time = 28,127 ms.
8474795
Как видно замена if на && вообще не влияет, а forprimestep вдвое медленнее.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение25.05.2023, 13:38 
Аватара пользователя
Dmitriy40, согласен, что разные трюки в целом себя не оправдывают, кроме, конечно, экономии миллисекунды на блоке в квинтиллионном цикле :-)
Но я собираю их для одноразовых и быстрых показов.
forprimes постоянная ошибка :oops: Потому что сюда не копировал, а по памяти набивал и 79 из-за того, что там было до 100, но 60 на один символ меньше :-) много ошибок, да, от торопливости и не сосредоточенности.
ПАРИ мелочей не прощает, но хуже, если не замечает и трактует по-своему.
Ваши примеры интересны и тоже пойдут в копилочку.
Спасибо
(13:41) gp > n=0; forprime(p=7,10^9, p%7==2&&n++); n
time = 12,293 ms.
%3 = 8474795

Вот научился копировать с консоли и обнаружил, что можно и print не писать.

 
 
 [ Сообщений: 825 ]  На страницу Пред.  1 ... 42, 43, 44, 45, 46, 47, 48 ... 55  След.


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