2014 dxdy logo

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

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




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


22/11/13
498
Иногда при расчетах на 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 
Заслуженный участник


20/08/14
11072
Россия, Москва
Для первой операции есть команда 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 ] 

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



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

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


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

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