poniedziałek, 14 lutego 2022

Palindromiczne liczby pierwsze (Palindromic prime numbers)

Naiwnie
 select( i -> i == fromdigits( Vecrev( digits( i ) )), primes( [ 2, 1000 ] ) )

Lepiej

  1. p10( n ) = 10^n;
  2.  
  3. rew( m, c ) = {
  4.     local( t, n );
  5.     t = 0; n = m;
  6.     for(i=1, c,
  7.         t = t*10 + n%10;
  8.         n \= 10 );
  9.     return( t ) }
  10.  
  11. range( p, w, disp = 0 ) = {
  12.     local( w10, mi, mj, z, pal, q ,= -1);
  13.     w10 = p * p10( w ) + p;
  14.     mi  = p10( w \ 2 + 1 );
  15.     mj  = p10( w \ 2     );
  16.     z   = p10( w \ 2 - 1 ) - 1;
  17.     for( i = 0, z,
  18.         pal = rew( i, w\2 );
  19.         q = w10  + i * mi + pal;
  20.         for( j = 0, 9,
  21.             if( isprime(+ j * mj ),
  22.                 k++;
  23.                 if( disp,
  24.                    if((% 8)==0,print());
  25.                    print1( q + j * mj, "\t") ) ) ) );
  26.     return( [ k+1, q + 9*mj ]); }

  27. gener( disp=0 ) = {
  28.     local( t=[ 1, 3, 7, 9], s=5, x,start );
  29.     start = getabstime();
  30.     for( w = 1, 8,
  31.         for( i = 1, 20 - 2*w, print1(" "));
  32.         print1( p10(w*2));
  33.         for( i = 1, 4,
  34.             print1(".");
  35.             x=range(t[i], w*2, disp);
  36.             s+=x[1]; );
  37.     printf( "\t %20d  # %8d   %8.3g [sec]\n", 
  38.                 x[2] s,  (getabstime()-start)/1000.0) )
  39. }