2015-12-18 5 views
1

Я использую factor(n) в matlab, но он не работает для чисел, таких как ((10^11-1)/11) - что мне делать? Мой источник здесь.i использовать множитель (n) в matlab, но он не работает для чисел вроде ((10^11-1)/11), для того же числа, что я могу сделать?

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 

но для больших n он возвращает ошибки !!

>> 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)); 

Я хочу функцию factor((10^(i-1)-1)) работать на тот же номер. Как я могу решить свою проблему?

+0

'10^11 - 1' слишком большой для этой функции. Вот что означает ошибка «FLINTMAX». Однако я не могу воспроизвести вашу ошибку, используя 'factor (10^11 - 1)' дает мне: '[3 3 21649 513239]'. – rayryeng

+1

, пожалуйста, запустите источник, который я разделяю сверху, а n введите enter 45, вы увидите ошибки. –

+2

Почему в вашем коде отсутствует раздел, соответствующий '/ 11' в вашем заголовке и первой строке вашего вопроса? – jez

ответ

0

Я думаю, что это может быть частично устранено путем преобразования вашего большого числа в формат uint64. Для R2014b максимальное целое число, которое может быть перекачиваемой:

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

Хотя максимальный double, которые могут быть обработаны в:

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

Это можно проверить с помощью простого примера. Давайте используем factor по номеру, превышающему flintmax. Во-первых, попробуйте double:

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

Сейчас мы пытаемся 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 

Таким образом, используя factor(uint64(x)) увеличивает лимит на несколько порядков. Действительно, нет смысла использовать формат double для функции factor.

Кстати, поскольку использование factor на большом количествах могут заморозить вашу систему, я предлагаю использовать эту функцию:

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 

Это намного быстрее для больших чисел и не перегружает систему при большом п Надежды что помогает

+0

Фактор (uint64 (10^16)) Он работает для 18-разрядного номера для большого количества не работает. –

+0

, но ваш второй источник f(): f (99999999999999999999999999): ......................... результат ans = 1.0e + 15 * Колонны с 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 Столбцы 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 Колонны 25 до 36 не работает. –

+0

@stackprogrammer Я сказал, что проблема частично облегчена, а не полностью решена. Используя uint64, мы просто нажимаем границы на несколько порядков до – brainkz