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
11766
Россия, Москва
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
11766
Россия, Москва
Наиболее длинные палиндромы в первом миллионе знаков $\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
12058
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
11766
Россия, Москва
ОК, тогда количество совпадает с Вашим:
Код:
? 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
12058
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
11766
Россия, Москва
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
12058
Только надо не забыть показать, что результат равномерно распределён ;)

 Профиль  
                  
 
 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
12058
Из соседней темы.
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
11766
Россия, Москва
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
11766
Россия, Москва
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, Супермодераторы



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

Сейчас этот форум просматривают: DariaRychenkova


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

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