| Ruud H.G. van Tol on Wed, 29 Dec 2021 22:59:58 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: factor(x+1) |
On 2021-12-29 20:25, Ruud H.G. van Tol wrote:
A 2,3 specific variant: [...] 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.
While making this variant,
I hit some interesting bugs,
like decode(encode(13)) returning 53.
(under Collatz, 3*53+1 -> 5, 3*13+1 -> 5,
because 53=8i+5, so can be replaced by 2i+1, repeatedly)
(Remember Bob Ross's Happy Accidents?)
The current encoding has a redundant side.
For example 26, can now be encoded as terse as
[0, -3] \\ 3^3-1
but also as
[1,[1,[3,0]]] \\ 2*(2*(2^3-1)-1)
which I currently like about it,
but I feel that it still can be improved.
-- Ruud
This time I left in some handy DEBUG code.
tofp23(x0, m= 0, DL= 0)= {
if( x0 < 1,return([]) );
if(DL,print("-to-1.x0=",x0," m=",m));
my
( x= x0 + m
, v2= valuation(x,2)
, v3= valuation(x,3)
);
if(DL,print("-to-1.x=",x," v2=",v2," v3=",v3));
x/= 2^v2;
x/= 3^v3;
my
( v= if
( x == 1
, if
( m
, [v2,v3]
, [if(v2,if(v3,[v2,v3],v2),-v3)]
);
, [ (if(v2,if(v3,[v2,v3],v2),-v3))
, tofp23(x,1,DL)
];
);
);
if(DL,print("-to-1.v=",v));
v;
}
fromfp23(v, DL= 0)= {
if(!#v, return(0));
v= Vecrev(v);
if(DL,print("-fr-1.v=",v));
my(n= 1);
for
( i=1, #v
, my( w= v[i] );
if(DL,print("-fr-2.w=",w));
if
( type(w) != "t_VEC"
, w= if(w<0,[0,-w],[w,0]);
);
if(DL,print("-fr-3.w=",w));
my( f= if
( (type(w[1]) == "t_VEC")
||(type(w[2]) == "t_VEC")
, fromfp23(w, DL);
, (2^w[1]*3^w[2]);
);
);
if(DL,print("-fr-8.f=",f));
n*= if( i < #v, f-1, f);
if(DL,print("-fr-9.n=",n));
)
;n
}
{ my(DL= 0);
for(i=1, 19
, my( v= tofp23(i,0,DL) );
print(i,": ", v, " -> ", fromfp23(v,0))
);
}