Karim Belabas on Sun, 14 Jul 2019 13:24:00 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Fwd: Re: Using local variable for memoizing in recursion |
* Mike Day [2019-07-14 12:31]: > OK - here's a version which presets a vector of indices, ix, > so you don't need the divide modulo k1. > It doesn't appear to affect the performance much, though, > at least in my Windows 10 interpreter version. I haven't > discovered how to do gp2c ... > > pnkv_4(n,k) = {my(k1=k+1,k2=k+2,t=vector(k2,i,vector(k1)), kx=k1, ky=0, > ix=vector(1+2*k1-1,i,1+(k2-i)%k1), offset=k1); > t[k1][2]=1; > for(i=1, n-1, > for(j=2,k1, > ky=ix[j+offset]; > t[k2][j]=t[kx][j-1]+t[ky][j]); > \\ to examine the current indices... > \\ print(i," ",offset," ",vector(k,l,ix[l+1+offset])); > if(offset, offset--, offset=k); > kx=1+(k+i)%(k1); > t[kx]=t[k2]); > return(t[k2])} > > Tips on how to optimise line by line would be helpful! Here's my take: \\ vecsum(pnkv_4(n,k)), assuming n > 1 pnk_4(n,k) = { my(k1 = k+1, kx = k1, a = 1, t = vector(k1, i, vector(k))); t[k1][1] = 1; for (i = 1, n-1, my(ky = a); t[a] = vector(k, j, if (!(ky--), ky = k1); if (j == 1, t[ky][1] , t[kx][j-1] + t[ky][j])); kx = a; if (a++ > k1, a = 1)); vecsum(t[a-1]); } (12:47) gp > vecsum(pnkv_4(10000,3000)) time = 31,224 ms. %1 = 36167251325636291851786878829976856243927867494801874150751474019863050338273687745917678081066889663513003 (12:47) gp > pnk_4(10000,3000) time = 24,893 ms. %2 = 36167251325636291851786878829976856243927867494801874150751474019863050338273687745917678081066889663513003 Cheers, K.B. -- Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17 Universite de Bordeaux Fax: (+33) (0)5 40 00 21 23 351, cours de la Liberation http://www.math.u-bordeaux.fr/~kbelabas/ F-33405 Talence (France) http://pari.math.u-bordeaux.fr/ [PARI/GP] `