Emmanuel ROYER on Thu, 28 Mar 2024 21:47:28 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Array of the multiplicities of a highly non injective function |
Thank you very much, Your port is exactly what I needed! ----- Mail original ----- De: "Ruud H.G. van Tol" <rvtol@isolution.nl> À: "pari-users" <pari-users@pari.math.u-bordeaux.fr> Envoyé: Jeudi 28 Mars 2024 13:35:11 Objet: Re: Array of the multiplicities of a highly non injective function On 2024-03-28 11:40, Emmanuel ROYER wrote: > Dear Pari-users and developers! > > Suppose we have a symmetrical function f from [1,K]x[1,K] with values > in [1,q] where the integer K is significantly greater than the integer q. > > I want to construct a vector V (of size q) such that each V[a] > contains the number of pairs (i,j) such that a = f(i,j). > > I have two questions > 1) Is there a more efficient way of doing what I want than the code below? > 2) Can we imagine parallelizing, for example, the loop on i ? > > K = 30; > q = 7; > f(i,j) = 1+lift(Mod(i^2+j^2+i*j,q)); > V = vector(q,h,0); > for(i=1,K,V[f(i,i)] += 1;for(j=1,i-1,V[f(i,j)] += 2)); > V > > Comments > - You have to imagine K much larger > - I have fixed f in the example but I want to be able to do something > for any other choice respecting the assumptions (essentially, symmetry). > > > Emmanuel Royer > Professeur à l'Université Clermont Auvergne > https://royer.perso.math.cnrs.fr > ---- > Institut CNRS-Pauli > IRL2842 > CNRS & Wolfgang Pauli Institut Just an innocent port: do(K=30, q=7) = { my(V=Vec(0, q), f(i, j) = 1+lift(Mod(i^2+j^2+i*j, q)) ); for(i=1, K , V[f(i,i)] += 1; for(j=1, i-1, V[f(i,j)] += 2) ); V; } pardo(K=30, q=7) = { my(V=Vec(0, q), f(i, j) = 1+lift(Mod(i^2+j^2+i*j, q)) ); parfor(i=1, K , my(t=Vec(0,q)); t[f(i,i)] += 1; for(j=1, i-1, t[f(i,j)] += 2); t , t , V+=t ); V; } ? do(4000) cpu time = 4,426 ms, real time = 4,468 ms. % [4245387, 1958530, 1958530, 1959673, 1958530, 1959675, 1959675] ? pardo(4000) cpu time = 5,587 ms, real time = 588 ms. % [4245387, 1958530, 1958530, 1959673, 1958530, 1959675, 1959675] -- Ruud