2014 dxdy logo

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

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




 
 Единицы в посл.-ть и наоборот (PARI)
Сообщение22.12.2021, 19:01 
Аватара пользователя
Иногда при расчетах на PARI требуется выполнить одну из следующих операций:

  • Пусть задана последовательность
    $$\begin{bmatrix}
1 &  2 &  3 &  4 &  5 &  6 &  7 &  8 &  9 &  10 \\
0 &  0 &  0 &  1 &  0 &  0 &  0 &  1 &  1 &  0 
\end{bmatrix}$$$$\begin{bmatrix}
11 &  12 &  13 &  14 &  15 &  16 &  17 &  18 &  19 &  20 \\
0 &  1 &  0 &  0 &  0 &  1 &  0 &  1 &  0 &  1
\end{bmatrix}$$
    Требуется привести ее к виду
    $$4, 8, 9, 12, 16, 18, 20$$
  • Обратная операция

Вот решения в лоб:

Код:
a(n)=isprime(n)
a1(n)=if(n==1,a(1),a1(n-1)+a(n))
f(n) = {my(k=1); while (a(k)*a1(k)!= n, k++); k; }
Код:
b(n)=prime(n)
v=vector(prime(100),i,0)
for(i=1,100,v[b(i)]=1)

В некоторых расчетах они работают относительно медленно. Что здесь можно улучшить?

 
 
 
 Re: Единицы в посл.-ть и наоборот (PARI)
Сообщение23.12.2021, 03:08 
Для первой операции есть команда select:
Код:
? v=[0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,1,0,1,0,1]
%1 = [0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1]
? select(x->(x>0),v,1)
%2 = Vecsmall([4, 8, 9, 12, 16, 18, 20])

Для обратной операции ничего лучше цикла не знаю:
Код:
? v=vector(20); foreach([4,8,9,12,16,18,20],i, v[i]=1); v
%3 = [0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1]

Для информации: forprime работает в разы быстрее комбинации for+isprime/ispseudoprime:
Код:
? n=0; forprime(p=1,10^8, n++);
time = 3,199 ms.
? n=0; for(p=1,10^8, n+=isprime(p));
time = 1min, 9,312 ms.
? n=0; for(p=1,10^8, n+=ispseudoprime(p));
time = 1min, 10,418 ms.


-- 23.12.2021, 03:18 --

kthxbye в сообщении #1543951 писал(а):
Код:
a(n)=isprime(n)
a1(n)=if(n==1,a(1),a1(n-1)+a(n))
f(n) = {my(k=1); while (a(k)*a1(k)!= n, k++); k; }
...
Что здесь можно улучшить?
Код:
? a(n)=isprime(n);
? a1(n)=if(n==1,a(1),a1(n-1)+a(n));
? f(n) = {my(k=1); while (a(k)*a1(k)!= n, k++); k; }
? for(i=1,30, print1(f(i),","))
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,
Вам не кажется что это всего лишь список простых чисел и так сложно их вычислять нет нужды? :mrgreen:

 
 
 [ Сообщений: 2 ] 


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