2015-12-18 5 views
1

J'utilise factor(n) dans matlab mais cela ne fonctionne pas pour les nombres comme ((10^11-1)/11) - que puis-je faire? Ma source est ici.j'utilise le facteur (n) dans matlab mais cela ne fonctionne pas pour les nombres comme ((10^11-1)/11), pour le même nombre que puis-je faire?

m=input('Enter your number: '); 
i=0; 

while (i<m) 
    if(isprime(i)) 
    % sum=factor((10^(i-1)-1)); 
     sum=factor((10^(i-1)-1)/i); 
     disp(sum); 
    end 
    i =i+1; 

end 

mais pour un grand n, il renvoie des erreurs !!

>> FactorGen 

Enter your number: 45 

3  3 

3  3 11 

3  3 11 101 

3  3  3  7 11 13 37 

     3   3   11   41   271  9091 

     3   3   3   7   11   13   37   101  9901 

Error using factor (line 26) When n is single or double, its maximum 
allowed value is FLINTMAX. 

Error in FactorGen (line 7) sum=factor((10^(i-1)-1)); 

Je veux la fonction factor((10^(i-1)-1)) de travailler pour autant. Comment puis-je résoudre mon problème?

+0

'10^11 - 1' est trop grand pour que cette fonction soit prise en charge. C'est ce que signifie l'erreur 'FLINTMAX'. Cependant, je ne peux pas reproduire votre erreur, en utilisant 'factor (10^11 - 1)' me donne: '[3 3 21649 513239]'. – rayryeng

+1

s'il vous plaît exécuter la source que je partage en haut, et n entrée 45, vous verrez des erreurs. –

+2

Pourquoi n'y a-t-il pas de division dans votre code qui corresponde au '/ 11' dans votre titre et la première ligne de votre question? – jez

Répondre

0

Je pense que cela peut être partiellement atténué en convertissant votre grand nombre en format uint64. Pour R2014b entier maximum qui peut être manipulé est:

n = intmax('uint64') 
n = 1.8447e+19 

Alors que le double maximum qui peut être manipulé est:

n = flintmax('double') 
n = 9.0072e+15 

Cela peut être vérifié par exemple simple. Utilisons factor sur le nombre plus grand que flintmax. Tout d'abord, essayez double:

factor(10^16) 
Error using factor (line 26) 
When n is single or double, its maximum allowed value is FLINTMAX. 

Maintenant, nous essayons uint64:

factor(uint64(10^16)) 
ans = 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 

Ainsi, en utilisant factor(uint64(x)) augmente votre limite de plusieurs ordres. En effet, cela n'a aucun sens d'utiliser le format double pour la fonction factor.

Par ailleurs, puisque l'utilisation factor sur un grand nombre peut geler votre système, je suggère d'utiliser cette fonction:

function f = Factorize(n) 
i = 0; 
while mod(n,2) == 0 
    i = i + 1; 
    n = n/2; 
    f(i) = 2; 
    disp([2,n]) 
end 
q = round(sqrt(double(n))); 
q = q + 1 - mod(q,2); 
for j = 3:2:q 
    while mod(n,j) == 0 
     i = i + 1; 
     f(i) = j; 
     n = n/j; 
    end 
end 
if n > 2; 
    i = i + 1; 
    f(i) = n; 
end 

Il est beaucoup plus rapide pour un grand nombre et ne surcharge pas le système dans son ensemble n espoir cela aide

+0

facteur (uint64 (10^16)) Cela fonctionne pour le nombre 18digit pour le grand nombre n'est pas le travail. –

+0

mais votre deuxième source f(): f (99999999999999999999999999): ......................... le résultat ans = 1.0E + 15 * les colonnes 1 à 12 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 colonnes 13 à 24 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 0,0000 colonnes 25 à 36 cela ne fonctionne pas. –

+0

@stackprogrammer J'ai dit que le problème est partiellement atténué, pas complètement résolu. En utilisant uint64, il suffit de pousser les limites de plusieurs ordres jusqu'à – brainkz