数の演算
====

Numbers
=======

idiv, irem
----------

idiv(I1,I2)
     :: 整数除算による商.

     :: Integer quotient of I1 divided by I2.

irem(I1,I2)
     :: 整数除算による剰余.

     :: Integer remainder of I1 divided by I2.

return
     整数

     integer

i1,i2
     整数

     integer

  * I1 の I2 による整数除算による商, 剰余を求める.

  * I2 は 0 であってはならない.

  * 被除数が負の場合, 絶対値に対する値にマイナスをつけた値を返す.

  * I1 % I2 は, 結果が正に正規化されることを除けば irem() の代わりに用いることができる.

  * 多項式の場合は sdiv, srem を用いる.

  * Integer quotient and remainder of I1 divided by I2.

  * I2 must not be 0.

  * If the dividend is negative, the results are obtained by changing the sign of the results for absolute values of the dividend.

  * One can use I1 % I2 for replacement of irem() which only differs in the point that the result is always normalized to non-negative values.

  * Use sdiv(), srem() for polynomial quotient.

     [0] idiv(100,7);
     14
     [0] idiv(-100,7);
     -14
     [1] irem(100,7);
     2
     [1] irem(-100,7);
     -2

参照

References
     sdiv sdivm srem sremm sqr sqrm, %.

fac
---

fac(I)
     :: I の階乗.

     :: The factorial of I.

return
     整数

     integer

i
     整数

     integer

  * I の階乗を計算する.

  * I が負の場合は 0 を返す.

  * The factorial of I.

  * Returns 0 if the argument I is negative.

     [0] fac(50);
     30414093201713378043612608166064768844377641568960512000000000000

igcd,igcdcntl
-------------

igcd(I1,I2)
     :: 整数の GCD (最大公約数)

     :: The integer greatest common divisor of I1 and I2.

igcdcntl([I])
     :: 整数 GCDのアルゴリズム選択

     :: Selects an algorithm for integer GCD.

return
     整数

     integer

i1,i2,i
     整数

     integer

  * igcd は I1 と I2 の GCD を求める.

  * 引数が整数でない場合は, エラーまたは無意味な結果を返す.

  * 多項式の場合は, gcd, gcdz を用いる.

  * 整数 GCD にはさまざまな方法があり, igcdcntl で設定できる.

     0
          Euclid 互除法 (default)

     1
          binary GCD

     2
          bmod GCD

     3
          accelerated integer GCD

     2, 3 は [Weber] による.

     おおむね 3 が高速だが, 例外もある.

  * Function igcd() returns the integer greatest common divisor of the given two integers.

  * An error will result if the argument is not an integer; the result is not valid even if one is returned.

  * Use gcd(), gcdz() for polynomial GCD.

  * Various method of integer GCD computation are implemented and they can be selected by igcdcntl.

     0
          Euclid algorithm (default)

     1
          binary GCD

     2
          bmod GCD

     3
          accelerated integer GCD

     2, 3 are due to [Weber].

     In most cases 3 is the fastest, but there are exceptions.

     [0] A=lrandom(10^4)$
     [1] B=lrandom(10^4)$
     [2] C=lrandom(10^4)$
     [3] D=A*C$
     [4] E=A*B$
     [5] cputime(1)$
     [6] igcd(D,E)$
     0.6sec + gc : 1.93sec(2.531sec)
     [7] igcdcntl(1)$
     [8] igcd(D,E)$
     0.27sec(0.2635sec)
     [9] igcdcntl(2)$
     [10] igcd(D,E)$
     0.19sec(0.1928sec)
     [11] igcdcntl(3)$
     [12] igcd(D,E)$
     0.08sec(0.08023sec)

参照

References
     gcd gcdz.

ilcm
----

ilcm(I1,I2)
     :: 最小公倍数を求める.

     :: The integer least common multiple of I1 and I2.

return
     整数

     integer

i1,i2
     整数

     integer

  * 整数 I1, I2 の最小公倍数を求める.

  * 一方が 0 の場合 0 を返す.

  * This function computes the integer least common multiple of I1, I2.

  * If one of argument is equal to 0, the return 0.

参照

References
     igcd igcdcntl, mt_save mt_load.

inv
---

inv(I,M)
     :: M を法とする I の逆数

     :: the inverse (reciprocal) of I modulo M.

