在Matlab中对大数进行因子运算,然后得到结果中的数
我想计算()个大的数字,Matlab做得很好。 (这是结果。) 因子(NumberOfTypeSym)的结果是另一个符号对象:在Matlab中对大数进行因子运算,然后得到结果中的数,matlab,symbolic-math,prime-factoring,Matlab,Symbolic Math,Prime Factoring,我想计算()个大的数字,Matlab做得很好。 (这是结果。) 因子(NumberOfTypeSym)的结果是另一个符号对象: >> factor( sym('79228162514264337589248983040') ) ans = 2^32*3*5*17*257*641*65537*6700417 但我对此无能为力,除了看看它 有没有办法访问单素数和指数 (这超出了我的理解,为什么他们不给我一个nx2矩阵,素数在左边,指数在右边。) 目前我特别需要的是结果中素数的数量,
>> factor( sym('79228162514264337589248983040') )
ans =
2^32*3*5*17*257*641*65537*6700417
但我对此无能为力,除了看看它
有没有办法访问单素数和指数
(这超出了我的理解,为什么他们不给我一个nx2矩阵,素数在左边,指数在右边。)
目前我特别需要的是结果中素数的数量,即所有指数的总和。这个怎么样:
>> x=factor( sym('79228162514264337589248983040') )
x =
2^32*3*5*17*257*641*65537*6700417
>> p=char(x)
p =
2^32*3*5*17*257*641*65537*6700417
>> s=regexp(p,'*','split')
s =
'2^32' '3' '5' '17' '257' '641' '65537' '6700417'
>> exp=regexp(s{1},'\^','split')
exp =
'2' '32'
>> [exp s(2:end)]
ans =
'2' '32' '3' '5' '17' '257' '641' '65537' '6700417'
现在播放字符,根据需要将其转换为数字。使用我的工具很容易,可以在文件交换上找到。这将返回整数的直接列表
x=factor(vpi('79228162514264337589248983040'))
x =
Columns 1 through 7
2 2 2 2 2 2 2
Columns 8 through 14
2 2 2 2 2 2 2
Columns 15 through 21
2 2 2 2 2 2 2
Columns 22 through 28
2 2 2 2 2 2 2
Columns 29 through 35
2 2 2 2 3 5 17
Columns 36 through 39
257 641 65537 6700417
vpi的替代品(基本上可以发布)是vpij,它花费了一半的时间来计算这个数字,但是vpij可以处理比vpi多得多的数字。事实上,最后要写的是factor的一个更完善的版本,但在这之前我可能会发布vpij
当然,这些因子也必须是可变精度整数,因为其中一些因子会非常大。这是一个50多位数的数字,最近有人在数学网站上发表了评论
N = vpij(84)^27 + 1
N =
9026943488964407632833018690186861978797224381906945
x = factor(N)
x =
5 17 19 109 367 757 2017 230077 397741265470599434164843152148837
只是P0W提供的答案的扩展:
function [ y ] = symfactor2mat( x )
Str = char(x) ;
Parts = regexp(Str,'*','split') ;
Long = length(Parts) ;
Mat = sym(ones(Long,2)) ;
for m=1:Long
Part = Parts{m} ;
if isempty(strfind( Part, '^' ))
Mat(m,1) = sym(Part) ;
else
PE = regexp(Part,'\^','split') ; % prime and exponent
Mat(m,1) = sym(PE{1}) ;
Mat(m,2) = sym(PE{2}) ;
end
end
y = Mat ;
end
只需添加另一个选项:
N = sym('79228162514264337589248983040');
F = children(factor(N));
primefactors = F(2:2:end)
primefactors =
[ 2, 3, 5, 17, 257, 641, 65537, 6700417]
multiplicities = F(3:2:end)
multiplicities =
[ 32, 1, 1, 1, 1, 1, 1, 1]
sum(multiplicities)
ans =
39
或者,利用
太好了,谢谢你。我也想到了regexp,但更讽刺的是,因为我认为一定有一种不那么复杂的方法来实现这一点。可能没有。听起来不错。我要试一试。
feval(symengine, 'numlib::Omega', N)
ans =
39