Arith

目次

はじめに

Arith クラスは算術演算クラスです。Math オブジェクトを拡張するような数学の基本的なメンバを提供します。
DHTML などの座標計算などに役立つかと思います。
他のクラスでも多々使われる再利用性の高いクラスです。

使用例

status = Arith.random(); // 0 又は 1 をランダムに返します
status = Arith.total( 1 , 5 , 6 ); // 合計値。結果は 12 = 1+5+6
status = Arith.average( 1 , 5 , 6 ); // 平均値。結果は 4 = (1+5+6)/3
status = Arith.P( 5 , 3 ); // 順列。結果は 60 = P(5,3) = 5*4*3
status = Arith.C( 5 , 2 ); // 組み合わせ。結果は 10 = C(5,2) = P(5,2)/2! = (5*4)/(2*1)

クラス変数

number ROOT2 = Math.SQRT2 ;         // √2 = 1.4142...
number ROOT3 = Math.pow( 3 , 0.5 ); // √3 = 1.7320...
特に必要なものでもないですね(^^);

クラスメソッド

2乗 : square
double square( number n );
引数を2乗した値を返します。
status = Arith.square( 5 ); // 結果は 25 = 5*5
Arith クラス的乱数 : random
number random();
number random( number[] a );
number random( number n0 , number n1 , number n2 ... );
乱数を返しますが、主に僕が DHTML を行う際にあったら便利だろうということで作成しました。
先ず、引数なしは 0 又は 1 どちらかの値を返します。
次に random( number[] a ) ですが、a の中身のいずれかの値ををランダムに返します。
random( number n0 , number n1 , number n2 ... )n0 , n1 , n2 ... のいずれかをランダムに返します。
status = Arith.random(); // 結果は 0 又は 1

var a = new Array( 1 , 3 , 5 );
status = Arith.random( a ); // 結果は 1 か 3 か 5

status = Arith.random( 0 , 2 , 4 ); // 結果は 0 か 2 か 4
2点間乱数 : ffrandom
double ffrandom( number s , number e );
乱数を返しますが、戻り値は s <= (戻り値) < e となります。
2点間で乱数値を得たいときに使用します。
status = Arith.ffrandom( 3 , 8 ); // 結果は 3 以上 8 より小さい値
合計 : total
number total( number[] a );
number total( number n0 , number n1 , number n2 ... );
合計値を返します。
引数が number[] a のとき、配列 a の中身を合計した値を返します。
引数が複数個の場合、引数を全て足した合計値を返します。
var a = new Array( 1 , 3 , 5 );
status = Arith.total( a ); // 結果は 9 = 1+3+5

staus = Arith.total( 2 , 4 , 6 ); // 結果は 12 = 2+4+6
平均値 : average
number average( number[] a );
number average( number n0 , number n1 , number n2 ... );
平均値を返します。
引数が number[] a のとき、a の中身の値の平均値を返します。
引数が複数のとき、全引数の平均値を返します。
var a = new Array( 1 , 3 , 5 );
status = Arith.average( a ); // 結果は 3 = (1+3+5)/3

status = Arith.average( 2 , 4 , 6 , 8 ); // 結果は 5 = (2+4+6+8)/4
順列 : P
int P( int n , int r );
順列値を返します。
順列で得られる値というのは例えば、
P(5,2) = 5*4 = 20
P(6,4) = 6*5*4*3 = 360
P(10,3) = 10*9*8 = 720
というような値です。つまり、n を1ずつ減らしながら、r回掛けて得られる値です。一般的な式で書けば、
P(n,r) = n*(n-1)*(n-2)*...*(n-r)*(n-r+1)
= n!/(n-r)!
となります。高校のとき確率のところで習いましたよねっ。
status = Arith.P(4,2); // 結果は 12 = 4*3
int P( int n );
階乗の値を返します。順列 P の拡張として作成しました。
階乗で得られる値というのは例えば、
P(3) = 3*2*1 = 6
P(5) = 5*4*3*2*1 = 120
P(6) = 6*5*4*3*2*1 = 720
となるような値です。つまり、n を1ずつ減らしながら、1になるまで掛けて得られる値です。P(n) = P(n,n) と同じ値になります。一般的な式で書けば、
P(n) = n*(n-1)*(n-2)*...*2*1
となりますが、これを数学の世界では n!(呼み方は n の階乗)と書きます。ちなみに 0! は 1 です。
status = Arith.P(4); // 結果は 24 = 4*3*2*1
組み合わせ : C
int C( int n , int r );
組み合わせの値を返します。
組み合わせで得られる値というのは例えば、
C(5,2) = P(5,2)/2! = (5*4)/(2*1) = 10
C(6,4) = P(6,4)/4! = (6*5*4*3)/(4*3*2*1) = 15
C(10,3) = P(10,3)/3! = (10*9*8)/(3*2*1) = 120
というような値になります。一般的な式で書けば、
C(n,r) = P(n,r)/r!
= { n*(n-1)*(n-2)*...*(n-r)*(n-r+1) }/{ r*(r-1)*(r-2)*...*2*1 }
= n!/{ r!*(n-r)! }
になります。
status = Arith.C(5,3); // 結果は 10 = P(5,3)/3! = (5*4*3)/(3*2*1)
標準出力文字列 : toString
string toString();
Arith クラスの標準出力文字列を返します。返される文字列は Arith です。
status = Arith ; // 結果は Arith

