【问题标题】:Prime factorization of integers with Maxima使用 Maxima 对整数进行素数分解
【发布时间】:2019-10-22 11:12:38
【问题描述】:

我想使用 Maxima 来获得随机正整数的素数分解,例如12=2^2*3^1。

到目前为止我所尝试的:

a:random(20);
aa:abs(a);
fa:ifactors(aa);
ka:length(fa);
ta:1;
pfza: for i:1 while i<=ka do ta:ta*(fa[i][1])^(fa[i][2]);
ta;

这将作为学生在线练习的一部分在 Moodle 的 STACK 中实现,因此确切的实现会与此略有不同,但我将其分解为这 7 行。

我生成一个随机数a,使用aa=|a|+1确保它是一个正整数,并想使用ifactors命令得到aa的素数。 ka 告诉我成对不同的素数因子的数量,然后我将其用于 pfza 中的 while 循环。如果我让这段代码运行,它会返回一切正常,除了用于简化 ta 的 execpt,也就是说,我不会将 ta 视为具有某些指数的素数的乘积,而只是 ta=aa。

然后我尝试关闭简化器,手动简化我需要的所有其他内容:

simp:false$
a:random(20);
aa:ev(abs(a),simp);
fa:ifactors(aa);
ka:ev(length(fa),simp);
ta:1;
pfza: for i:1 while i<=ka do ta:ta*(fa[i][1])^(fa[i][2]);
ta;

然而这并不能编译;我认为问题出在 pfza 的某个地方,但我不知道为什么。

关于如何解决这个问题的任何意见?或者以非简化形式获得分解的另一种方法?

【问题讨论】:

    标签: maxima


    【解决方案1】:

    (1) for 循环失败,因为将 1 加到 i 需要将 1 + 1 简化为 2,但简化被禁用。这是一种无需算术即可使循环工作的方法。

    (%i10) for f in fa do ta:ta*(f[1]^f[2]);
    (%o10)                          done
    (%i11) ta;
                                    2   2   1
    (%o11)                     ((1 2 ) 2 ) 3
    

    嗯,这很奇怪,还是因为缺乏简化。这个怎么样:

    (%i12) apply ("*", map (lambda ([f], f[1]^f[2]), fa));
                                     2  1
    (%o12)                          2  3
    

    总的来说,我认为最好还是避免显式索引。

    (2) 但也许你根本不需要那个。 factor 返回您尝试构建的那种未简化的表达式。

    (%i13) simp:true;
    (%o13)                          true
    (%i14) factor(12);
                                     2
    (%o14)                          2  3
    

    我认为 factor 返回一个未简化的值在概念上是不一致的,但无论如何它似乎在这里工作。

    【讨论】:

    • 感谢您的建议。一个问题是,我正在使用 STACK 执行此操作,这基本上是 Maxima,但有一些曲折。如果我使用因子(12),我只会得到 12 作为结果。所以我试图在我的问题中提出我的解决方案。但是,不知何故,我没有考虑在关闭简化的情况下使用 factor(),然后在 STACK 中工作正常。你有什么建议可以让它看起来更像一个产品,比如在不同的素数之间使用/显示一个乘法点?
    • 回复:“如果我使用因子 (12),我只会得到 12 作为结果。” ——我猜想简化是在某种程度上应用于 Maxima 的结果;因为factor 的结果是一个未简化的表达式,所以从某种意义上说它是脆弱的,重新简化会撤销它。回复:如何显示乘法,见显示标志stardisp。如果您想将乘号从星号更改为其他符号,我们也可以尝试这样做,如果您想走这条路,请告诉我。
    • stardisp 到目前为止还不是 STACK 中可用的命令,我会看看是否可以实现它并扩展可用的 Maxima 命令列表,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    相关资源
    最近更新 更多