exponenta event banner

Первичные факторизации

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

Встроенные целочисленные типы 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