2 views (last 30 days)

Show older comments

I have made the following code .

x=[0:n-1];

y=[0:n-1];

k = 0;

for i=1:n

for j=1:n

if rem(((y(j))^2)-((x(i))^3)-2*(x(i))-3,n)==0

k = k+1;

xy_mtx(k,:) = [x(i) y(j)];

end

end

end

I want to make it efficient, as efficient as it can be. Is this possible

David Hill
on 8 Jun 2021

n=10;

[x,y]=meshgrid(0:n-1);

idx=mod(y.^2-x.^3-2*x-3,n)==0;

xy_mtx=[x(idx),y(idx)];

David Hill
on 8 Jun 2021

You could try the help memory suggestions to try to increase memory, or you could add nested for-loop and do the meshgrids in batches of 2e4 (will be slower). Also keep in mind floating point limitations.

n=1e6;

xy_mtx=[];

for k=1:50

for j=1:50

[x,y]=meshgrid(0+(k-1)*2e4:min(2e4-1+(k-1)*2e4,n-1),0+(j-1)*2e4:min(2e4-1+(j-1)*2e4,n-1));

idx=mod(y.^2-x.^3-2*x-3,n)==0;

xy_mtx=[xy_mtx;x(idx),y(idx)];

end

end

Joseph Cheng
on 8 Jun 2021

You can do things all at once cine you're not dependent on previous values.

n=4

x=[0:n-1];

y=[0:n-1];

k = 0;

%%Orig_code

tic

for i=1:n

for j=1:n

if rem(((y(j))^2)-((x(i))^3)-2*(x(i))-3,n)==0

k = k+1;

xy_mtx(k,:) = [x(i) y(j)];

end

end

end

time1=toc;

tic

%%do everything at once

[X Y] = meshgrid(x,y); %generate combinations of x and y

REMmat = rem((Y.^2)-(X.^3)-2*(X)-3,n); %perform all rem calculations at once

[indexies]=find(REMmat==0); %find which index has a rem of 0

xy_mtxM = [X(indexies) Y(indexies)]; %put only the X and Y comb. where rem above is -

time2=toc;

disp([xy_mtx xy_mtxM])

disp(['time original:' num2str(time1) 's'])

disp(['time new:' num2str(time2) 's'])

disp(['time delta:' num2str(time1-time2) 's'])

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!