配列
==

Arrays
======

newvect, vector, vect
---------------------

newvect(LEN[,LIST])

vector(LEN[,LIST])
     :: 長さ LEN のベクトルを生成する.

     :: Creates a new vector object with its length LEN.

vect([ELEMENTS])
     :: ELEMENTS を要素とするベクトルを生成する.

     :: Creates a new vector object by ELEMENTS.

return
     ベクトル

     vector

len
     自然数

     non-negative integer

list
     リスト

     list

elements
     要素の並び

     elements of the vector

  * vect は要素の並びからベクトルを生成する.

  * vector は newvect の別名である.

  * newvect は長さ LEN のベクトルを生成する. 第 2 引数がない場合, 各成分は 0 に初期化される. 第 2 引数がある場合, インデックスの小さい成分から, リストの各要素により初期化される. 各要素は, 先頭から順に使われ, 足りない分は 0 が埋められる.

  * ベクトルの成分は, 第 0 成分から第 LEN-1 成分となる. (第 1 成分からではない事に注意. )

  * リストは各成分が, ポインタを辿る事によってシーケンシャルに呼び出されるのに対し, ベクトルは各成分が第一成分からのメモリ上の displacement (変位)によってランダムアクセスで呼び出され, その結果, 成分のアクセス時間に大きな差が出てくる. 成分アクセスは, リストでは, 成分の量が増えるに従って時間がかかるようになるが, ベクトルでは, 成分の量に依存せずほぼ一定である.

  * Asir では, 縦ベクトル, 横ベクトルの区別はない. 行列を左から掛ければ縦ベクトルとみなされるし, 右から掛ければ横ベクトルとみなされる.

  * ベクトルの長さは size() によって得られる.

  * 函数の引数としてベクトルを渡した場合, 渡された函数は, そのベクトルの成分を書き換えることができる.

  * vect creates a new vector object by its elements.

  * vector is an alias of newvect.

  * newvect creates a new vector object with its length LEN and its elements all cleared to value 0. If the second argument, a list, is given, the vector is initialized by the list elements. Elements are used from the first through the last. If the list is short for initializing the full vector, 0's are filled in the remaining vector elements.

  * Elements are indexed from 0 through LEN-1.  Note that the first element has not index 1.

  * List and vector are different types in Asir. Lists are conveniently used for representing many data objects whose size varies dynamically as computation proceeds. By its flexible expressive power, it is also conveniently used to describe initial values for other structured objects as you see for vectors. Access for an element of a list is performed by following pointers to next elements.  By this, access costs for list elements differ for each element. In contrast to lists, vector elements can be accessed in a same time, because they are accessed by computing displacements from the top memory location of the vector object.

     Note also, in Asir, modification of an element of a vector causes modification of the whole vector itself, while modification of a list element does not cause the modification of the whole list object.

     By this, in Asir language, a vector element designator can be a left value of assignment statement, but a list element designator can NOT be a left value of assignment statement.

  * No distinction of column vectors and row vectors in Asir. If a matrix is applied to a vector from left, the vector shall be taken as a column vector, and if from right it shall be taken as a row vector.

  * The length (or size or dimension) of a vector is given by function size().

  * When a vector is passed to a function as its argument (actual parameter), the vector element can be modified in that function.

  * A vector is displayed in a similar format as for a list. Note, however, there is a distinction: Elements of a vector are separated simply by a `blank space', while those of a list by a `comma.'

     [0] A=newvect(5);
     [ 0 0 0 0 0 ]
     [1] A=newvect(5,[1,2,3,4,[5,6]]);
     [ 1 2 3 4 [5,6] ]
     [2] A[0];
     1
     [3] A[4];
     [5,6]
     [4] size(A);
     [5]
     [5] length(A);
     5
     [6] vect(1,2,3,4,[5,6]);
     [ 1 2 3 4 [5,6] ]
     [7] def afo(V) { V[0] = x; }
     [8] afo(A)$
     [9] A;
     [ x 2 3 4 [5,6] ]

参照

References
     newmat matrix, size, ltov, vtol.

ltov
----

ltov(LIST)
     :: リストをベクトルに変換する.

     :: Converts a list into a vector.

return
     ベクトル

     vector

list
     リスト

     list

  * リスト LIST を同じ長さのベクトルに変換する.

  * この関数は newvect(length(LIST), LIST) に等しい.

  * Converts a list LIST into a vector of same length. See also newvect().

     [3] A=[1,2,3];
     [4] ltov(A);
     [ 1 2 3 ]

