Rakuで二重合計シーケンスを表現する


13

Perl 6で二重変数二重合計シーケンスを表現する方法は?

二重変数二重合計シーケンスの例については、これを参照してください

画像

それは、現状のまま、つまり、数学的に二重合計を単一の合計に削減せずに表現する必要があります。ありがとうございました。

回答:


14

X(クロスオペレータ)及び[+](還元metaoperator [ ]添加オペレータとは+)驚くほど簡単にこれを行います。

表現するために1をダブル合計Σ³ のx  = 1 Σ⁵のY  = 1 ×2 + yは、次の操作を実行できます。

  [+] do for 1..3 X 1..5 -> ($x, $y) { 2 * $x + $y }
#        for 1..3 X 1..5                             # loop cross values
#                        -> ($x, $y)                 # plug into x/y
#                                    { 2 * $x + $y } # calculate each iteration
#     do                                             # collect loop return vals 
# [+]                                                # sum them all

これを作成したい場合はsub、次のように書くことができます2

sub ΣΣ (
    Int $aₒ, Int $aₙ,     # to / from for the outer
    Int $bₒ, Int $bₙ,     # to / from for the inner
    &f where .arity = 2   # 'where' clause guarantees only two params
) {
  [+] do for $aₒ..$aₙ X $bₒ..$bₙ -> ($a, $b) { &f(a,b) }
}

say ΣΣ 1,3, 1,5, { 2 * $^x + $^y }

または、物事をさらに簡素化する

sub ΣΣ (
    Iterable \a,            # outer values
    Iterable \b,            # inner values
    &f where .arity = 2) {  # ensure only two parameters
  [+] do f(|$_) for a X b
}

# All of the following are equivalent
say ΣΣ 1..3, 1..5, -> $x, $y { 2 * $x  + $y  }; # Anonymous block
say ΣΣ 1..3, 1..5,           { 2 * $^x + $^y }; # Alphabetic args
say ΣΣ 1..3, 1..5,             2 *  *  +  *   ; # Overkill, but Whatever ;-) 

注それを入力することによって、我々は範囲が渡されることを確認することができますが、としてそれを入力していることIterableではなく、Range私たちはもっと面白い加算シーケンスを許可することができ、のような、と言う、ΣΣ (1..∞).grep(*.is-prime)[^99], 1..10, { … }それは私たちが最初の100個の素数のシーケンスを使用してみましょうでしょう。

実際、本当にやりたかったのであれば、やりすぎて、関数を左に移動することで最も簡単にできる任意の深度加算演算子を使用できます。

sub ΣΣ (
    &function, 
    **@ranges where                # slurp in the ranges
        .all   ~~ Iterable &&      # make sure they're Iterables 
        .elems == &function.arity  # one per argument in the function
) {
  [+] do function(|$_) for [X] @ranges;
};

関数の[+]すべての値を合計するのと同じように、クロスを繰り返し計算します。たとえば、最初にor を実行し、次に、またはを実行します。 f()[X][X] 0..1, 3..4, 5..60..1 X 3..4(0,3),(0,4),(1,3),(1,4)(0,3),(0,4),(1,3),(1,4) X 5..6(0,3,5),(0,4,5),(1,3,5),(1,4,5),(0,3,6),(0,4,6),(1,3,6),(1,4,6)


1.申し訳ありませんが、SOではLaTeXを実行できませんが、アイデアを理解する必要があります。2.はい、私はゼロではなく下付き文字Oであることを知っています。下付き数字は通常有効な識別子ではありませんが、Slang :: Subscriptsを使用して有効にすることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.