主要内容

质因数分解

这个例子展示了如何使用一些基本函数信谊对象使用符号数学工具箱™。

MATLAB的内置整数类型适用于小于2^64的整数。然而,我们想对较大整数的质因数分解进行统计研究。为此,我们使用符号整数,因为它们的大小是无限的。研究介于 N 0 + 1 N 0 + 1 0 0 ,在那里 N 0 3. 1 0 2 3. 。内置数据类型不能准确地存储这些值。因此,用最内层的数字包装信谊在计算中使用符号表示。这避免了舍入或溢出错误:

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 =
                
                 
                  
                   
                   
                    
                     
                      
                       
                        13
                      
                     
                     
                      
                       
                        43
                      
                     
                     
                      
                       
                        233
                      
                     
                     
                      
                       
                        2303316007278478583
                      
                     
                    
                   
                   
                  
                 
                
ans =
                
                 
                  
                   
                   
                    
                     
                      
                       
                        2
                      
                     
                     
                      
                       
                        17
                      
                     
                     
                      
                       
                        173
                      
                     
                     
                      
                       
                        991
                      
                     
                     
                      
                       
                        1223
                      
                     
                     
                      
                       
                        244939
                      
                     
                     
                      
                       
                        171805943
                      
                     
                    
                   
                   
                  
                 
                
ans =
                
                 
                  
                   
                   
                    
                     
                      
                       
                        3.
                      
                     
                     
                      
                       
                        11
                      
                     
                     
                      
                       
                        47
                      
                     
                     
                      
                       
                        139
                      
                     
                     
                      
                       
                        2531
                      
                     
                     
                      
                       
                        549797184491917
                      
                     
                    
                   
                   
                  
                 
                
ans =
                
                 
                  
                   
                   
                    
                     
                      
                       
                        2
                      
                     
                     
                      
                       
                        2
                      
                     
                     
                      
                       
                        330131
                      
                     
                     
                      
                       
                        2953837
                      
                     
                     
                      
                       
                        76910994983
                      
                     
                    
                   
                   
                  
                 
                
ans =
                
                 
                  
                   
                   
                    
                     
                      
                       
                        5
                      
                     
                     
                      
                       
                        6271
                      
                     
                     
                      
                       
                        2650266823
                      
                     
                     
                      
                       
                        3610146697
                      
                     
                    
                   
                   
                  
                 
                

利用求最大的质因数马克斯。注意,如果输出由sym对象组成,则选项UniformOutputAlways必须设置为即使输出是一致的。

= cellfun(@max, Bcell,“UniformOutput”、假);

例如,第一个最大素数因子为:

Mcell {1:5}
ans =
                
                 
                  
                   2303316007278478583
                 
                
ans =
                
                 
                  
                   171805943
                 
                
ans =
                
                 
                  
                   549797184491917
                 
                
ans =
                
                 
                  
                   76910994983
                 
                
ans =
                
                 
                  
                   3610146697
                 
                

将单元格数组转换为符号向量,并研究最大质数因子的长度与整数的比值。你可以对符号向量进行元素方面的算术运算,就像对双精度浮点数一样。请注意,大多数统计函数要求它们的参数是双精度数字。

M = [Mcell {}):;柱状图(双(log (M)。/ log ()), 20);标题(最大质数因子与数的长度之比);

图中包含一个轴对象。标题为“最大质数因子长度与数字之比”的轴对象包含类型为直方图的对象。

用同样的方法,现在研究质数因子的分布。在这里,结果包含统一的数值数据。因此,不需要设置UniformOutput

omega = cellfun(@numel, Bcell);直方图(ω);标题('质数');

图中包含一个轴对象。标题为Number of prime factors的轴对象包含一个直方图类型的对象。

研究的区间包含两个质数:

(ω= = 1)
ans =
                
                 
                  
                   
                   
                    
                     
                      
                       
                        300000000000000000000037
                      
                     
                     
                      
                       
                        300000000000000000000049
                      
                     
                    
                   
                   
                  
                 
                

我们检验最大素数因子在残数类1和3中以4取模的情况大约相等。注意sym对象的方程是符号对象本身而不是逻辑值;在求和之前,我们必须先对它们进行转换:

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