| Ruud H.G. van Tol on Thu, 30 Dec 2021 12:53:10 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Collatz sieving |
On 2021-12-23 02:50, Ruud H.G. van Tol wrote:
Collatz-afficionados will like this:
Variant, and now with statistics:
? run2(2^12+1)
- - - - -
#s : 16389 (bits)
max(c2) : 8195
next(c2): 16437
sieved : 97.76%
took : 12.18s
- - - - -
-- Ruud
- - - - - - -
a2(n)= {
if( n < 1, return([2,0,1,0])); \\ (2*i+0) -> (1*i+0)
my
( v2= 4
, c2= 2 * n - 1
, v3= v2
, c3= c2
);
while
( 1
, v3= 3 * v3 / 2;
c3= (3 * c3 + 1) / 2;
while
( !(v3%2) && !(c3%2)
, v3/= 2;
c3/= 2;
);
if( (v3 < v2), break ); \\ dropper
if
( v3 % 2
, v2*= 2;
v3= v2;
c3= c2;
)
);
[v2,c2,v3,c3];
}
run2( N= 99, VERBOSE= 0 )= {
my
( s= binary(16^N) \\ ok to enlarge
, t0= getabstime()
);
for
( n= 0, N
, my(v= a2(n));
for
( i= 0, #s
, my(k= v[2] + i*v[1] + 1);
if(k > #s, break); \\ dropper
s[k]++;
);
if
( VERBOSE
, printf
( "%3s| (%7sx +%3s) -> (%7sx +%3s)\n"
, n,sf(v[1],2^10),v[2],sf(v[3],3^5),v[4]
)
)
);
my
( t1= getabstime()
, r= select(x->!s[x+1],[0..#s-1])
);
printf
( "- - - - -
#s : %s (bits)
max(c2) : %s
next(c2): %s
sieved : %.2f%%
took : %.2fs
" , 2 * N + 1
, 2 * r[1] - 1
, 100 * (#s - #r) / #s
, (t1 - t0) / 1000
);
}
- - - - - - -