Простые факторизации

В этом примере показано, как использовать некоторые элементарные функции на sym объекты, использующие Symbolic Math Toolbox™.

Встроенные целые типы MATLAB подходят для целых чисел меньше 2 ^ 64. Однако мы хотим провести статистические исследования простых факторизаций больших целых чисел. Для этого мы используем символические целые числа, потому что их размер неограниченен. Исследуйте целые числа междуN0+1 и N0+100, где N0=3*1023. Встроенные типы данных не могут точно хранить такие значения. Таким образом, оберните самое внутреннее число sym использовать символьное представление в вычислениях. Это позволяет избежать ошибок округления или переполнения:

N0 = 3*sym(10)^23;
disp(['Roundng error for doubles: ' char(3*10^23 - N0)]);
Roundng error for doubles: -25165824
disp(['Overflow error for integers: ' char(3*uint64(10)^23 - N0)]);
Overflow error for integers: -299981553255926290448385

В арифметических операциях символьные числа могут быть объединены с двойными числами, и преобразование происходит перед операцией. Таким образом, следующее определение не может вызвать ошибки округления:

A = N0 + (1:100);

Вычислите простые факторизации элементов A использование factor. Количество простых множителей отличается. Массивы не могут содержать векторы разной длины, но массивы ячеек могут. Чтобы избежать повторных выделений памяти, сначала инициализируйте массив ячеек, а затем вычислите факторизации в цикле:

Bcell = cell(1, 100);
for i=1:100
   Bcell{i} = factor(A(i)); 
end

Более эффективным подходом является использование arrayfun. Настройка UniformOutput на false возвращает результат как массив ячеек.

Bcell = arrayfun(@factor, A, 'UniformOutput', false);

Для примера первые простые факторизации:

Bcell{1:5}
ans = (13432332303316007278478583)[sym (13), sym (43), sym (233), sym ('2303316007278478583')]
ans = (2171739911223244939171805943)[sym (2), sym (17), sym (173), sym (991), sym (1223), sym (244939), sym (171805943)]
ans = (311471392531549797184491917)[sym (3), sym (11), sym (47), sym (139), sym (2531), sym ('549797184491917')]
ans = (22330131295383776910994983)[sym (2), sym (2), sym (330131), sym (2953837), sym ('76910994983')]
ans = (5627126502668233610146697)[sym (5), sym (6271), sym (2650266823), sym (3610146697)]

Получите самый большой простой коэффициент с помощью max. Обратите внимание, что если выход состоит из объектов sym, опция UniformOutput всегда должно быть задано значение false даже если выход однороден.

Mcell = cellfun(@max, Bcell, 'UniformOutput', false);

Для примера первые максимальные простые множители:

Mcell{1:5}
ans = 2303316007278478583sym ('2303316007278478583')
ans = 171805943sym (171805943)
ans = 549797184491917sym ('549797184491917')
ans = 76910994983sym ('76910994983')
ans = 3610146697sym (3610146697)

Преобразуйте массив ячеек в символьный вектор и исследуйте отношение длин наибольшего простого множителя и числа в целом. Можно применить арифметические операции элементарно к символьным векторам так же, как и для двойников. Обратите внимание, что большинство статистических функций требуют, чтобы их аргументы были числами с двойной точностью.

M = [Mcell{:}];
histogram(double(log(M)./log(A)), 20);
title('Ratio of lengths of the largest prime factor and the number');

Figure contains an axes. The axes with title Ratio of lengths of the largest prime factor and the number contains an object of type histogram.

Точно так же теперь исследуйте распределение числа простых множителей. Здесь результат содержит равномерные числовые данные. Поэтому вам не нужно устанавливать UniformOutput на false.

omega = cellfun(@numel, Bcell);
histogram(omega);
title('Number of prime factors');

Figure contains an axes. The axes with title Number of prime factors contains an object of type histogram.

Исследуемый интервал содержит два простых числа:

A(omega == 1)
ans = (300000000000000000000037300000000000000000000049)[sym ('300000000000000000000037'), sym ('300000000000000000000049')]

Мы проверяем, что максимальные простые множители примерно одинаково часто в классах остатков 1 и 3 по модулю 4. Обратите внимание, что уравнения объектов sym являются самими символическими объектами, а не логическими значениями; мы должны преобразовать их, прежде чем мы сможем суммировать их:

sum(logical(mod(M, 4) == 1))
ans = 49
sum(logical(mod(M, 4) == 3))
ans = 51