| Ruud H.G. van Tol on Wed, 29 Dec 2021 20:25:43 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: factor(x+1) |
On 2021-12-29 14:55, Ruud H.G. van Tol wrote:
On 2021-12-29 14:38, Bill Allombert wrote:On Wed, Dec 29, 2021 at 02:12:14PM +0100, Ruud H.G. van Tol wrote:
Example: 103 -> 2^3*13 -> 2^3*(2*7-1) -> 2^3*(2*(2^3-1)-1)It seems to me you should only keep the exponents and work backward: Try this:tofp1(x)=my(v=valuation(x,2));x>>=v;if(x==1,return([v]),concat(v,tofp1(x+1)))fromfp1(v)=my(n=1);v=Vecrev(v);for(i=1,#v,n=2^v[i]*n-1);n+1 ? tofp1(103) %18 = [0,3,1,3] ? 2^0*(2^3*(2^1*(2^3-1)-1)-1) %20 = 103 ? fromfp1([0,3,1,3]) %21 = 103Thanks, that really helps! I forgot to mention that I'd like to stop at some minimal factor, being 3 in my example. (so no 3 -> 2^2-1 step)
A 2,3 specific variant:
- - - - -
tofp23(x0, m= 0)= {
if( x0 < 1, return([]) );
my
( x= x0 + m
, v2= valuation(x, 2)
, v3= valuation(x, 3)
);
x/= 2^v2;
x/= 3^v3;
if
( x == 1
, if
( m
, [v2,v3]
, [[v2,v3]]
);
, [ [v2,v3]
, tofp23(x,1)
];
);
}
fromfp23(v)= {
if( !#v, return(0) );
my( n= 1 );
v= Vecrev(v);
for
( i= 1, #v-1
, my
( w= v[i]
, f= if
( type(w[1]) == "t_VEC"
, fromfp23(w);
, (2^w[1] * 3^w[2]);
);
);
n*= f - 1;
);
( n * (2^v[#v][1] * 3^v[#v][2]) );
}
for(i=1, 12, my(v=tofp23(i)); print(i,": ", v, " -> ", fromfp23(v)))
- - - - -
My next step could be to use a t_INT when there is a zero.
I have no specific use for this yet,
it is still mainly a personal code exercise.
-- Ruud