【数式処理 MuPAD 入門】
平田 浩一 / 1999年12月16日 
hirata@edserv.ed.ehime-u.ac.jp 
愛媛大学教育学部数学教室 


リストと数列



リスト

集合に続いてリストについて説明します。数式処理においては、リストは集合以上に重要です。

■ リスト

リストは集合のようにデータを一列に並べたものです。 集合との違いは、コンピュータが重複する要素を削除したり 並ぶ順番を変えたりしない点にあります。

リストは [1,3,5,4,1,3] のように表します。空リストは [ ] です。

● [1,3,5,4,1,3];
                            [1, 3, 5, 4, 1, 3]

以前、素因数分解のところで次のような例がありました。

● ifactor(10001);
                            [1, 73, 1, 137, 1]

この因数分解の出力はリストです。一つの数や式で表せないデータを表現するのに リストが役立ちます。

■ リストの i番目の要素

リスト L の i番目の要素は L[i] で表されます。

● L:=[a,b,c,d,e,f,g,h,i,j];
                      [a, b, c, d, e, f, g, h, i, j]
● L[3];
                                     c

リストの i番目の要素を変更するには、L[i] に変更したい値を代入します。

● L;
                      [a, b, c, d, e, f, g, h, i, j]
● L[3]:=x;
                                     x
● L;
                      [a, b, x, d, e, f, g, h, i, j]

次のように複数の要素を代入することができます。

● L:=[a,b,c,d];
                               [a, b, c, d]
● L[2]:=x,y,z;
                                  x, y, z
● L;
                            [a, x, y, z, c, d]

ご覧のように 2番目の要素 b を取り除き、そこに x,y,z を挿入したことになります。

リストの i番目の要素を削除するには、NIL を代入します。

● L;
                            [a, x, y, z, c, d]
● L[5]:=NIL;
                                    NIL
● L;
                              [a, x, y, z, d]

上の L[i] を用いた操作は、リスト L を変えてしまうことに注意ください。

■ リストの操作

2つのリスト L1, L2 を結合して一つのリストを作り出すには演算子「.」を用います。

● L1:=[a,b,c,d]; L2:=[4,3,2,1];
                               [a, b, c, d]
                               [4, 3, 2, 1]
● L3:= L1 . L2;
                         [a, b, c, d, 4, 3, 2, 1]

リストに要素を挿入したリストを作成する関数があります。

linsert(L,a,i)     リスト L の i番目に要素 a を挿入
append(L,a)     リスト L の最後に要素 a を追加


● L4:=[a,b,c,d];
                               [a, b, c, d]
● L5:=linsert(L4,p,3);
                              [a, b, p, c, d]
● L6:=append(L4,q);
                              [a, b, c, d, q]

複数の要素を挿入したり追加することもできます。

linsert(L,[a1,a2,…],i)     リスト L の i番目に要素 a1,a2,… を挿入
append(L,a1,a2,…)     リスト L の最後に要素 a1,a2,… を追加


● L7:=linsert(L4,[x,y,z],4);
                           [a, b, c, x, y, z, d]
● L8:=append(L4,p,q,r);
                           [a, b, c, d, p, q, r]

リストの個数をカウントするときは関数 nops を用います。

nops(L)     リストの個数


● L8;
                           [a, b, c, d, p, q, r]
● nops(L8);
                                     7

数を要素とするリストがあり、小さいものから順に整列させたリストを作るには

sort(L)     リスト L を整列


を用います。

● L9:=[10/3, 3.4, 4, 3.1];
                            [10/3, 3.4, 4, 3.1]
● L10:=sort(L9);
                            [3.1, 10/3, 3.4, 4]

■ リストの生成

集合の場合と同様に、リストの要素が規則的に生成できる場合は、次の ような方法でリストを生成することができます。

