| Bill Allombert on Sun, 14 May 2017 15:38:57 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: About isperm() |
On Sun, May 14, 2017 at 08:06:46AM -0500, R J Cano wrote:
> Greetings!,
>
> Dear Bill,
>
> I found out this one, based only on Mersenne numbers: Those 2^x-1;
>
> isperm(N)={
> my(x, y, z, t, t0);
> for(B=2, max(2, N-1),
> y=digits(N, B);
> x*=0;
> for(i=1, #y,
> t=1<<y[i];
> if(bitand(x, t),
> x*=0;
> break,
> x+=t)
> );
> if(x,
> t0=!(x%2);
> x++;
> x+=t0);
> t=ispower(x, , &z);
> if(t&&z==2,
> return(B)
> )
> );
> return(0)
> }
You can improve performance a lot for large N by noting that there is an
inequality: if k is the number of digits then:
B^{k-1} <= sum_{i=0}^{k-1} (k-i)*B^i <= N <= sum_{i=0}^{k-1} (i+1)*B^i <= k*(B^k-1)/(B-1)
so
B^{k-1} <= N <= k*(B^k-1)/(B-1)
So for each k, by solving this for B, you get a small range of B to check.
For small k, you can also check all the possible permutation:
test(N,k)=for(i=0,k!-1,my(R=nfroots(,Pol(numtoperm(k,i))-N));if(#R,return(vecmin(R))))
Cheers,
Bill.