Delphi XE1 Proで64bit以上の数字の数値計算をすることは可能でしょうか?

解決


arigayas  URL  2014-03-20 08:13:26  No: 46138

先日録画していたETV(教育テレビ)の「スーパープレゼンテーション」っていう番組で
「素数」について扱っていて
その中で「2の素数乗-1 の数が素数の可能性のある数である。」
というのを知って以下のようなループを思い浮かんだんですが

2^2 - 1 = 5
2^5 - 1 = 31
2^31 - 1 = 2147483647
2^2147483647 -1 = X

4周目でUInt64の範囲を余裕で超えてしまって桁あふれになってしまいました。
このXの下一桁まで正確に知ることはDelphiではさすがに無理でしょうか?

OSはWindows7 64bitです。


身の丈  2014-03-21 00:05:51  No: 46139

多倍長整数の演算ができるライブラリを使えば記憶領域の許す限りは可能だと思いますが、
2^2147483647 - 1が何バイトあれば表せるかの計算ってできてます?
物凄く簡単な計算で出ますけど、出力サイズすら分からない状態でやるのは無謀では…。
あと2^2 - 1 = 5って5じゃないですよね?


arigayas  2014-03-21 12:10:36  No: 46140

身の丈さん、返答していただきありがとうございます。

> 2^2147483647 - 1が何バイトあれば表せるかの計算ってできてます?
2147483647 / 8 ってことで268MBぐらいの文字数の数って事でしょうか?

> あと2^2 - 1 = 5って5じゃないですよね?
普通に1周分のループをすっ飛ばした上に計算を間違えて書いてしまいましたw
書き直すならば、

2^2 - 1 = 3
2^3 - 1 = 7
2^7 - 1 = 127
2^127 - 1 = X

ですね(赤面)

検証用にコンソールアプリを作りました。

program primeNumber_Ruijo;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  math;

var
  ans,shisu :Extended;
  i:Int32;
begin
  try
    { TODO -oUser -cConsole メイン : ここにコードを記述してください }
    shisu := 2;

    for I := 0 to 3 do
    begin
      ans := Power(2,shisu) - 1  ;
      Writeln(FloatToStr(ans));
      shisu := ans;
    end;
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.


DEKO  2014-03-21 13:29:17  No: 46141

さて、何乗までイケるのでしょう?

program Project5;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  FMTBcd,
  uBCD;

var
  i, l: Integer;
  BCD: TBcdEx;
begin
  try
    for i:=0 to MaxInt do
      begin
        BCD := 2;
        for l:=0 to i-1 do
          BCD := BCD * 2;
        Writeln(i+1, ':', String(BCD));
      end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

[BCD 演算 (XE2 以降)]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1252


DEKO  URL  2014-03-23 15:08:44  No: 46142

お題の 「Delphi XE1 Proで64bit以上の数字の数値計算をすることは可能でしょうか?」に関しては 「できます」でいいですか?

…ちなみに、現在見つかっている "メルセンヌ素数" の最大値は Wikipedia によると 2^57885161 - 1 だそうです。

[メルセンヌ素数]
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E6%95%B0#.E7.99.BA.E8.A6.8B.E3.81.95.E3.82.8C.E3.81.A6.E3.81.84.E3.82.8B.E3.83.A1.E3.83.AB.E3.82.BB.E3.83.B3.E3.83.8C.E7.B4.A0.E6.95.B0.E3.81.AE.E8.A1.A8


ダッハウ  2014-03-23 19:41:57  No: 46143

そういえば、昔、超巨大な数字の文字を、部分的に数字にして、計算する関数群を作ったことがあります。
文字列(String型)で計算できるので、多分メモリ内か、2GBまでは計算できるかと。

例えば、10550という文字があったとして、これを10  と  550という文字に分けます。
そして、550を整数の型に変換して、数字を足す。
550に5を足すのは、555になり、あとは上の10くっつけるだけ。
繰り上がったり、繰り下がったりする場合は、一つ前のブロックを変更する。

10550の文字に600足す場合10と550。
550+600=1150
桁を超えるので、1と150に分ける。
一つ前のブロックの10に1を足して11と、150をくっつける。
で、11150になる。
引き算もやりかたは同じです。
もちろん、3桁ではなく、もっと大きな長さのブロックでしたが、やり方自体は、おんなじ。

で、足し算、引き算ができれば、割り算、あまり、掛け算もできるので、素数の検索ができる。
素数の検索が目的でした。

私がdelphiは決まった型しかないと思い込み、多倍長整数ライブラリを知る前の話の、苦肉の策でした。
これはこれで頭を使ったので、面白かったんですが。

欠点は、ええ、遅いことですよ。(苦笑
なので、やり方次第で、できますねー。


arigayas  2014-05-23 00:43:15  No: 46144

読んでそのままにしていて返信することを忘れてました。
大変申し訳ありません。

身の丈 さん、DEKO さん、ダッハウ さん、
返答していただきありがとうございます。

Delphi XE1 Proで64bit以上の数字の数値計算をすることは可能か?
という問いには「可能です」ということで解決済みさせていただきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加