メソッド一覧

Arith クラスで使用できるクラスメソッドのリストです。
メソッド名説明
numbersquare2乗
numberrandomArith クラス的 random 関数
numberffrandom2点間で乱数を発生
numbertotal合計値
numberaverage平均値
numberP順列、階乗の計算
numberC組み合わせの計算
stringtoString標準出力文字列

補足

■ ffrandom は使える
クラスメソッドに ffrandom がありましたが、これは使えます(断じて、他のは使えないと言っているわけではありません。(^^);)。というか僕は使ってます。特に DHTML で特定のエリア内にランダムな位置でレイヤーを配置するときです。ブラウザの左半分とか、右半分とか、この関数を使えば、直感的に配置できるはずです。例えば、WIDTH をブラウザの横幅とすると、左半分に配置したいときは var x = Arith.ffrandom( 0 , WIDTH*0.5 ); ってな感じです。別に普通の人でもこの程度のコードは簡単に作成できますが、やっぱ楽したいというのがプログラム書く人の根底にありますからね。
■ 順列、階乗、組み合わせ
順列、階乗、組み合わせ・・・高校で習わなかった方には意味不明以外の何者でもないでしょう。
実際の例を出して、階乗から説明しましょう。
例えば、ここに人の人がいます。名前は A さん , B さん , C さんとします。
この人達が順番に並ぶことを考えてみます。全ての並び方は A さんが先頭の A , B , C から始まり、
A , B , C
A , C , B
B , A , C
B , C , A
C , A , B
C , B , A
の6通りです。ちょっと考えてみましょう。3! は何でしたか?
そうです。3*2*1 の 6 です。勿論、偶然一致したわけではありません。

では、次に順列ですが、今度は A さん , B さん , C さん , D さんの人がいるとします。
この人たちから人を選び1列に並ぶ場合を考えてましょう。並び方は
A さんが先頭
A , B
A , C
A , D
上3つの逆順が↓に3通り
B , A
C , A
D , A
B さんが先頭
B , C
B , D
上2つの逆順が↓に2通り
C , B
D , B
C さんが先頭
C , D
D , C
の12通り、これは P( 4 , 2 ) = 4*3 = 12 と同じ値です。

このようにある集合から、いくつかのものを順序をつけて取り出し、1列に並べたものを順列といいます。
n 人の集合から、r 人を抜き出し、その人達を1列に並べる総数を式では P( n , r ) と書きます。

階乗とはこれの特殊な形で、n 人の集合から、n 人を抜き出し、その人達を1列に並べる。式では P( n , n ) と書きますが、これを n! と書くわけです。とくに 0! は 1 と定められています。

次に組み合わせですが、また A さん , B さん , C さん , D さんの人がいるとします。
この人たちが人1組でカップルになると考えます(この際性別は考えません。笑)。
先ほどの順列との大きな違いは順番はどうでもよいということです。全組み合わせは
A , B
A , C
A , D
B , C
B , D
C , D
の6通り。これは C( 4 , 2 ) = P(4,2)/2! = (4*3)/(2*1) = 12/2 = 6 と同じです。

今度は人から人を選んで、麻雀することにしましょう。座る順番はどうでも良いです。サイコロ振ってあとで決めましょう。全組み合わせは
A , B , C , D
A , B , C , E
A , B , D , E
A , C , D , E
B , C , D , E
の5通り、これは C( 5 , 4 ) = P(5,4)/4! = (5*4*3*2)/(4*3*2*1) = 5 と同じです。

このように異なる n 個の物から r 個を取って順序を問題にしないで1組としたものが組み合わせです。
n 人の集合から r 人を選び、順序を考慮しないとき、その総数を式では C( n , r ) と書きます。

これらは高校では主に確率のところで使いましたが、実際の数学の世界では色々なところで使用されます。
ところでこれらが DHTML でどう使われるかは僕の知るところではありません(要は使ってないってこと)。
ほらほら、LOTO6 の当たる確率を計算してみましょう(笑)

補足の補足:実際の数学の紙面上では P(n,r) は nPr という風に記述します。