● L1:=[2*i-1 $ i=1..10];
                    [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
● L2:=[2^i $ i=0..10];
               [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]

集合の場合とは違って要素の順番がかってに変わることは ありません。

■ リストの要素

リスト L に要素 a が含まれてるいるかどうか、何番目に含まれているかを 調べる関数があります。

contains(L,a)   リスト s 中で、要素 a が最初に現れる位置。
  要素 a がリスト s に含まれない場合は 0


要素 a がリストに含まれているかどうかは、contains が計算する値が 正か 0 かによって判定できます。

● L:=[f,b,e,d,a,c,a];
                           [f, b, e, d, a, c, a]
● contains(L,a);
                                     5
● contains(L,g);
                                     0



数列や関数列のような、データをコンマで区切って一列に並べたものを列といいます。

● s1:=1,2,3;
                                  1, 2, 3
● s2:=5,6,7;
                                  5, 6, 7

この列を { } や [ ] で囲ったものが MuPAD での集合・リストになります。

列の結合にはコンマ「,」を用います。

● s1 , s2;
                             1, 2, 3, 5, 6, 7

列の生成は次のようにします。

● i^2 $ i=1..10;
                   1, 4, 9, 16, 25, 36, 49, 64, 81, 100

列の各要素の和や積、さらに最大値などを求めることができます。

_plus(列)     列の要素の和
_mult(列)     列の要素の積
min(列)     列の要素の最小値
max(列)     列の要素の最大値
gcd(列)     列の要素の最大公約数
lcm(列)     列の要素の最小公倍数
列[n]     列の n 番目の要素
列[n] := x     列の n 番目の要素を x に変更
op(列,n)     列の n 番目の要素
op(列,m..n)     列の m 番目から n 番目までの部分列
nops(列)     列の個数


● s2;
                                  5, 6, 7
● _plus(s2);
                                    18
● _mult(s2);
                                    210
● min(s2);
                                     5
● max(s2);
                                     7
● gcd(s2);
                                     1
● lcm(s2);
                                    210
● s2[2];
                                     6
● s2[2]:=9;
                                     9
● s2;
                                  5, 9, 7
● op(s2,2..3);
                                    9, 7
● nops(s2);
                                     3



列、リスト、集合の間の変換

列、リスト、集合はそれぞれ特徴があり、どのような計算をしたいかによって 使い分けます。時には、それらの間の変換が必要になります。

■ 列からリスト・集合への変換

● s1 := 1,3,2,1;
                                1, 3, 2, 1
● [s1];
                               [1, 3, 2, 1]
● {s1};
                                 {1, 2, 3}

■ リスト・集合から列への変換

● s2:=[4,5,6]; s3:={7,8,9};
                                 [4, 5, 6]
                                 {7, 8, 9}
● op(s2);
                                  4, 5, 6
● op(s3);
                                  7, 8, 9

■ リストと集合の間の変換

上記の2種類の変換方法を組合せて使います。

リストを集合に変換する。

● s4:=[10,5,1];
                                [10, 5, 1]
● {op(s4)};
                                {1, 5, 10}

集合をリストに変換する。

● s5:={1,10,100};
                               {1, 100, 10}

● [op(s5)];
                               [1, 100, 10]



数列

次に、数列について説明します。

■ 数列の和

素朴な考え方は、数の列を生成し、その和を計算することです。

● s1 := i^2 $ i=1..10;
                   1, 4, 9, 16, 25, 36, 49, 64, 81, 100
● _plus(s1);
                                    385

この操作を一度で行い、数列の和を求める関数が sum です。

sum(ai, i=m..n)     数列 {ai} の i=m から n までの和


たとえば、簡単な数列として、i2 の i = 1 から 100 までの和を求めてみます。

● sum(i^2,i=1..100);
                                  338350

この方法で、同じ数列の i = 1 から 100000 までの和を計算してみると、

● sum(i^2,i=1..100000);
                              333338333350000

1分位の時間がかかります。これはよい方法ではありません。 いくらコンピュータが早いとはいっても、これはさすがにマズイ。

高校でやるように、数列の和の公式を求めてそれに n=100000 を代入するのが良い方法です。

● s1:=sum(i^2, i=1..n);
                                     2    3
                                n   n    n
                                - + -- + --
                                6   2    3
● subs(s1,n=100000);
                              333338333350000

関数 sum は和をとる範囲が i=1..n のように変数で指定された場合、数列の和の 一般項の公式を求めます。

数列の和に関するいくつかの例を計算してみます。

● sum(2^(i-1),i=1..n);
                                   n
                                  2  - 1
● sum((1/3)^i,i=1..n);
                                     n
                                (1/3)
                              - ------ + 1/2
                                  2
● sum(i^3,i=1..n);
                                2    3    4
                               n    n    n
                               -- + -- + --
                               4    2    4
● sum(i^4,i=1..n);
                                    3    4    5
                              n    n    n    n
                            - -- + -- + -- + --
                              30   3    2    5

■ 数列の積

数列の積を求める関数は product です。

product(ai, i=m..n)     数列 {ai} の i=m から n までの積


簡単な例として、1 から 100 までの積(100!)を product を用いて求めてみます。

● product(i,i=1..100);

93326215443944152681699238856266700490715968264381621468592963895217599993\
22991560894146397615651828625369792082722375825118521091686400000000000000\
0000000000

■ 数列と関数の極限

数列の極限は関数 limit で計算します。

limit(ai, i=infinity)     数列 {ai} の極限


● limit(3-(1/2)^n,n=infinity);
                                     3
● limit((3*n^2)/(5*n+2*n^2),n=infinity);
                                    3/2

関数 f(x) の x → a での極限の計算についても limit を用います。

limit(f, x=a)     関数 f の x → a での極限


● limit(sin(x)/x, x=0);
                                     1
● limit((3*x)/(4*x+3), x=infinity);
                                    3/4

極限をとるときに右からの極限と左からの極限を区別したいときは次のように指定します。

● limit(sin(x)/abs(x),x=0,Right);
                                     1

● limit(sin(x)/abs(x),x=0,Left);
                                    -1

■ 無限級数の和

無限級数の和も sum で計算できます。

● sum((1/5)^i, i=1..infinity);
                                    1/4
● sum((1/i)^2, i=1..infinity);
                                      2
                                    PI
                                    ---
                                     6



【演習問題】

(1) 1 から 50 までの整数のうち、4 の倍数の集合を A,、7 の倍数の集合を B とする。

  1. 和集合 C=A∪B を求めよ。
  2. 集合 C をリストに変換し、小さいものから順にならべたリスト D を求めよ。
  3. リスト D を列に変換し、その和を求めよ。

(2) 次のような数列の和 Sn を一般項で求めよ。

  1. 初項 5 公差 3 の等差数列
  2. 初項 5 公比 3 の等比数列
  3. 数列 1x2, 3x4, 5x6, 7x8, …

(3) 次の数列の極限を求めよ。

  1. an = (1-1/n)n
  2. an = (1+2/n)n

(4) 次の無限級数の和を求めよ。

  1. 1/1 + 2/3 + 3/9 + 4/27 + 5/81 + 6/243 + …
  2. 1/1 + 1/9 + 1/25 + 1/49 + 1/81 + 1/121 + …

【数式処理 MuPAD 入門】