speeding up my for loop

21 vues (au cours des 30 derniers jours)
Abhishek Sharma
Abhishek Sharma le 27 Fév 2021
Commenté : Abhishek Sharma le 27 Fév 2021
%My challenge is to find the number of divisors for a number without using "divisors" inbuild function
%this program will work but it's taking too much time for big numbers
%I read about vectorization to reduce the time but found stucked
%help!!!
function y=divisors1(N)
sum=0;
for i=1:floor(N/2)
if lcm(N,i)==N
sum=sum+1;
end
end
y=1+sum;

Réponse acceptée

Bruno Luong
Bruno Luong le 27 Fév 2021
Modifié(e) : Bruno Luong le 27 Fév 2021
function y=divisors2(N)
f = factor(N);
[~,~,J] = unique(f);
n = accumarray(J,1);
y = prod(n+1);
end
Test
>> N=27022021
N =
27022021
>> divisors2(N)
ans =
8
  1 commentaire
Abhishek Sharma
Abhishek Sharma le 27 Fév 2021
Thanks Bruno.

Connectez-vous pour commenter.

Plus de réponses (1)

Alan Stevens
Alan Stevens le 27 Fév 2021
Is this any quicker?
function y = divisors1(N)
i = 1:floor(N/2);
L = lcm(N,i);
y = sum(L==N) + 1;
end
  1 commentaire
Abhishek Sharma
Abhishek Sharma le 27 Fév 2021
Thanks Alan. Since the iterations haven't changed ,it still stucks for big numbers.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by