This site is supported by donations to The OEIS Foundation.
User talk:Anders Hellström/Pari
Next prime
Note that A151800 can be implemented as nextprime(n+1)
which is faster and simpler than your current np()
program.
Charles R Greathouse IV 16:35, 12 September 2015 (UTC)
Missing functionality
- saving program/session to file.
You might be interested in writebin
, which (when given no object) dumps all user variables (including functions) to the specified file. You can read this back to a clean session to get back to where you were, aside from the history entries %1, %2, etc. You might also be interested in default(histfile, 1)
.
- vector(size,i=-1,some_expr(i))
You've already noticed that you can do vector(size,i,some_expr(i-2))
. You might also like apply(some_expr, [start..end])
.
- listing all userdefined functions.
Just type ?0
.
Charles R Greathouse IV 16:15, 14 September 2015 (UTC)
indexof
An alternative to
indexof(n)=i=1;while(prime(i)<n,i++);i \\Index of smallest prime > n
would be
indexof(n)=primepi(n-1)+1
which is significantly faster for large n. For example,
for(n=1,1e5,indexof(n))
takes 1min, 5s with your code but only 31ms with mine.
Charles R Greathouse IV 18:24, 16 September 2015 (UTC)
Thoughts
Just some thoughts on your functions:
divides(n,m)=my(r=m/n);r==floor(r)
is most efficiently written
divides(n,m)=m%n == 0
and if you have the need to divide two numbers without remainder x\y
is often easier/faster than floor(x/y)
.
I agree that issemiprime
would be very welcome. The PARI library has ways to do partial factorization, so that (for example)
moebius(randomprime(10^100)*randomprime(10^100)*9)
returns 0 almost instantly even though it couldn't reasonably factor such a large number. But this isn't exposed in GP so you either need to factor the number fully (like in your code) or you need to cobble together rudimentary partial factorization in GP, which is slow compared to what the library can do. I have PARI code which does this efficiently, plus a GP script which does the best that it reasonably can without access to the PARI internals.
vecprod1(v,n)=my(p=1);for(i=1,n,p*=v[i]);p; \\product up to n-th element of v
could be
vecprod1(v,n)=factorback(v[1..n]); \\product up to n-th element of v
I'm sure your Ackermann function is not designed to be efficient, but if you wanted it to be:
A(m,n)=if(m>3,if(n,A(m-1,A(m,n-1)),A(m-1,1)),m==3,2^(n+3)-3,m==2,2*n+3,m==1,n+2,n+1)
will happily compute A(4,2) > 10^19728
in under a millisecond.
I think that perhaps
expr(v)={my(l = #v,r=0);for(i=1,l,r += prime(i)^v[i];)}
is intending to be
expr(v)=sum(i=1,#v, prime(i)^v[i])
which could be done somewhat more efficiently (not that it's needed here) as
expr(v)=my(s); forprime(p=2,prime(#v), s += p^v[i]); s
I hope that some of these are useful or interesting.
Charles R Greathouse IV 02:37, 12 December 2016 (UTC)
Thanks for your comments // Anders Hellström 03:58, 19 December 2016 (UTC)