2014 dxdy logo

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

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




На страницу Пред.  1 ... 34, 35, 36, 37, 38, 39, 40 ... 55  След.

А вам пакет PARI/GP интересен?
Да 83%  83%  [ 58 ]
Нет 6%  6%  [ 4 ]
Не уверен(а) 11%  11%  [ 8 ]
Всего голосов : 70
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение04.12.2022, 11:07 
Аватара пользователя
Dmitriy40, а вы правильно приметили: конечно, элементы вектора длиной М натуральные числа, не большие N. Уже спать хотел и перепутал.
Но вы же говорили о готовых примитивах. А цикл или даже процедуру написать можно, но всё-таки познакомившись с forsubset или forprimes каких только чудес не ждёшь. А тут не чудо вовсе. Ну типа:
for????(3,2): 11 12 13 21 22 23 31 32 33
for????(2,3): 111 112 121 122 221 222
методика изучения: пишу на каждую функцию простенькую программку. Ладно, это уже офтопик. Лесник не дремлет.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.12.2022, 00:56 
gris
Да, для сочетаний из $n$ элементов по $k$ есть встроенный итератор forsubset(), для сочетаний с повторениями такого нет (концепция множества не подразумевает неуникальность элементов, наверное поэтому). Хотя тут даже не сочетания с повторениями, раз вы 112 и 121 за разные комбинации считаете. Но это и не размещения т.к. порядок одинаковых элементов не важен.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.12.2022, 11:09 
waxtep в сообщении #1572480 писал(а):
Если и это важно, то скромное digits() можно завернуть в более загадочное Код:

