C++で学ぶラグランジュの四平方定理
はじめに
このチュートリアルでは、ラグランジュの四平方定理について解説します。
ラグランジュの四平方定理とは、「すべての自然数は、高々4つの非負整数の平方の和で表すことができる」という有名な定理です。例えば、7 = 1×1 + 1×1 + 1×1 + 2×2 のように表せます。
以下のコードでは、与えられた数 n に対して、この定理を満たす4つの数の組み合わせをすべて求めます。
コード例
それでは、実際のコードを見てみましょう。
#include <bits/stdc++.h>
using namespace std;
void printSquareCombinations(int n) {
for (int i = 0; i * i <= n; i++) {
for (int j = i; j * j <= n; j++) {
for (int k = j; k * k <= n; k++) {
for (int l = k; l * l <= n; l++) {
if (i * i + j * j + k * k + l * l == n) {
cout << n << " = " << i << "*" << i << " + " << j << "*" << j << " + " << k << "*" << k << " + " << l << "*" << l << endl;
}
}
}
}
}
}
int main() {
int n = 25;
printSquareCombinations(n);
return 0;
}
実行結果
上記のコードを実行すると、次のような出力が得られます。
25 = 0*0 + 0*0 + 0*0 + 5*5
25 = 0*0 + 0*0 + 3*3 + 4*4
25 = 1*1 + 2*2 + 2*2 + 4*4
アルゴリズムのポイント
このコードでは、4重ループによってすべての組み合わせを網羅的に調べています。各ループの開始値を直前のループ変数と同じにすることで、順序が異なるだけの重複した組み合わせを排除し、無駄なく探索できるのがポイントです。
なお、各ループは最大でも √n 回程度しか回らないため、全体の計算量は O(n²) となります。より大きな数を扱う場合は、動的計画法や数論的な性質を利用した高速な手法を検討するとよいでしょう。
まとめ
この記事では、ラグランジュの四平方定理をC++で実装する方法を紹介しました。本チュートリアルについてご不明な点がある場合は、コメント欄でお気軽にお知らせください。
-
C++で正方形の外接円の面積を求める方法
本記事では、正方形の一辺の長さが与えられたときに、その正方形の外接円の面積を求める方法について解説します。まず、理解を深めるために基本的な定義をおさらいしましょう。 基本用語の定義 正方形:すべての辺の長さが等しい四角形のことです。 外接円:多角形のすべての頂点に接する円のことです。 面積:二次元図形の広がりの大きさを数量的に表したものです。 外接円の面積の求め方 正方形の外接円の面積を計算するには、円と正方形それぞれのパラメータの間にある関係を見つける必要があります。 下の図のように、正方形のすべての頂点が円に接しています。この図から読み取れる重要な性質は、正方形の対角線の長さが円の直径
-
C++のNaN(非数)とは?意味と発生例をわかりやすく解説
NaNは「Not a Number(非数)」の略称で、定義されていない、あるいは浮動小数点数として表現できない値を示す特殊な値です。C++では、数学的に結果が存在しない演算を行った場合などにNaNが返されます。 NaNが発生する典型例 NaNが発生する代表的なケースとして、次のようなものがあります。 負の数の平方根を求める(例:sqrt(-5)) 0を0で割る演算(0/0) 無限大同士の減算(∞ − ∞)などの未定義の演算 これらの演算は数学的に結果が一意に定まらないため、通常の数値ではなくNaNとして表現されます。 コード例 以下は、負の数の平方根を求めた結果、NaNが出力されるサンプル