1

最近、私は APL を使って仕事をしようとしましたが、それを概念化するのに苦労しました。たとえば、g<-pollard x というプログラムを作成したいとしましょう。この関数は、数値 x が素数であるか、Pollard-Rho 法によって因数分解できるかを計算します。

メソッド自体は知っていますが、実際に APL に統合するにはどこから始めたらよいかわかりません。この関数で使用するまったく新しい関数 f(x) を作成することから始めるべきですか、それともコードにすべてを含める必要がありますか? 次の実行に使用するために、前回の実行から x を保存するにはどうすればよいですか? プログラム全体を要求しているわけではなく、開始するためのいくつかの推奨事項を求めていることに注意してください。

4

1 に答える 1

4

まず第一に、これはあなたが知らない言語を試すための些細なことではありません。いずれにせよ、私はこの問題に興味をそそられ、いくつかの解決策を用意しました。これらは、Dyalog APL を使用して行われます。APL初心者の場合、ある程度の勉強が必要です。

最初の解決策は、f(x) がメイン関数に直接埋め込まれた、Pollard Rho (ウィキペディアで定義されている) の単純な関数です。

PollardRho←{
     n←⍵
     ⍺←2 2 1
     x y d←⍺
     f←{n|1+⍵*2}
     x←f x
     y←f f y
     d←n∨|x-y
     d=n:'Failure'
     d≠1:d
     x y d ∇ n
 }

これは、APL セッションで試すことができます。

     PollardRho 8051
97

2 番目の方法は、メイン関数から関数 f(x) を抽出し、それを引数として提供します。これは、f(x) に別の関数を使用する場合に便利です。APL では、関数を引数として取る関数を演算子と呼びます。

PollardRho2←{
     n←⍵
     ⍺←2 2 1
     x y d←⍺
     x←n ⍺⍺ x
     y←n ⍺⍺ n ⍺⍺ y
     d←n∨|x-y
     d=n:'Failure'
     d≠1:d
     x y d ⍺⍺ ∇∇ n
 }

最初に関数 f(x) を定義し、それを左オペランドとして提供することで、セッションでこれを実行できます。

      f←{⍺|1+⍵*2}
      f PollardRho2 8051
97

どちらのソリューションも末尾再帰を使用することに注意してください。

これが役に立つことを願っています。

于 2014-09-18T03:05:26.597 に答える