return
     整数

     integer

i,m
     整数

     integer

  * IA == 1 mod (M) なる整数 A を求める.

  * I と M は互いに素でなければならないが, inv() はそのチェックは行わない.

  * This function computes an integer such that IA == 1 mod (M).

  * The integer I and  M must be mutually prime. However, inv() does not check it.

     [71] igcd(1234,4321);
     1
     [72] inv(1234,4321);
     3239
     [73] irem(3239*1234,4321);
     1

参照

References
     igcd igcdcntl.

prime, lprime
-------------

prime(INDEX)

lprime(INDEX)
     :: 素数を返す

     :: Returns a prime number.

return
     整数

     integer

index
     整数

     integer

  * prime(), lprime() いずれもシステムが内部に持つ素数表の要素を返す. index は 0 以上の整数で, 素数表のインデックスに用いられる. prime() は 16381 までの素数を小さい順に 1900 個, lprime() は, 10 進 8 桁で最大の素数から大きい順に 999 個返す. それ以外のインデックスに対しては 0 を返す.

  * より一般的な素数生成函数としては, pari(nextprime,NUMBER) がある.

  * The two functions, prime() and lprime(), returns an element stored in the system table of prime numbers. Here, index is a non-negative integer and be used as an index for the prime tables. The function prime() can return one of 1900 primes up to 16381 indexed so that the smaller one has smaller index.  The function lprime() can return one of 999 primes which are 8 digit sized and indexed so that the larger one has the smaller index. The two function always returns 0 for other indices.

  * For more general function for prime generation, there is a PARI function

     pari(nextprime,NUMBER).

     [95] prime(0);
     2
     [96] prime(1228);
     9973
     [97] lprime(0);
     99999989
     [98] lprime(999);
     0

参照

References
     pari.

random
------

random([SEED])
     :: 乱数を生成する.