参照

References
     newvect vector vect, vtol.

vtol
----

vtol(VECT)
     :: ベクトルをリストに変換する.

     :: Converts a vector into a list.

return
     リスト

     list

vect
     ベクトル

     vector

  * 長さ N のベクトル VECT を [VECT[0],...,VECT[N-1]] なるリストに変換する.

  * リストからベクトルへの変換は newvect() で行う.

  * Converts a vector VECT of length N into a list [VECT[0],...,VECT[N-1]].

  * A conversion from a list to a vector is done by newvect().

     [3] A=newvect(3,[1,2,3]);
     [ 1 2 3 ]
     [4] vtol(A);
     [1,2,3]

参照

References
     newvect vector vect, ltov.

newbytearray
------------

newbytearray(LEN,[LISTORSTRING])
     :: 長さ LEN の byte array を生成する.

     :: Creates a new byte array.

return
     byte array

len
     自然数

     non-negative integer

listorstring
     リストまたは文字列

     list or string

  * newvect と同様にして byte array を生成する.

     This function generates a byte array. The specification is

     similar to that of newvect.

  * 文字列で初期値を指定することも可能である.

     The initial value can be specified by a character string.

  * byte array の要素のアクセスは配列と同様である.

     One can access elements of a byte array just as an array.

     [182] A=newbytearray(3);
     |00 00 00|
     [183] A=newbytearray(3,[1,2,3]);
     |01 02 03|
     [184] A=newbytearray(3,"abc");
     |61 62 63|
     [185] A[0];
     97
     [186] A[1]=123;
     123
     [187] A;
     |61 7b 63|

参照

References
     newvect vector vect.

newmat, matrix
--------------

newmat(ROW,COL [,[[A,B,...],[C,D,...],...]])

matrix(ROW,COL [,[[A,B,...],[C,D,...],...]])
     :: ROW 行 COL 列の行列を生成する.

     :: Creates a new matrix with ROW rows and COL columns.

return
     行列

     matrix

row col
     自然数

     non-negative integer

a b c d
     任意

     arbitrary

  * matrix は newmat の別名である.

  * ROW 行 COL 列の行列を生成する. 第 3 引数がない場合, 各成分は 0 に初期化される. 第 3 引数がある場合, インデックスの小さい成分から, 各行が, リストの各要素 (これはまたリストである) により初期化される. 各要素は, 先頭から順に使われ, 足りない分は 0 が埋められる.

  * 行列のサイズは size() で得られる.

  * M が行列のとき, M[I] により第 I 行をベクトルとして取り出すことができる. このベクトルは, もとの行列と成分を共有しており, いずれかの成分を書き換えれば, 他の対応する成分も書き換わることになる.

  * 函数の引数として行列を渡した場合, 渡された函数は, その行列の成分を書き換えることができる.

  * matrix is an alias of newmat.

  * If the third argument, a list, is given, the newly created matrix is initialized so that each element of the list (again a list) initializes each of the rows of the matrix. Elements are used from the first through the last. If the list is short, 0's are filled in the remaining matrix elements. If no third argument is given all the elements are cleared to 0.

  * The size of a matrix is given by function  size().

  * Let M be a program variable assigned to a matrix. Then, M[I] denotes a (row) vector which corresponds with the I-th row of the matrix. Note that the vector shares its element with the original matrix. Subsequently, if an element of the vector is modified, then the corresponding matrix element is also modified.

  * When a matrix is passed to a function as its argument (actual parameter), the matrix element can be modified within that function.

     [0] A = newmat(3,3,[[1,1,1],[x,y],[x^2]]);
     [ 1 1 1 ]
     [ x y 0 ]
     [ x^2 0 0 ]
     [1] det(A);
     -y*x^2
     [2] size(A);
     [3,3]
     [3] A[1];
     [ x y 0 ]
     [4] A[1][3];
     getarray : Out of range
     return to toplevel

参照

References
     newvect vector vect, size, det nd_det invmat.

mat, matr, matc
---------------

mat(VECTOR[,...])

matr(VECTOR[,...])
     :: 行ベクトルの並びから行列を生成する.

     :: Creates a new matrix by list of row vectors.

matc(VECTOR[,...])
     :: 列ベクトルの並びから行列を生成する.

     :: Creates a new matrix by list of column vectors.

return
     行列

     matrix

