C++で巨大な数値を扱う方法:Boostライブラリのmultiprecision活用
C++では標準の整数型だけでは表現できない巨大な数値も、Boostライブラリを使えば簡単に扱うことができます。BoostはC++で最も広く利用されている定番ライブラリの一つで、さまざまな分野に対応した豊富な機能を提供しています。その中でもmultiprecisionモジュールを使えば、264をはるかに超えるような大きな数値でも問題なく演算できます。
この記事では、Boostライブラリを使った多倍長整数の扱い方を、実際のコード例とともに解説します。
固定精度の整数型(int128_t、int256_tなど)
boost::multiprecision名前空間には、int128_t、int256_t、int1024_tといった固定精度の整数型が用意されています。これらを使えば、最大1024ビットまでの精度を容易に確保できます。
まずは、Boostライブラリを使って非常に大きな数値同士を掛け合わせる例を見てみましょう。
コード例
#include<iostream>
#include <boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;
using namespace std;
int128_t large_product(long long n1, long long n2) {
int128_t ans = (int128_t) n1 * n2;
return ans;
}
int main() {
long long num1 = 98745636214564698;
long long num2 = 7459874565236544789;
cout << "Product of "<< num1 << " * "<< num2 << " = " <<
large_product(num1,num2);
}実行結果
Product of 98745636214564698 * 7459874565236544789 = 736630060025131838840151335215258722
long long型どうしの積は64ビットでは表現できませんが、int128_tにキャストして計算することで、オーバーフローせずに正しい結果を得られます。
任意精度の整数型(cpp_int)
もう一つ便利なのが任意精度データ型です。cpp_int型を使えば、必要な精度を実行時に自動的に割り当ててくれるため、あらかじめビット数を指定する必要がありません。桁数が事前にわからない場合でも安心して使えます。
次の例では、cpp_intを使って50の階乗を計算しています。50!は65桁にもなるため、標準の整数型では到底扱えません。
コード例
#include<iostream>
#include <boost/multiprecision/cpp_int.hpp>
using namespace boost::multiprecision;
using namespace std;
cpp_int large_fact(int num) {
cpp_int fact = 1;
for (int i=num; i>1; --i)
fact *= i;
return fact;
}
int main() {
cout << "Factorial of 50: " << large_fact(50) << endl;
}実行結果
Factorial of 50: 30414093201713378043612608166064768844377641568960512000000000000
まとめ
Boost.Multiprecisionを使うことで、C++でも標準の整数型の限界を超えた巨大な数値を簡単に扱えます。桁数が決まっている場合はint128_tなどの固定精度型を、桁数が不明な場合はcpp_intのような任意精度型を選ぶとよいでしょう。暗号処理や科学技術計算など、高精度な数値演算が必要な場面でぜひ活用してください。
-
C++でデューデニー数(Dudeney Number)を判定する方法
デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ
-
再帰を使用して自然数の合計を求めるC++プログラム
自然数とは、1から始まる正の整数のことです。自然数の列は以下のように表されます。1, 2, 3, 4, 5, 6, 7, 8, 9, 10……本記事では、再帰(リカージョン)を利用して、最初のn個の自然数の合計を求めるC++プログラムを紹介します。再帰とは、関数が自分自身を呼び出すことで問題を段階的に解決していく手法です。サンプルコード以下は、再帰を使って最初のn個の自然数の合計を計算するC++プログラムの例です。#include <iostream> using namespace std; int sum(int n) { if(n == 0) &nb