スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#入門基本編落穂拾い その15 ( BigInt)

大きい整数を取り扱うとき便利なのがBigInt型で巨大な数を取り扱うことができます。これは.NETのSystem.Numerics.BigIntegerクラスの別名となります。
ただintやint64に比べると、処理速度は相当低速となります。
 
 
名前空間はSystem.Numericsで参照の追加が必要です。
 open System.Numerics;; 
 
まずは生成から。
 
> let bi = 1055876868897I;; //最後にIを付けます。
val bi : System.Numerics.BigInteger = 1055876868897
 
int,int32,floatから生成するには次のようにします。
 
> let t = BigInteger (123);;
val t : BigInteger = 123
 
> let t = BigInteger (123L);;
val t : BigInteger = 123
 
> let t = BigInteger (123.456);;
val t : BigInteger = 123 //小数点以下は切り捨てられます。
 
文字から生成するにはParseを用います。
 
> let t = BigInteger.Parse("123456");;
val t : BigInteger = 123456
 
new で、int(=int32),int64からも生成できます。
 
> new BigInteger (32);;
val it : BigInteger = 32 {IsEven = true;
                          IsOne = false;
                          IsPowerOfTwo = true;
                          IsZero = false;
                          Sign = 1;}
> new BigInteger (32L);;
val it : BigInteger = 32 {IsEven = true;
                          IsOne = false;
                          IsPowerOfTwo = true;
                          IsZero = false;
                          Sign = 1;}
 
表示からも分かるように、IsEven等のプロパティを持ちます。

 
> let t = -8I;;
val t : BigInteger = -8
 
> t.IsEven ;; //偶数か
val it : bool = true
> t.IsOne;; //1か
val it : bool = false
> t.IsPowerOfTwo;;//2のべき乗か
val it : bool = false
> t.IsZero;;//0か
val it : bool = false
> t.Sign;;//符号 負の場合は-1、ゼロのときは0、正の時は1を返す
val it : int = -1
 
単項演算子として次のものが定義されています。
- 、+ 

> let t = 1234567I;;
val t : BigInteger = 1234567
 
> let t0 = -t;;
val t0 : BigInteger = -1234567
 
二項演算子として次のものが定義されています。
 
+,/,=,>,>=,<>,<,<=,%,*,-
 

> 123456789I*123456789I;;
val it : BigInteger = 15241578750190521 
 
関数をいくつか紹介しておきます。
 
> BigInteger.Abs (-12I);;//絶対値を求めます
val it : BigInteger = 12
 
> BigInteger.GreatestCommonDivisor(12457888I,32415888888888888888I);;//最大公約数を求めます。
val it : BigInteger = 8 
 
次にDivRemです。これは商と余りを求めます。
まず余りを入れる為にBigIntの参照を定義しておきます。
 
> let rem = ref 0I;;
val rem : BigInteger ref = {contents = 0;}
 
DivRemを使います。
 
> let q = BigInteger.DivRem(247I,123I,rem);;
val q : BigInteger = 2 //商
 
> !rem;;//余り
val it : BigInteger = 1 
 
最後にPowです。これはべき乗を返します
> BigInteger.Pow(2I,1024);;
val it : BigInteger =
  179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216 
 
その他、対数、ビット関連等の、さらにいろいろなメソッドが用意されています。
 

> BigInteger.Log10 (100000000000000000000000000000000I);;//常用対数の値を求めます。
val it : float = 32.0
 
> BigInteger.Log(100000000000000000000000000000000I,2.0);;//任意の底について対数の値を求めます。
val it : float = 106.301699
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。