VECTOR
     配列またはリスト

     array or list

  * mat は matr の別名である.

  * 引数の各ベクトルは同じ長さをもつ. 各要素は, 先頭から順に使われ, 足りない分は 0 が埋められる.

  * mat is an alias of matr.

  * Each vector has same length. Elements are used from the first through the last. If the list is short, 0's are filled in the remaining matrix elements.

     [0] matr([1,2,3],[4,5,6],[7,8]);
     [ 1 2 3 ]
     [ 4 5 6 ]
     [ 7 8 0 ]
     [1] matc([1,2,3],[4,5,6],[7,8]);
     [ 1 4 7 ]
     [ 2 5 8 ]
     [ 3 6 0 ]

参照

References
     newmat matrix

size
----

size(VECT|MAT)
     :: [VECT の長さ] または [MAT の行数,MAT の列数].

     :: A list containing the number of elements of the given vector, [size of VECT], or a list containing row size and column size of the given matrix, [row size of MAT, column size of MAT].

return
     リスト

     list

vect
     ベクトル

     vector

mat
     行列

     matrix

  * VECT の長さ, または MAT の大きさをリストで出力する.

  * VECT の長さは length() で求めることもできる.

  * LIST の長さは length()を, 有理式に現れる単項式の数は nmono() を用いる.

  * Return a list consisting of the dimension of the vector VECT, or a list consisting of the row size and column size of the matrix MATRIX.

  * Use length() for the size of LIST, and nmono() for the number of monomials with non-zero coefficients in a rational expression.

     [0] A = newvect(4);
     [ 0 0 0 0 ]
     [1] size(A);
     [4]
     [2] length(A);
     4
     [3] B = newmat(2,3,[[1,2,3],[4,5,6]]);
     [ 1 2 3 ]
     [ 4 5 6 ]
     [4] size(B);
     [2,3]

参照

References
     car cdr cons append reverse length, nmono.

det, nd_det, invmat
-------------------

det(MAT[,MOD])
nd_det(MAT[,MOD])
     :: MAT の行列式を求める.

     :: Determinant of MAT.

invmat(MAT)
     :: MAT の逆行列を求める.

     :: Inverse matrix of MAT.

return
     det: 式, invmat: リスト

     det: expression, invmat: list

mat
     行列

     matrix

mod
     素数

     prime

  * det および nd_det は行列 MAT の行列式を求める. invmat は行列 MAT の逆行列を求める. 逆行列は [分母, 分子] の形で返され, 分母が行列, 分母/分子 が逆行列となる.

  * 引数 MOD がある時, GF(MOD) 上での行列式を求める.

  * 分数なしのガウス消去法によっているため, 多変数多項式を成分とする行列に対しては小行列式展開による方法のほうが効率がよい場合もある.

  * nd_det は有理数または有限体上の多項式行列の行列式計算専用である. アルゴリズムはやはり分数なしのガウス消去法だが, データ構造および乗除算の工夫により, 一般に det より高速に計算できる.

  * det and nd_det compute the determinant of matrix MAT. invmat computes the inverse matrix of matrix MAT. invmat returns a list [num,den], where num is a matrix and num/den represents the inverse matrix.

  * The computation is done over GF(MOD) if MOD is specitied.

  * The fraction free Gaussian algorithm is employed.  For matrices with multi-variate polynomial entries, minor expansion algorithm sometimes is more efficient than the fraction free Gaussian algorithm.

  * nd_det can be used for computing the determinant of a matrix with polynomial entries over the rationals or finite fields. The algorithm is an improved vesion of the fraction free Gaussian algorithm and it computes the determinant faster than det.

     [91] A=newmat(5,5)$
     [92] V=[x,y,z,u,v];
     [x,y,z,u,v]
     [93] for(I=0;I<5;I++)for(J=0,B=A[I],W=V[I];J<5;J++)B[J]=W^J;
     [94] A;
     [ 1 x x^2 x^3 x^4 ]
     [ 1 y y^2 y^3 y^4 ]
     [ 1 z z^2 z^3 z^4 ]
     [ 1 u u^2 u^3 u^4 ]
     [ 1 v v^2 v^3 v^4 ]
     [95] fctr(det(A));
     [[1,1],[u-v,1],[-z+v,1],[-z+u,1],[-y+u,1],[y-v,1],[-y+z,1],[-x+u,1],
     [-x+z,1],[-x+v,1],[-x+y,1]]
     [96] A = newmat(3,3)$
     [97] for(I=0;I<3;I++)for(J=0,B=A[I],W=V[I];J<3;J++)B[J]=W^J;
     [98] A;
     [ 1 x x^2 ]
     [ 1 y y^2 ]
     [ 1 z z^2 ]
     [99] invmat(A);
     [[ -z*y^2+z^2*y z*x^2-z^2*x -y*x^2+y^2*x ]
     [ y^2-z^2 -x^2+z^2 x^2-y^2 ]
     [ -y+z x-z -x+y ],(-y+z)*x^2+(y^2-z^2)*x-z*y^2+z^2*y]
     [100] A*B[0];
     [ (-y+z)*x^2+(y^2-z^2)*x-z*y^2+z^2*y 0 0 ]
     [ 0 (-y+z)*x^2+(y^2-z^2)*x-z*y^2+z^2*y 0 ]
     [ 0 0 (-y+z)*x^2+(y^2-z^2)*x-z*y^2+z^2*y ]
     [101] map(red,A*B[0]/B[1]);
     [ 1 0 0 ]
     [ 0 1 0 ]
     [ 0 0 1 ]

