Ruud H.G. van Tol on Mon, 03 Jan 2022 17:28:40 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Collatz partitions |
My "Collatz sieve" formula: 2^p2 * i + c2 -> 3^p3 * i + c3 (i >= 0) - - - - - `c2` = 0, represents all evens: 2^(1) * i + (0) -> 3^(0) * i + (0) or as a vector: [p2,c2,p3,c3] = [1,0,0,0] Each odd `c2` represents a "partition", identified by its smallest element (`c2`). Each partition has a single offset (2^`p2`) to generate the next elements. partition_c2(n == 0) = `c2` partition_c2(n > 0) = partition_c2(n-1) + 2^`p2(c2)` - - - - - For any odd `c2`: - each `p2` is the minimal power-of-2 where 2^`p2` > 3^`p3`: floor(1+p3*log(3)/log(2)) - so each `p3` is the maximal power-of-3 where 3^`p3` < 2^`p2`: floor(p2*log(2)/log(3)) ? [ [3^p3, (my(p2=floor(1+p3*log(3)/log(2)))*0+ 2^p2)] | p3 <- [0..5] ] [[1, 2], [3, 4], [9, 16], [27, 32], [81, 128], [243, 256]] ? [ [2^p2, (my(p3=floor(p2*log(2)/log(3)))*0+ 3^p3)] | p2 <- [0..5] ] [[1, 1], [2, 1], [4, 3], [8, 3], [16, 9], [32, 27]] (so that [8, 3] will never be involved) - - - - - My next aim is (still) to show how to efficiently limit the search space when going back from c3 to c2. There is an optimal (first-lower) c3 for every c2, but there are 1-or-more c2 (partitions) for each c3. -- Greetings, Ruud - - - - - /* How to (optimally) go from c2 to c3: 1. c3 is the first-lower (odd or even) value in the trajectory of c2; 2. p3 is the number of triplings involved; 3. p2 is the number of halvings involved (for odd c2: the first power-of-2 greater than p3); This maps any value to a lower value, etc. */ c2_c3( c2= 0 )= { \\ evens: 2^(1)*x+(0) -> 3^(0)*x+(0) if( (c2 < 1), return([1,0,0,0]) ); my( p2= valuation(c2,2) ); c2/= 2^p2; \\oddify \\ 2^(2)*(x+i)+1 -> 3^(1)*(x+i)+1 (i >= 0) if ( (1 == (c2 % 4)) , return([ 2, c2, 1, 3*(c2-1)/4 +1 ]) ); my( p3= 0, c3= c2 ); while ( (c3 >= c2) , c3= (3 * c3 + 1) / 2; p2++; p3++; while ( !(c3 % 2) , c3/= 2; p2++; if( (c3 <= c2), break); \\dropper ); ); [ p2, c2, p3, c3 ]; } /* Map zero (which represents all evens) and any odd > 0, to its (unique, optimal) "Collatz sieve" formula: */ show_c2_c3( x= 0, N= 29 )= { if ( x && !(x%2) , error("x must be either 0, or an odd, so not (",x,")"); ); my( n0= if( x, (x-1)/2, 0 ) ); for ( n= n0, n0 + N , my( [p2,c2,p3,c3]= c2_c3( if( n, (n-1)*2+1, 0 ) ) ); if ( (c2 <= 2^p2) \\hide duplicates , printf ( "%3s| (%5sx + %3s) -> (%4sx + %3s) (%s, ...)\n" , n, Str("2^",p2), c2, Str("3^",p3), c3 , strprintf ( "%3s, %3s+ 1*2^%2s, %3s+ 2*2^%2s" , c2, c2, p2, c2, p2 ); ); ); ); } \\ Example: show_c2_c3(0,91) - - - - - --