Для первой операции есть команда
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 --Код:
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,
Вам не кажется что это всего лишь список простых чисел и
так сложно их вычислять нет нужды?