Этот пример показывает, как использовать некоторые элементарные функции на объектах sym
с помощью Symbolic Math Toolbox™.
Встроенные целочисленные типы MATLAB подходят для целых чисел, меньших, чем 2^64. Однако мы хотим выполнить статистические расследования на главных факторизациях больших целых чисел. Для этого мы используем символьные целые числа, потому что их размер неограничен. Исследуйте целые числа между и , где . Встроенные типы данных не могут сохранить такие значения точно. Таким образом перенесите самый внутренний номер с 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 =
ans =
ans =
ans =
ans =
Получите самый большой простой множитель с помощью max
. Обратите внимание на то, что, если вывод состоит из объектов sym, опция, UniformOutput
всегда должен устанавливаться в false
, даже если вывод универсален.
Mcell = cellfun(@max, Bcell, 'UniformOutput', false);
Например, первые максимальные простые множители:
Mcell{1:5}
ans =
ans =
ans =
ans =
ans =
Преобразуйте массив ячеек в символьный вектор и исследуйте отношение длин самого большого простого множителя и номера в целом. Можно применить арифметические операции поэлементно к символьным векторам, таким же образом что касается удваивается. Обратите внимание на то, что большинство статистических функций требует, чтобы их аргументы были числами с двойной точностью.
M = [Mcell{:}];
histogram(double(log(M)./log(A)), 20);
title('Ratio of lengths of the largest prime factor and the number');
Таким же образом теперь исследуйте распределение количества простых множителей. Здесь, результат содержит универсальные числовые данные. Поэтому вы не должны устанавливать UniformOutput
на false
.
omega = cellfun(@numel, Bcell);
histogram(omega);
title('Number of prime factors');
Интервал под следствием содержит два простых числа:
A(omega == 1)
ans =
Мы проверяем, что максимальные простые множители об одинаково часто в классах вычетов 1 и 3 по модулю 4. Обратите внимание на то, что уравнения объектов sym являются самими символьными объектами и не логическими значениями; мы должны преобразовать их, прежде чем мы сможем суммировать их:
sum(logical(mod(M, 4) == 1))
ans = 49
sum(logical(mod(M, 4) == 3))
ans = 51