这个例子展示了如何使用一些基本函数信谊
对象使用符号数学工具箱™。
MATLAB的内置整数类型适用于小于2^64的整数。然而,我们想对较大整数的质因数分解进行统计研究。为此,我们使用符号整数,因为它们的大小是无限的。研究介于
和
,在那里
。内置数据类型不能准确地存储这些值。因此,用最内层的数字包装信谊
在计算中使用符号表示。这避免了舍入或溢出错误:
N0 = 3 *符号(10)^ 23;disp ([双精度的舍入错误:char (3 * 10 ^ 23 - N0)]);
双精度的舍入错误:-25165824
disp (['整数溢出错误:'char (3 * uint64 (10) ^ 23 - N0)]);
整数溢出错误:-299981553255926290448385
在算术运算中,符号数可以与双精度数组合,转换在运算之前进行。因此,以下定义不会导致舍入错误:
A = n0 + (1:100);
计算元素的质因数分解一个
使用因素
。质因数的数目是不同的。数组不能包含不同长度的向量,但单元格数组可以。为了避免重新分配内存,首先初始化单元格数组,然后在循环中计算分解:
Bcell = cell(1, 100);为Bcell{i} = factor(A(i));结束
更有效的方法是使用arrayfun
。设置UniformOutput
来假
以单元格数组的形式返回结果。
Bcell = arrayfun(@factor, A,“UniformOutput”、假);
例如,第一个质因数分解是:
Bcell {1:5}
ans =
ans =
ans =
ans =
ans =
利用求最大的质因数马克斯
。注意,如果输出由sym对象组成,则选项UniformOutput
Always必须设置为假
即使输出是一致的。
= cellfun(@max, Bcell,“UniformOutput”、假);
例如,第一个最大素数因子为:
Mcell {1:5}
ans =
ans =
ans =
ans =
ans =
将单元格数组转换为符号向量,并研究最大质数因子的长度与整数的比值。你可以对符号向量进行元素方面的算术运算,就像对双精度浮点数一样。请注意,大多数统计函数要求它们的参数是双精度数字。
M = [Mcell {}):;柱状图(双(log (M)。/ log ()), 20);标题(最大质数因子与数的长度之比);
用同样的方法,现在研究质数因子的分布。在这里,结果包含统一的数值数据。因此,不需要设置UniformOutput
来假
。
omega = cellfun(@numel, Bcell);直方图(ω);标题('质数');
研究的区间包含两个质数:
(ω= = 1)
ans =
我们检验最大素数因子在残数类1和3中以4取模的情况大约相等。注意sym对象的方程是符号对象本身而不是逻辑值;在求和之前,我们必须先对它们进行转换:
sum(logical(mod(M, 4) == 1))
ans = 49
sum(logical(mod(M, 4) == 3))
ans = 51