arr_fill(a,n)={return(vector(#a^n,i,vector(n,j,iferr(a[(d=digits(i-1,#a))[j-n+#d]+1],ERR,a[1]))))};

Да, выглядит магически, но работает исправно. Сами придумали?

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.12.2022, 22:37 
Аватара пользователя
wrest в сообщении #1572614 писал(а):
Да, выглядит магически, но работает исправно. Сами придумали?
Да, "накурился манов", по Вашей наводке выше по топику :-) Мне как-то не приходило в голову открывать пдфки, пытался обойтись онлайн-справочником функций и методом проб и ошибок. Все таки концептуальные вещи и особенности синтаксиса оказалось удобнее изучать систематически.
Вообще я хотел "от руки" написать рекурсивную функцию, но что-то быстро сломался и к тому же вспомнил про digits(); так что это в общем отступление... в качестве компенсации попробовал "напихай в одну невнятную строчку"

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение05.12.2022, 23:00 
waxtep в сообщении #1572722 писал(а):
Вообще я хотел "от руки" написать рекурсивную функцию,

Рекурсивная есть например тут https://rosettacode.org/wiki/Combinatio ... epetitions
Тож рекомендую сайт.

-- 05.12.2022, 23:01 --

waxtep в сообщении #1572722 писал(а):
Все таки концептуальные вещи и особенности синтаксиса оказалось удобнее изучать систематически.

Да, там именно что гайд, а не просто справочник по функциям.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение12.12.2022, 19:37 
Аватара пользователя
Dmitriy40
Попробовал ваши рекомендации по поводу выхода из циклов.
Код:
{for( L=3,4,     \\the Lenght of AP
   forprime( p=3,10,   \\try the first prime number
   forstep( d=2,20,2,   \\try a difference
     for( i=1,L-1,  if( !isprime(p+i*d),next(2)) ); \\test
   print( L," ",p," ",d); next(3) )) 
)}

Да, можно управлять вторым next(i) тем, что нужно вывести: все ли найденные прогрессии по условиям, либо первую для заданной длины и каждого начала, либо первую для длины. Главное, не запутаться во вложении циклов.

wrest

Ну у меня пока кросс-платформенных обменов не требуется, но [tt] эстетичнее, хотя с пробелами плохо.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение12.12.2022, 21:15 
gris в сообщении #1573572 писал(а):
Главное, не запутаться во вложении циклов.
Что за next(3)? Продолжить цикл на три уровня выше - а он разве есть такой?

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение12.12.2022, 21:43 
gris в сообщении #1573572 писал(а):
Главное, не запутаться во вложении циклов.

Ну если форматировать "как положено" отступами, то и не запутаешься, :idea:

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение12.12.2022, 22:13 
Аватара пользователя
Код:
{for(L=3,5,  \\the Lenght of AP
     forprime(p=3,100, \\try the first prime number
        forstep(d=2,200,2,\\try a difference
           for( i=1,L-1,  if(!isprime(p+i*d),next(2)) ); \\test
           print(L," ",p," ",d);next(3) 
        )  \\rof d     
     ) \\rof p
)\\rof L
3 3 2
4 5 6
5 5 6

Так форматировать? Я до конца не разобрался с next и break Но вроде работает? Надо попробовать на ещё более простых (not prime, but simple :-) ) примерах.

++ 22:52 Dmitriy40, спасибо

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение12.12.2022, 22:31 
gris в сообщении #1573598 писал(а):
Так форматировать?
Да, например так.
gris в сообщении #1573598 писал(а):
Я до конца не разобрался с next и break
Break обрывает текущую итерацию цикла и выходит из цикла. Next обрывает текущую итерацию цикла и переходит к следующей итерации (если она есть). Можно считать для себя что next выполняет переход к закрывающей скобке цикла (продолжая его выполнять дальше), а break переходит сразу за неё, выходя из цикла.
Если указан номер, то переход происходит не в текущем цикле, а на указанном уровне выше (считая текущий за 1, т.е. next(1)=next).

В приведённом примере next(2) переходит к следующему значению d, а next(3) к следующему значению L.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение13.12.2022, 19:13 
Аватара пользователя
мелочёвка
В print можно не ставить запятые?
a=2;b=3;print("a="a" b="b" ab="a*b)
a=2 b=3 ab=6


Ругается на переменную I. Еле дошло, что это функция!
I=3;i=I;print(i)
*** variable name expected: I=3;i=I;print(i)
*** ^----------------


Печать с ведущими нулями. А как надо?
for( i=8,12, if( i<10, print1("0") ); print(i," ") );
08
09
10
11
12


Двойной факториал. А как можно?
for(n=1,11, print( n"!! = "prod( i=1,floor(n/2),2*i+n%2) ) )
1!! = 1
2!! = 2
3!! = 3
4!! = 8
5!! = 15
6!! = 48
7!! = 105
8!! = 384
9!! = 945
10!! = 3840
11!! = 10395

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение13.12.2022, 20:26 
gris в сообщении #1573690 писал(а):
В print можно не ставить запятые?
Формально можно, но создаётся каша и непонятно где сами строки, а где переменные. Ну и нафига экономить символы? Это раскладывание грабель самому себе на будущее.
gris в сообщении #1573690 писал(а):
Печать с ведущими нулями. А как надо?
Всё что сложнее простой печати объекта лучше делать через printf, там куча возможностей по управлению форматом вывода.
gris в сообщении #1573690 писал(а):
Ругается на переменную I. Еле дошло, что это функция!
I=3;i=I;print(i)
Так - применять переменные отличающиеся только регистром символов - вообще лучше не делать никогда. Сами себе создаёте лишние проблемы.
К тому же некоторые функции самого PARI зависят от регистра и могут иметь разное значение.

-- 13.12.2022, 20:36 --

gris в сообщении #1573690 писал(а):
Двойной факториал. А как можно?
for(n=1,11, print( n"!! = "prod( i=1,floor(n/2),2*i+n%2) ) )
Смотрим в A006882, там приведены и PARI программы, в частности:
Код:
a(n) = prod(i=0, (n-1)\2, n - 2*i )
Что отличается от Вашей (например 0‼=1).

PS. Снова повторю пожелание пользоваться тегом code (или варианта text в syntax), и удобнее, и стрелки указания на ошибку съезжать не будут.

-- 13.12.2022, 20:38 --

Кроме того, любой кратный факториал можно вычислить через гамма-функцию (gamma()), формула есть в вики.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение13.12.2022, 20:56 
Аватара пользователя
Спасибо. Да, с регистрами больше не балуюсь. \ - целочисленное деление. Запомню.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение13.12.2022, 21:05 
Dmitriy40 в сообщении #1573709 писал(а):
Что отличается от Вашей (например 0‼=1).
А вот тут я не прав оказывается, не проверил сразу: код отличается, а результат совпадает, у Вас тоже 0‼=1. Так что можно и так и так.

 
 
 
 Re: интерактивный курс: введение в программирование на PARI/GP
Сообщение13.12.2022, 21:21 
gris в сообщении #1573690 писал(а):
Печать с ведущими нулями. А как надо?

Надо читать про printf()
Ведущие нули добавляем так:
? for( i=8,12,printf("%02d\n",i))
08
09
10
11
12
?


Я так понимаю формат там "стандартный"(сишный), можно читать например Википедию https://ru.wikipedia.org/wiki/Printf

(Например:)

? for(n=1,11, printf("%02d!! = %05d\n",n,prod( i=1,floor(n/2),2*i+n%2) ) )
01!! = 00001
02!! = 00002
03!! = 00003
04!! = 00008
05!! = 00015
06!! = 00048
07!! = 00105
08!! = 00384
09!! = 00945
10!! = 03840
11!! = 10395
?

 
 
 [ Сообщений: 812 ]  На страницу Пред.  1 ... 34, 35, 36, 37, 38, 39, 40 ... 55  След.


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