2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1 ... 44, 45, 46, 47, 48, 49, 50 ... 54  След.

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


20/08/14
11867
Россия, Москва
wrest
Для обнаружения палиндрома не нужно проверять его весь, достаточно найти его центр, а это всего лишь одно условие v[a]==v[a+2] для нечётных палиндромов и v[a]==v[a+1] для чётных, причём a проходит лишь один раз по вектору (исключая конец). Вложенные палиндромы будут считаться за отдельные, как и у Вас.

Кстати цикл можно "убрать" внутрь vector если вектора не слишком большие и памяти не жалко:
f=vector(#v-2,a,v[a]==v[a+2]) для нечётных
f=vector(#v-1,a,v[a]==v[a+1]) для чётных
В f[] будет признак наличия центра палиндрома, можно проверить их количество vecsum(f) или координаты select(x->x+1,f,1).

Если была бы команда покомпонентного сравнения векторов cmp(), то можно было бы обойтись вообще только ей, сравнивая исходный вектор и его сдвинутую копию:
f=cmp(v[1..#v-2],v[3..#v]) для нечётных
f=cmp(v[1..#v-1],v[2..#v]) для чётных

-- 14.06.2023, 12:03 --

Палиндромов в $\pi$ насчиталось несколько меньше:
Код:
? \p 1000000
   realprecision = 1000016 significant digits (1000000 digits displayed)
? v=digits(floor(Pi*10^1000000))[1..1000000];
time = 312 ms.
? c=0; for(a=1,#v-1, if(v[a]==v[a+1], c++)); for(a=1,#v-2, if(v[a]==v[a+2], c++)); c
time = 266 ms.
%1 = 200018
? c=0; for(a=1,#v-2, if(v[a]==v[a+2], c++)); c \\Нечётных
time = 141 ms.
%2 = 100072
? c=0; for(a=1,#v-1, if(v[a]==v[a+1], c++)); c \\Чётных
time = 140 ms.
%3 = 99946
? c=0; for(a=1,#v-2, if(v[a]==v[a+1] || v[a]==v[a+2], c++)); if(v[#v]==v[#v-1], c++); c \\Без перекрытия центров чётных и нечётных палиндромов
time = 265 ms.
%4 = 190098

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


20/08/14
11867
Россия, Москва
Наиболее длинные палиндромы в первом миллионе знаков $\pi$:
Код:
? k=12; for(a=1,#v-k, if(v[a..a+k]==Vecrev(v[a..a+k]), print(a,": ",v[a..a+k])));
879327: [9, 4, 7, 5, 0, 8, 2, 8, 0, 5, 7, 4, 9]
time = 608 ms.
? k=11; for(a=1,#v-k, if(v[a..a+k]==Vecrev(v[a..a+k]), print(a,": ",v[a..a+k])));
273841: [4, 5, 0, 1, 9, 7, 7, 9, 1, 0, 5, 4]
time = 579 ms.

Первое вхождение палиндрома соответствующей длины (все они есть в A280631):
Код:
? for(k=1,19, for(a=1,#v-k, if(v[a..a+k]==Vecrev(v[a..a+k]), print(k+1,":",a,": ",v[a..a+k]);break)));
2:25: [3, 3]
3:2: [1, 4, 1]
4:44: [3, 9, 9, 3]
5:20: [4, 6, 2, 6, 4]
6:763: [9, 9, 9, 9, 9, 9]
7:641: [1, 7, 3, 6, 3, 7, 1]
8:3733: [2, 3, 9, 1, 1, 9, 3, 2]
9:6578: [3, 9, 8, 9, 8, 9, 8, 9, 3]
10:16062: [0, 1, 3, 6, 7, 7, 6, 3, 1, 0]
11:247147: [2, 1, 3, 4, 8, 8, 8, 4, 3, 1, 2]
12:273841: [4, 5, 0, 1, 9, 7, 7, 9, 1, 0, 5, 4]
13:879327: [9, 4, 7, 5, 0, 8, 2, 8, 0, 5, 7, 4, 9]
time = 5,914 ms.

Во всех случаях печатается номер цифры начиная с 1, причём первой считается тройка целой части - в отличие от обычной нумерации, в том числе в OEIS.
Кстати 6 девяток это известный факт (A096763), с 762-й цифры дробной части.

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


05/09/16
12109
Dmitriy40 в сообщении #1597528 писал(а):
Палиндромов в $\pi$ насчиталось несколько меньше:

Так вы там считаете только "ядра" длиной 2 для четных и длиной 3 для нечетных.
Код:
? v=digits(1111)
%176 = [1, 1, 1, 1]
? c=0; for(a=1,#v-1, if(v[a]==v[a+1], c++)); c
%177 = 3
?

А должно быть 4 чётных в 1111.
Три палиндрома 11 и ещё один 1111

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


20/08/14
11867
Россия, Москва
ОК, тогда количество совпадает с Вашим:
Код:
? cc=0; for(k=1,14, c=0; for(a=1,#v-k, if(v[a..a+k]==Vecrev(v[a..a+k]), c++)); print(k+1,": ",c); cc+=c;); print("all=",cc);
2: 100072
3: 99946
4: 10010
5: 10027
6: 992
7: 982
8: 104
9: 107
10: 10
11: 9
12: 1
13: 1
14: 0
15: 0
all=222261
time = 7,145 ms.

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


05/09/16
12109
Dmitriy40 в сообщении #1597553 писал(а):
ОК, тогда количество совпадает с Вашим:

Да, но вообще-то, в универсальном случае, надо проверять не до 14, а до длины входа :mrgreen:
Я ж о чем и толковал, что не надо проверять все подстроки (вы проверяете все длиной до 14), а надо искать "зародыши" и дальше смотреть куда они вырастают.

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


13/08/08
14495
vr=vector(64,i,random(10));
vr[1]=4;
nr=fromdigits(vr);

44733131111209662464878914306603
66550506091723939051591260629787

Получение случайного число в интервале (4Е63, 5Е63)
Как-то неуклюже :oops:
:?:

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


20/08/14
11867
Россия, Москва
gris в сообщении #1597739 писал(а):
Получение случайного число в интервале (4Е63, 5Е63)
Ну раз random() не умеет выдавать произвольно большое число, то приходится ограничиваться возможным диапазоном, например генерить "цифры" по 1e9 (вместо по 10):
nr=fromdigits(vector(7,i,random(10^9)),10^9)+4*10^63

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


05/09/16
12109
Только надо не забыть показать, что результат равномерно распределён ;)

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


13/08/08
14495
wrest, интервалы "цифр" учётом позиции не пересекаются и заполняют весь заданный интервал. Хотя он, конечно, мною задан неудачно. Равномерное распределение будет на[4e63, 5e63), но и на открытом (4e63, 5e63) оно тоже будет равномерно. Хотя иногда будет отмечено вылетание за интервал левого конца :oops: И, конечно, имеется в виду распределение на натуральных числах.
Да?

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


13/08/08
14495
Вот тут задачку в помогальной теме загадали под заголовком 2520. Пропагандируя ПАРИ студентам, отмечающих окончание сессии без хвостов, для смеха решил задачку строкой :-)
vecsum(vector(900,n,(n+99)*eval(vecsum(vector( 10,j,
vecsum(vector(10,j,(n+99)%j==0)[j..10])==11-j )
)>2)))

Заодно поздравляю причастных :!: :!: :!:

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


05/09/16
12109
Из соседней темы.
maxal в сообщении #1599995 писал(а):
eval лучше не использовать для вычисления значений многочленов (оно не использует схему Горнера). Подставлять значения $x$ в $f(x)$ можно так: subst(f,x,3) или если нет уверенности в имени переменной, то subst(f,variable(f),3).

Спасибо maxal за замечание.
Проверил разницу, чтобы точнее представлять о чём, в плане скорости, речь. Хозяйке на заметку, так сказать.
Код:
? v=vector(1000,i,random(10^1000));
? p=Pol(v,'x);
? x=754;print(eval(p)-subst(p,variable(p),754))
0
? for(i=1,100000,x=i;a=eval(p));
? ##
***   last result computed in 35,576 ms.
? for(i=1,100000,a=subst(p,variable(p),i));
? ##
***   last result computed in 29,506 ms.
?

eval() при вычислении значения многочлена медленнее subst() в пределах 15-20%

Если коэффициенты поменьше, до $10^{10}$ против $10^{1000}$ в предыдущем примере:

Код:
? v=vector(1000,i,random(10^10));
? p=Pol(v,'x);
? x=754;print(eval(p)-subst(p,variable(p),754))
0
? for(i=1,100000,x=i;a=eval(p));
? ##
***   last result computed in 25,511 ms.
? for(i=1,100000,a=subst(p,variable(p),i));
? ##
***   last result computed in 22,382 ms.
?

то и разница в скорости снижается и становится ближе к 10-15%

В поддержку eval() скажу, что ей легче пользоваться.

 Профиль  
                  
 
 работа с файлами
Сообщение10.07.2023, 15:44 
Заслуженный участник
Аватара пользователя


13/08/08
14495
некто сваливает в папку текстовые файлы с именами data_1 ... data_2000. В каждом файле от нуля до 12 строк произвольного содержания. Я хочу прочитать все файлы и переписать все строки в один файл. Попытка:
Код:
{pth="C:/GRIS/data_txt/";
fout = fileopen("C:/GRIS/data_txt/data_total.txt","w");
for( i=1,2000,
  namefile=strprintf("%sdata_%d.txt",pth,i);
  fin= fileopen(namefile);
  while (str = filereadstr(fin),
    filewrite(fout,str);
  );
  fileclose(fin);
);
fileclose(fout);
}

Работает в идеальных условиях. Но хочется улучшения.
Можно ли прочитать вообще все файлы в заданной папке по некоторому шаблону с использованием *?
Как обойти ошибку при открытии несуществующего файла?
При чтении файлов без их закрытия возникает случайное переполнение чего-то... Надо закрывать каждый?
Лучше писать каждую строку или сформировать вектор строк и его сразу записать.
Файлов может быть много.
Спасибо.

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


20/08/14
11867
Россия, Москва
gris в сообщении #1600480 писал(а):
При чтении файлов без их закрытия возникает случайное переполнение чего-то... Надо закрывать каждый?
Разумеется надо закрывать каждый! Всегда, не только в этой программе! Неужели в детстве не научили убирать за собой мусор? ;-)

gris в сообщении #1600480 писал(а):
Можно ли прочитать вообще все файлы в заданной папке по некоторому шаблону с использованием *?
Командой MS-DOS:
Код:
type data_*. 2>nul 1>data_total.txt
Несуществующие файлы не мешают.
Перебирает все файлы.
Не требует наличия PARI/GP.
Не требовательна к памяти.
Выводит файлы в "произвольном" (не совсем, но совершенно не обязательно в ожидаемом) порядке.

На PARI/GP сделать можно, но слишком по левому: получить список нужных файлов вызовом команды ОС dir, потом уже их открывать по списку и читать.

-- 10.07.2023, 16:11 --

gris в сообщении #1600480 писал(а):
Как обойти ошибку при открытии несуществующего файла?
Использовать универсальную конструкцию iferr с ошибкой e_FILE (описание почти в самом низу страницы).

-- 10.07.2023, 16:15 --

(Оптимальное решение)

gris в сообщении #1600480 писал(а):
некто сваливает в папку текстовые файлы
Перестать страдать фигнёй и переделать ту программу, из которой и вываливается эта куча файлов. Скорее всего она (та программа) даже вообще окажется ненужной.

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


13/08/08
14495
Dmitriy40, спасибо.
Добавил строку
ier=iferr(fileopen(namefile), ERR, next);
в ier считается количество открываний :-)
А нельзя ли iferr использовать как счётчик выполнений определённой команды?

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


20/08/14
11867
Россия, Москва
gris в сообщении #1600502 писал(а):
Добавил строку
ier=iferr(fileopen(namefile), ERR, next);
в ier считается количество открываний :-)
Что-что считается? Это каким же образом? Если каждая успешная попытка открытия перезаписывает переменную на file descriptor открытого файла (который совершенно не обязан идти подряд по натуральным числам!), а неуспешная переменную не меняет.
И кстати переменная должна быть не ier, а fin.

gris в сообщении #1600502 писал(а):
А нельзя ли iferr использовать как счётчик выполнений определённой команды?
А зачем? Если можно просто count++;command в любом месте?
Может Вы будете понятнее формулировать свои задача/хотелки?

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

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



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

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


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

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