Ruud H.G. van Tol on Sun, 08 Jan 2023 21:49:39 +0100


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

lookup-optimization



In the below code I build up a set 's',
against which I first check each new case
for "congruence".

If no such case was found,
then the new case gets added to the set.

Each element of 's' is a tuple
of a power-of-2 and an offset.

(1) I wonder if Mod() is better for that. Or store the sum?
(2) Would vecsearch() be good to use for this?
(3) Any ideas on doing things differently, are welcome.

-- Greetings, Ruud

- - - - - - - - - - - - - - - - - - -

A243115( N=575, V=0 )= {
  my
  ( r= []  /* result */
  , s= []  /* lookup-set */
  , t= [ [1,2,1,1], [2,1,1,0] ]  /* detailed table */
  );

  forstep
  ( v2= 3, N, 4
  , my( found= 0 );
    for /* Look up v2-class in s */
    ( i=1, #s
    , if
      ( s[i][2] == v2 % 2^s[i][1]
      , found= 1;
        break;
      );
    );
    if( found, next );

    my( p2= 0, p3= 0, v3= v2 );
    until
    ( v3 <= v2  /* until drop */
    , if
      ( v3 % 2
      , v3+= v3\2 + 1; p3++;
      , v3\= 2;
      );
      p2++;
    );
    r= concat(r, v2); /* store */
    s= Set( concat(s, [ [p2, v2] ]) );
    if( 1 < V, t= concat(t, [ [v2, p2, v3, p3] ]) );
  );

  if
  ( 1 < V  /* p.table */
  , for
    ( i=1, #t
    , my( [v2, p2, v3, p3]= t[i] );
      printf
      ( "%4s + i* 2^%3s -> %4s +i* 3^%3s\n"
      , v2, p2, v3, p3
      );
    );
    print("[...]")
  );
  if( V, print("s=", s) ); /* p.lookup-set */
  print("r=", r);  /* p.result */
}

See also https://oeis.org/A243115

? A243115();  \\ non-verbose run (default)
r=[3, 7, 11, 15, 23, 27, 31, 39, 47, 59, 63, 71, 79, 91, 95, 103, 111, 123, 127, 155, 159, 167, 175, 191, 199, 207, 219, 223, 231, 239, 251, 255, 283, 287, 303, 319, 327, 347, 359, 367, 383, 411, 415, 423, 447, 463, 479, 487, 495, 507, 511, 539, 543, 559, 575]
cpu time = 4 ms, real time = 4 ms.

? A243115( 100, 2 );  \\ verbose run
[...]

? A243115(10^5);
r=[...]
cpu time = 5,156 ms, real time = 5,192 ms.

-o-o-o-o-o-o-o-o-