参照

References
     newmat matrix.

qsort
-----

qsort(ARRAY[,FUNC])
     :: 一次元配列 ARRAY をソートする.

     :: Sorts an array ARRAY.

return
     ARRAY (入力と同じ; 要素のみ入れ替わる)

     ARRAY (The same as the input; Only the elements are exchanged.)

array
     一次元配列

     array

func
     比較用関数

     function for comparison

  * 一次元配列を quick sort でソートする.

  * 比較用関数が指定されていない場合, オブジェクトどうしの比較結果で順序が下のものから順に並べ換えられる.

  * 0, 1, -1 を返す 2 引数関数が FUNC として与えられた場合, FUNC(A,B)=1 の場合に A<B として, 順序が下のものから順に並べ換えられる.

  * 配列は新たに生成されず, 引数の配列の要素のみ入れ替わる.

  * This function sorts an array by QUICK SORT.

  * If FUNC is not specified, the built-in comparison function is used and the array is sorted in increasing order.

  * If a function of two arguments FUNC which returns 0, 1, or -1 is provided, then an ordering is detemined so that A<B if FUNC(A,B)=1 holds, and the array is sorted in increasing order with respect to the ordering.

  * The returned array is the same as the input. Only the elements are exchanged.

     [0] qsort(newvect(10,[1,4,6,7,3,2,9,6,0,-1]));
     [ -1 0 1 2 3 4 6 6 7 9 ]
     [1] def rev(A,B) { return A>B?-1:(A<B?1:0); }
     [2] qsort(newvect(10,[1,4,6,7,3,2,9,6,0,-1]),rev);
     [ 9 7 6 6 4 3 2 1 0 -1 ]

参照

References
     ord, vars.

rowx, rowm, rowa, colx, colm, cola
----------------------------------

rowx(MATRIX,I,J)
     :: 第 I 行と第 J 行を交換する.

     :: Exchanges the I-th and J-th rows.

rowm(MATRIX,I,C)
     :: 第 I 行を C 倍する.

     :: Multiplies the I-th row by C.

rowa(MATRIX,I,C)
     :: 第 I 行に第 I 行の C 倍を加える.

     :: Appends C times the J-th row to the J-th row.

colx(MATRIX,I,J)
     :: 第 I 行と第 J 行を交換する.

     :: Exchanges the I-th and J-th columns.

colm(MATRIX,I,C)
     :: 第 I 行を C 倍する.

     :: Multiplies the I-th column by C.

cola(MATRIX,I,C)
     :: 第 I 行に第 I 行の C 倍を加える.

     :: Appends C times the J-th column to the J-th column.

return
     行列

     matrix

I, J
     整数

     integers

C
     係数

     coefficient

  * 行列の基本変形を行うための関数である.

  * 行列が破壊されることに注意する.

  * These operations are destructive for the matrix.

     [0] A=newmat(3,3,[[1,2,3],[4,5,6],[7,8,9]]);
     [ 1 2 3 ]
     [ 4 5 6 ]
     [ 7 8 9 ]
     [1] rowx(A,1,2)$
     [2] A;
     [ 1 2 3 ]
     [ 7 8 9 ]
     [ 4 5 6 ]
     [3] rowm(A,2,x);
     [ 1 2 3 ]
     [ 7 8 9 ]
     [ 4*x 5*x 6*x ]
     [4] rowa(A,0,1,z);
     [ 7*z+1 8*z+2 9*z+3 ]
     [ 7 8 9 ]
     [ 4*x 5*x 6*x ]

参照

References
     newmat matrix