4

私は (これらの) 大きな数を因数分解したいのですが、Matlab はそれを完璧に実行します。(これらは結果です。)

factor(NumberOfTypeSym) の結果は、別のシンボリック オブジェクトです。

>> factor( sym('79228162514264337589248983040') )

ans =

2^32*3*5*17*257*641*65537*6700417

しかし、私はそれを見る以外に何もできません。

単一の素数と指数にアクセスする方法はありますか?

(左辺に素数、右辺に指数を持つ nx2 行列だけを提供しない理由は、私の理解を超えています。)

現時点で特に必要なのは、結果の素数の数、つまりすべての指数の合計です。

4

4 に答える 4

3

簡単なのは、ファイル交換にあるvpiツールを使用することです。これは、整数の直接リストを返します。

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
于 2013-08-03T18:19:56.520 に答える
1

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
于 2013-08-24T14:31:36.270 に答える
0

別のオプションを追加するだけです:

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

または、MuPAD ドキュメントにある関数を使用して、

feval(symengine, 'numlib::Omega', N)

  ans =

  39
于 2013-11-12T07:58:42.050 に答える