2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1 ... 34, 35, 36, 37, 38, 39, 40 ... 54  След.

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


13/08/08
14495
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 


05/09/16
12067
gris
Да, для сочетаний из $n$ элементов по $k$ есть встроенный итератор forsubset(), для сочетаний с повторениями такого нет (концепция множества не подразумевает неуникальность элементов, наверное поэтому). Хотя тут даже не сочетания с повторениями, раз вы 112 и 121 за разные комбинации считаете. Но это и не размещения т.к. порядок одинаковых элементов не важен.

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


05/09/16
12067
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 
Аватара пользователя


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

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


05/09/16
12067
waxtep в сообщении #1572722 писал(а):
Вообще я хотел "от руки" написать рекурсивную функцию,

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

-- 05.12.2022, 23:01 --

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

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

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


13/08/08
14495
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 
Заслуженный участник


20/08/14
11785
Россия, Москва
gris в сообщении #1573572 писал(а):
Главное, не запутаться во вложении циклов.
Что за next(3)? Продолжить цикл на три уровня выше - а он разве есть такой?

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


05/09/16
12067
gris в сообщении #1573572 писал(а):
Главное, не запутаться во вложении циклов.

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

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


13/08/08
14495
Код:
{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 
Заслуженный участник


20/08/14
11785
Россия, Москва
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 
Заслуженный участник
Аватара пользователя


13/08/08
14495
мелочёвка
В 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 
Заслуженный участник


20/08/14
11785
Россия, Москва
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 
Заслуженный участник
Аватара пользователя


13/08/08
14495
Спасибо. Да, с регистрами больше не балуюсь. \ - целочисленное деление. Запомню.

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


20/08/14
11785
Россия, Москва
Dmitriy40 в сообщении #1573709 писал(а):
Что отличается от Вашей (например 0‼=1).
А вот тут я не прав оказывается, не проверил сразу: код отличается, а результат совпадает, у Вас тоже 0‼=1. Так что можно и так и так.

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


05/09/16
12067
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
?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 810 ]  На страницу Пред.  1 ... 34, 35, 36, 37, 38, 39, 40 ... 54  След.

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



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

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


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

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