seed
return
     自然数

     non-negative integer

  * 最大 2^32-1 の非負整数の乱数を生成する.

  * 0 でない引数がある時, その値を seed として設定してから, 乱数を生成する.

  * default の seed は固定のため, 種を設定しなければ, 生成される乱数の系列は起動毎に一定である.

  * 松本眞-西村拓士による Mersenne Twister (http://www.math.keio.ac.jp/matsumoto/mt.html) アルゴリズムの, 彼ら自身による実装を用いている.

  * 周期は 2^19937-1 と非常に長い.

  * mt_save により state をファイルに save できる. これを mt_load で読み込むことにより, 異る Asir セッション間で一つの乱数の系列を辿ることができる.

  * Generates a random number which is a non-negative integer less than 2^32.

  * If a non zero argument is specified, then after setting it as a random seed, a random number is generated.

  * As the default seed is fixed, the sequence of the random numbers is always the same if a seed is not set.

  * The algorithm is Mersenne Twister (http://www.math.keio.ac.jp/matsumoto/mt.html) by M. Matsumoto and T. Nishimura. The implementation is done also by themselves.

  * The period of the random number sequence is 2^19937-1.

  * One can save the state of the random number generator with mt_save. By loading the state file with mt_load, one can trace a single random number sequence arcoss multiple sessions.

参照

References
     lrandom, mt_save mt_load.

lrandom
-------

lrandom(BIT)
     :: 多倍長乱数を生成する.

     :: Generates a long random number.

bit

return
     自然数

     integer

  * 高々 BIT の非負整数の乱数を生成する.

  * random を複数回呼び出して結合し, 指定の bit 長にマスクしている.

  * Generates a non-negative integer of at most BIT bits.

  * The result is a concatination of outputs of random.

参照

References
     random, mt_save mt_load.

mt_save, mt_load
----------------

mt_save(FNAME)
     :: 乱数生成器の現在の状態をファイルにセーブする.

     :: Saves the state of the random number generator.

mt_load(FNAME)
     :: ファイルにセーブされた乱数生成器の状態をロードする.

     :: Loads a saved state of the random number generator.

return
     0 または 1

     0 or 1

fname
     文字列

     string

  * ある状態をセーブし, その状態をロードすることで, 一つの疑似乱数系列を, 新規の Asir セッションで続けてたどることができる.

  * One can save the state of the random number generator with mt_save. By loading the state file with mt_load, one can trace a single random number sequence arcoss multiple Asir sessions.

     [340] random();
     3510405877
     [341] mt_save("/tmp/mt_state");
     1
     [342] random();
     4290933890
     [343] quit;
     % asir
     This is Asir, Version 991108.
     Copyright (C) FUJITSU LABORATORIES LIMITED.
     3 March 1994. All rights reserved.
     [340] mt_load("/tmp/mt_state");
     1
     [341] random();
     4290933890

参照

References
     random, lrandom.

nm, dn
------

nm(RAT)
     :: RAT の分子.

     :: Numerator of RAT.

dn(RAT)
     :: RAT の分母.

     :: Denominator of RAT.

return
     整数または多項式

     integer or polynomial

rat
     有理数または有理式

     rational number or rational expression

  * 与えられた有理数また有理式の分子及び分母を返す.

  * 有理数の場合, 分母は常に正で, 符号は分子が持つ.

  * 有理式の場合, 単に分母, 分子を取り出すだけである. 有理式に対しては, 約分は自動的には行われない. red() を明示的に呼び出す必要がある.

  * Numerator and denominator of a given rational expression.

  * For a rational number, they return its numerator and denominator, respectively.  For a rational expression whose numerator and denominator may contain rational numbers, they do not separate those rational coefficients to numerators and denominators.

  * For a rational number, the denominator is always kept positive, and the sign is contained in the numerator.

  * Risa/Asir does not cancel the common divisors unless otherwise explicitly specified by the user. Therefore, nm() and dn() return the numerator and the denominator as it is, respectively.

     [2] [nm(-43/8),dn(-43/8)];
     [-43,8]
     [3] dn((x*z)/(x*y));
     y*x
     [3] dn(red((x*z)/(x*y)));
     y

参照

References
     red.

conj, real, imag
----------------

real(COMP)
     :: COMP の実数部分.

     :: Real part of COMP.

imag(COMP)
     :: COMP の虚数部分.

     :: Imaginary part of COMP.

conj(COMP)
     :: COMP の共役複素数.

     :: Complex conjugate of COMP.

return comp
     複素数

     complex number

  * 複素数に対し, 実部, 虚部, 共役を求める.

  * これらは, 多項式に対しても働く.

  * Basic operations for complex numbers.

  * These functions works also for polynomials with complex coefficients.

     [111] A=(2+@i)^3;
     (2+11*@i)
     [112] [real(A),imag(A),conj(A)];
     [2,11,(2-11*@i)]

eval, deval
-----------

eval(OBJ[,PREC])

deval(OBJ)
     :: OBJ の値の評価.

     :: Evaluate OBJ numerically.

return
     数あるいは式

     number or expression

obj
     一般の式

     general expression

prec
     整数

     integer

  * OBJ に含まれる函数の値を可能な限り評価する.

  * deval は倍精度浮動小数を結果として eval の場合, 有理数はそのまま残る.

  * eval においては, 計算は PARI (see pari) が行う. deval においては, 計算は C 数学ライブラリの関数を用いて行う.

  * deval は複素数は扱えない.

  * eval においては, PREC を指定した場合, 計算は, 10 進 PREC 桁程度で行われる. PREC の指定がない場合, 現在設定されている精度で行われる. (see setprec)

     扱える函数は, 次の通り.
          sin, cos, tan,

          asin, acos, atan,

          sinh, cosh, tanh,

          asinh, acosh, atanh,

          exp, log, pow(a,b) (a^b)

  * 以下の記号を数として評価できる. ただし @i を扱えるのは eval, deval のみである.

     @i
          虚数単位

     @pi
          円周率

     @e
          自然対数の底

  * Evaluates the value of the functions contained in OBJ as far as possible.

  * deval returns double float. Rational numbers remain unchanged in results from eval.

  * In eval the computation is done by PARI (see pari). In deval the computation is done by the C math library.

  * deval cannot handle complex numbers.

  * When PREC is specified, computation will be performed with a precision of about PREC-digits. If PREC is not specified, computation is performed with the precision set currently. (see setprec)

  * Currently available numerical functions are listed below. Note they are only a small part of whole PARI functions.

          sin, cos, tan,

          asin, acos, atan,

          sinh, cosh, tanh, asinh, acosh, atanh,

          exp, log, pow(a,b) (a^b)

  * Symbols for special values are as the followings. Note that @i cannot be handled by deval.

     @i
          unit of imaginary number

     @pi
          the number pi, the ratio of circumference to diameter

     @e
          Napier's number (exp(1))

     [118] eval(exp(@pi*@i));
     -1.0000000000000000000000000000
     [119] eval(2^(1/2));
     1.414213562373095048763788073031
     [120] eval(sin(@pi/3));
     0.86602540378443864674620506632
     [121] eval(sin(@pi/3)-3^(1/2)/2,50);
     -2.78791084448179148471 E-58
     [122] eval(1/2);
     1/2
     [123] deval(sin(1)^2+cos(1)^2);
     1

参照

References
     ctrl, setprec, pari.

pari
----

pari(FUNC,ARG,PREC)
     :: PARI の函数 FUNC を呼び出す.

     :: Call PARI function FUNC.

return
     FUNC 毎に異なる.

     Depends on FUNC.

func
     PARI の函数名

     Function name of PARI.

arg
     FUNC の引数

     Arguments of FUNC.

prec
     整数

     integer

  * PARI の函数を呼び出す.

  * PARI [Batut et al.] は Bordeaux 大学で開発されフリーソフトウェアとして公開されている. PARI は数式処理的な機能を有してはいるが, 主なターゲットは整数論に関連した数 (bignum, bigfloat) の演算で, 四則演算に限らずbigfloat によるさまざまな函数値の評価を高速に行うことができる. PARI は他のプログラムからサブルーチンライブラリとして用いることができ, また, gp という PARIライブラリのインタフェースにより UNIX のアプリケーションとして利用することもできる. 現在のバージョンは 2.0.17beta でいくつかの ftp site (たとえば ftp://megrez.ceremab.u-bordeaux.fr/pub/pari) から anonymous ftp できる.

  * 最後の引数 PREC で計算精度を指定できる. PREC を省略した場合 setprec() で指定した精度となる.

  * 現時点で実行できる PARI の函数は次の通りである. いずれも 1 引数で Asir が対応できる型の引数をとる函数である. なお各々の機能については PARI のマニュアルを参照のこと.

  * This command connects Asir to PARI system so that several functions of PARI can be conveniently used from Risa/Asir.

  * PARI [Batut et al.] is developed at Bordeaux University, and distributed as a free software.  Though it has a certain facility to computer algebra, its major target is the operation of numbers (bignum, bigfloat) related to the number theory.  It facilitates various function evaluations as well as arithmetic operations at a remarkable speed.  It can also be used from other external programs as a library. It provides a language interface named gp to its library, which enables a user to use PARI as a calculator which runs on UNIX. The current version is 2.0.17beta.  It can be obtained by several ftp sites. (For example, ftp://megrez.ceremab.u-bordeaux.fr/pub/pari.)

  * The last argument (optional) INT specifies the precision in digits for bigfloat operation. If the precision is not explicitly specified, operation will be performed with the precision set by setprec().

  * Currently available functions of PARI system are as follows. Note these are only a part of functions in PARI system. For details of individual functions, refer to the PARI manual. (Some of them can be seen in the following example.)

     abs, adj, arg, bigomega, binary, ceil, centerlift, cf, classno, classno2, conj, content, denom, det, det2, detr, dilog, disc, discf, divisors, eigen, eintg1, erfc, eta, floor, frac, galois, galoisconj, gamh, gamma, hclassno, hermite, hess, imag, image, image2, indexrank, indsort, initalg, isfund, isprime, ispsp, isqrt, issqfree, issquare, jacobi, jell, ker, keri, kerint, kerintg1, kerint2, kerr, length, lexsort, lift, lindep, lll, lllg1, lllgen, lllgram, lllgramg1, lllgramgen, lllgramint, lllgramkerim, lllgramkerimgen, lllint, lllkerim, lllkerimgen, lllrat, lngamma, logagm, mat, matinvr, matrixqz2, matrixqz3, matsize, modreverse, mu, nextprime, norm, norml2, numdiv, numer, omega, order, ordred, phi, pnqn, polred, polred2, primroot, psi, quadgen, quadpoly, real, recip, redcomp, redreal, regula, reorder, reverse, rhoreal, roots, rootslong, round, sigma, signat, simplify, smalldiscf, smallfact, smallpolred, smallpolred2, smith, smith2, sort, sqr, sqred, sqrt, supplement, trace, trans, trunc, type, unit, vec, wf, wf2, zeta

  * Asir で用いているのは PARI のほんの一部の機能であるが, 今後より多くの機能が利用できるよう改良する予定である.

  * Asir currently uses only a very small subset of PARI. We will improve Asir so that it can provide more functions of PARI.

     /* 行列の固有ベクトルを求める. */

     /* Eigen vectors of a numerical matrix */

     [0] pari(eigen,newmat(2,2,[[1,1],[1,2]]));
     [ -1.61803398874989484819771921990 0.61803398874989484826 ]
     [ 1 1 ]

     /* 1 変数多項式の根を求める. */

     /* Roots of a polynomial */

     [1] pari(roots,t^2-2);
     [ -1.41421356237309504876 1.41421356237309504876 ]

参照

References
     setprec.

setprec
-------

setprec([N])
     :: bigfloat の桁数を N 桁に設定する.

     :: Sets the precision for bigfloat operations to N digits.

return
     整数

     integer

n
     整数

     integer

  * 引数がある場合, bigfloat の桁数を N 桁に設定する. 引数のあるなしにかかわらず, 以前に設定されていた値を返す.

  * bigfloat の計算は PARI (see pari) によって行われる.

  * bigfloat での計算に対し有効である. bigfloat の flag を on にする方法は, ctrl を参照.

  * 設定できる桁数に上限はないが, 指定した桁数に設定されるとは限らない. 大きめの値を設定するのが安全である.

  * When an argument is given, it sets the precision for bigfloat operations to N digits. The return value is always the previous precision in digits regardless of the existence of an argument.

  * Bigfloat operations are done by PARI. (see pari)

  * This is effective for computations in bigfloat. Refer to ctrl() for turning on the `bigfloat flag.'

  * There is no upper limit for precision digits. It sets the precision to some digits around the specified precision. Therefore, it is safe to specify a larger value.

     [1] setprec();
     9
     [2] setprec(100);
     9
     [3] setprec(100);
     96

参照
     ctrl, eval deval, pari.

setmod
------

setmod([P])
     :: 有限体を GF(P) に設定する.

     :: Sets the ground field to GF(P).

return
     整数

     integer

n
     2^27 未満の素数

     prime less than 2^27

  * 有限体を GF(P) に設定する. 設定値を返す.

  * 有限体の元の型を持つ数は, それ自身はどの有限体に属するかの情報を持たず, 現在設定されている素数 P により GF(P) 上での演算が適用される.

  * 位数の大きな有限体に関しては see 有限体に関する演算.

  * Sets the ground field to GF(P) and returns the value P.

  * A member of a finite field does not have any information about the field and the arithmetic operations over GF(P) are applied with P set at the time.

  * As for large finite fields, see Finite fields.

     [0] A=dp_mod(dp_ptod(2*x,[x]),3,[]);
     (2)*<<1>>
     [1] A+A;
     addmi : invalid modulus
     return to toplevel
     [1] setmod(3);
     3
     [2] A+A;
     (1)*<<1>>

参照

References

     dp_mod dp_rat, 数の型.

     dp_mod dp_rat, Types of numbers.

ntoint32, int32ton
------------------

ntoint32(N)
int32ton(INT32)
     :: 非負整数と符号なし 32bit 整数の間の型変換.

     :: Type-conversion between a non-negative integer and an unsigned 32bit integer.

return
     符号なし 32bit 整数または非負整数

     unsigned 32bit integer or non-negative integer

n
     2^32 未満の非負整数

     non-negative interger less than 2^32

int32
     符号なし 32bit 整数

     unsigned 32bit integer

  * 非負整数 (識別子 1) の符号なし 32bit 整数 (識別子 10) への変換, またはその逆変換を行う.

  * 32bit 整数は OpenXM の基本構成要素であり, 整数をその型で送信する必要がある場合に用いる.

  * These functions do conversions between non-negative integers (the type id 1) and unsigned 32bit integers (the type id 10).

  * An unsigned 32bit integer is a fundamental construct of OpenXM and one often has to send an integer to a server as an unsigned 32bit integer. These functions are used in such a case.

参照

References

     分散計算, 数の型.

     Distributed computation, Types of numbers.