巨大な数値のためのBigInteger
任意精度整数を学びます
「巨大な数値のためのBigInteger」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
longを超えて
プリミティブ型のlongは約922京までの値を保持できます。それより大きな整数が必要な場合、Javaにはjava.mathパッケージのBigIntegerがあり、上限が固定されていません。
longがオーバーフローするとき
Long.MAX_VALUEを超えると、気付かないまま負の数へラップアラウンドします。このデータ破損は、典型的なバグの原因です。
public class Main {
public static void main(String[] args) {
long max = Long.MAX_VALUE;
System.out.println(max);
System.out.println(max + 1);
}
}BigIntegerの作成
数字の文字列からBigIntegerを作成します。長さの制限がないため、どのプリミティブ型よりもはるかに大きな数を記述できます。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger huge = new BigInteger("123456789012345678901234567890");
System.out.println(huge);
}
}longからvalueOfで作成する
開始値がlongに収まる場合は、BigInteger.valueOfが便利なファクトリメソッドです。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger n = BigInteger.valueOf(1000000);
System.out.println(n);
}
}不変の算術演算
BigDecimalと同様に、BigIntegerは不変です。add、subtract、multiplyは、受け取って保存する必要がある新しいオブジェクトを返します。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger a = new BigInteger("99999999999999999999");
BigInteger b = BigInteger.valueOf(1);
System.out.println(a.add(b));
}
}大きな数の乗算
longではオーバーフローするような乗算も、BigIntegerなら問題なく処理できます。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger a = new BigInteger("10000000000");
BigInteger b = new BigInteger("10000000000");
System.out.println(a.multiply(b));
}
}階乗の計算
階乗は急激に増加します。30の階乗でさえlongではオーバーフローしますが、BigIntegerなら簡単に処理できます。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger result = BigInteger.ONE;
for (int i = 1; i <= 30; i++) {
result = result.multiply(BigInteger.valueOf(i));
}
System.out.println(result);
}
}べき乗と剰余
powは値を整数の指数でべき乗し、modは剰余を返します。どちらも暗号技術でよく使われます。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger base = BigInteger.valueOf(2);
System.out.println(base.pow(64));
System.out.println(base.pow(10).mod(BigInteger.valueOf(7)));
}
}値の比較
2つのBigIntegerの大小を比較するにはcompareToを使用します。負の数、ゼロ、または正の数を返します。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger a = new BigInteger("500");
BigInteger b = new BigInteger("1000");
System.out.println(a.compareTo(b));
}
}便利な定数
BigIntegerにはZERO、ONE、TWO、TENが用意されています。累積変数の初期値やループ内で使用してください。
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger sum = BigInteger.ZERO;
sum = sum.add(BigInteger.TEN).add(BigInteger.ONE);
System.out.println(sum);
}
}使用すべき場面
階乗、非常に大きなカウンター、暗号鍵、または結果がlongを超える可能性がある場合にはBigIntegerを使用してください。通常のカウントでは、はるかに高速なプリミティブ型を使い続けてください。
理解度チェック
BigIntegerについての理解度を確認しましょう。
まとめ
BigIntegerの使い方について学びました。
longは気付かないままオーバーフローしますが、BigIntegerには固定の上限がない- 文字列から作成するか、
valueOfを使用する - 不変なので、すべての操作結果を受け取って保存する
add、multiply、pow、modで一般的な計算を扱える- 階乗、暗号処理、
longより大きな値に使用する
よくある質問
「巨大な数値のためのBigInteger」レッスンは無料ですか?
はい。「巨大な数値のためのBigInteger」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「巨大な数値のためのBigInteger」で何を学びますか?
任意精度整数を学びます ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「巨大な数値のためのBigInteger」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 金額にdoubleを使わない理由
- BigDecimalの操作
- 丸めとスケール
- 巨大な数値のためのBigInteger