| R J Cano on Sun, 14 May 2017 16:40:02 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: About isperm() |
Merci.
Well, I also noticed that the max k possible is for #binary(N);
So we can be sure that what we are looking is between #binary(N)-1 >= k >= 2
Due N in base N is "10".
Yes it is a great deal regarding time reduction.
Great!, thanks Bill :-)
2017-05-14 8:38 GMT-05:00, Bill Allombert <Bill.Allombert@math.u-bordeaux.fr>:
> 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.
>