1

maxima にオプションを渡してMathematicaパーティション関数に似た関数を書くことを考えただけです。

listpartitionpad(l,n,k,d):= block([temp:[],gap,newl,ntemp:[]],
                    newl:apply(create_listpad,flatten([n,k,d,l])),
                    map(lambda([x],if(length(newl)>=x+n-1 and is(unique[x]#[d]))then temp:cons(part(newl,makelist(i,i,x,x+n-1)),temp) 
                    else temp:cons(part(newl,makelist(s,s,x,length(newl))),temp)),makelist(i,i,1,length(newl),k)),
                    ntemp:sublist(temp,lambda([x],is(length(x)=n))),reverse(ntemp));

Usage:listpartitionpad([a,b,c,d,e,f,g],3,3,x); => [[a,b,c],[d,e,f],[g,x,x]]

私がチェックしたように、リスト操作関数はすべてlispでコーディングされています。

私の質問は、そのような関数を Lisp ではなく maxima 言語でコーディングしても問題ないか、そうしないと、パフォーマンスの問題や、まだ知らないことを知っておくべき何かが発生するということです。簡単なテストを実行しました

:lisp(time(loop repeat 1000000))

real time       :      0.850 secs
run-gbc time    :      0.540 secs
child run time  :      0.000 secs
gbc time        :      0.310 secs

別の最大値ベースのアプローチの場合、

block([],for i:1 thru 1000000 do []);

評価にかかった時間は 5.7700 秒 (5.7700 経過)

そして、この差は成長するにつれて指数関数的にi大きくなります。

これが、すべてのリスト操作が Lisp でコーディングされている理由ですか?

4

2 に答える 2

3

いくつかの異なる点。

  • (1) 実装には式の内部構造へのアクセスが必要であり、(2) 通常、Lisp コードは Maxima コードよりも高速であるため、 Maxima はほとんど Lisp で実装されます。
  • 通常、Lisp コードが Maxima コードよりもはるかに高速に実行されることは事実ですが、Lisp に精通していない限り、Maxima を使用してアルゴリズムを実装することをお勧めします。速度の違いは、おそらく実用的な違いにはなりません。開発者として費やす時間はより重要です。
  • についてblock([],for i:1 thru 1000000 do [])、その実行時間がループ カウントで実際に非線形である場合、それはバグのように聞こえます。それを確認できる場合は、それに関するバグ レポートを自由に開いてください。http://sourceforge.net/p/maxima/bugs (バグ レポートを送信するには、SF ログインを作成する必要があります。)
于 2014-03-12T18:10:33.197 に答える
0

実装言語が指数関数的成長を説明できるとは思いません (実際には指数関数的ではなく、おそらく二次関数です)。

あなたのアルゴリズムは最適ではないのではないかと思います。

于 2014-03-12T13:56:50.810 に答える