Ruud H.G. van Tol on Wed, 28 Dec 2022 20:14:00 +0100


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

Re: A022921-code



On 2022-12-28 19:53, Ruud H.G. van Tol wrote:

On 2022-12-28 17:51, Karim Belabas wrote:
* Ruud H.G. van Tol [2022-12-28 16:28]:
[ logint(3^(n+1),2) - logint(3^n,2) |n<-[0..98]]

is half as fast as

my(n0=logint(3^0,2)); [ -n0 + n0=logint(3^(n+1),2) |n<-[0..98]]

but IMO looks ugly.

Is there a both "nice" and fast way to do similar?
Not sure about "nice"; but faster, definitely:

? N = 30000;
? w0 = [logint(3^(n+1),2) - logint(3^n,2) | n<-[0..N]];
time = 767 ms.

? my(n0=logint(3^0,2)); w1 = [-n0 + n0=logint(3^(n+1),2) |n<-[0..N]];
time = 355 ms.

? my(v = [logint(x,2) | x <-powers(3, N+1)]); w = vector(#v-1, i, v[i+1]-v[i]);
time = 20 ms.

? [w == w0, w == w1]
%4 = [1, 1]

Pretty "nice" to me.


I'm testing on an M1-Max, and could *not* run your fastest alternative under 120ms.


But then I slightly changed it to

my(v = [logint(x,2) | x <-powers(3, N+1, 1)]); w = vector(#v-1, i, v[i+1]-v[i])

(so added the explicit '1' with powers)

and then it would run at least twice as fast, and would (sometimes) finish in 29ms.
How weird is that? (No need to answer!)


$ gp --version 2>&1 |sed 's/^ *//'
GP/PARI CALCULATOR Version 2.15.1 (released)
arm64 running darwin (aarch64/GMP-6.2.1 kernel) 64-bit version
compiled: Nov  5 2022, Apple clang version 14.0.0 (clang-1400.0.29.202)
threading engine: pthread
(readline v8.2 disabled, extended help enabled)

All split up:

? N= 30000;

? p3=powers(3,N+1);
cpu time = 102 ms, real time = 111 ms.

? p3=powers(3,N+1,1);
cpu time = 31 ms, real time = 43 ms.

? v = [logint(x,2) | x<-p3];
cpu time = 10 ms, real time = 10 ms.

? vector(#v-1, i, v[i+1]-v[i]);
cpu time = 17 ms, real time = 18 ms.

-- Ruud