・数列は久しぶりです。「nが整数のとき、」が抜けていました。申し訳ありません。
・OEIS に本数列がありました。
後半へ
https://qiita.com/mrrclb48z/items/c0f3bda6bc875041c567
オリジナル
松本幸夫 様 (0:00〜8:46 の内 0:00〜2:21) いつもお世話になっております。
↓倍数を示す問題2
https://youtu.be/JW0Q3MeZqLY
(本日の)Gemini先生の 「n^3+5n が6の倍数であることの証明」
すべての整数 $n$ について、$n^3 + 5n$ は 6 の倍数になります。式変形を用いる方法と数学的帰納法を用いる方法の2通りで証明します。
(Gemini先生のステキな回答省略。抜粋)
sympy のソースコードで教えて下さい。計算結果もmarkdown の背景黒で。
・追加でmod も教えてもらいました。
[1] 式変形を用いる方法
パート1:式変形による証明(連続する3整数の積を利用)
# SymPyを用いて n^3 + 5n の式変形(連続する3整数の積)と6の倍数判定を検証するコード
import sympy as sp
# 記号 n を整数として定義
n = sp.Symbol('n', integer=True)
# 1. n^3 - n の因数分解(連続する3整数の積)
expr_part = n**3 - n
factored_part = sp.factor(expr_part)
# 2. n^3 + 5n = (n^3 - n) + 6n の等式検証
expr_original = n**3 + 5*n
expr_transformed = factored_part + 6*n
is_valid = sp.simplify(expr_original - expr_transformed) == 0
# 3. すべての余り (n mod 6 = 0, 1, 2, 3, 4, 5) に対する 6 の倍数判定
mod_results = {r: (r**3 + 5*r) % 6 for r in range(6)}
# 結果の表示
print("=== 式変形の検証 ===")
print(f"n^3 - n の因数分解 : {factored_part}")
print(f"n^3 + 5n = (n^3 - n) + 6n の変形結果 : {expr_transformed}")
print(f"元の式と変形後の式の等価性 (差が0か) : {is_valid}")
print("\n=== n mod 6 における余りの検証 ===")
for r, rem in mod_results.items():
val = r**3 + 5*r
print(f"n ≡ {r} (mod 6) のとき: {r}^3 + 5*{r} = {val:3d} ≡ {rem} (mod 6)")
計算結果
=== 式変形の検証 ===
n^3 - n の因数分解 : n*(n - 1)*(n + 1)
n^3 + 5n = (n^3 - n) + 6n の変形結果 : n*(n - 1)*(n + 1) + 6n
元の式と変形後の式の等価性 (差が0か) : True
=== n mod 6 における余りの検証 ===
n ≡ 0 (mod 6) のとき: 0^3 + 5*0 = 0 ≡ 0 (mod 6)
n ≡ 1 (mod 6) のとき: 1^3 + 5*1 = 6 ≡ 0 (mod 6)
n ≡ 2 (mod 6) のとき: 2^3 + 5*2 = 18 ≡ 0 (mod 6)
n ≡ 3 (mod 6) のとき: 3^3 + 5*3 = 42 ≡ 0 (mod 6)
n ≡ 4 (mod 6) のとき: 4^3 + 5*4 = 84 ≡ 0 (mod 6)
n ≡ 5 (mod 6) のとき: 5^3 + 5*5 = 150 ≡ 0 (mod 6)
[2] 数学的帰納法を用いる方法
パート2:数学的帰納法による証明($n$ が自然数の場合)
# SymPyを用いて数学的帰納法(n^3 + 5n が6の倍数であること)の各ステップを検証するコード
import sympy as sp
# 記号 n, k, m を整数として定義
n, k, m = sp.symbols('n k m', integer=True)
# 与式 P(n) の定義
def P(n_val):
return n_val**3 + 5*n_val
# [1] 基礎ステップ (n = 1 のとき)
p_1 = P(1)
p_1_mod_6 = p_1 % 6
# [2] 帰納ステップ (n = k+1 のときの展開と変形)
p_k_plus_1 = P(k + 1)
p_k_plus_1_expanded = sp.expand(p_k_plus_1)
# 仮定 P(k) = k^3 + 5k = 6m を用いた代入 (k^3 を 6m - 5k に置き換え)
p_k_plus_1_subbed = p_k_plus_1_expanded.subs(k**3, 6*m - 5*k)
p_k_plus_1_simplified = sp.simplify(p_k_plus_1_subbed)
# 3k(k+1) + 6(m+1) の形へ因数分解・整理
# 3k(k+1) が常に 6 の倍数になることの検証 (k(k+1) は偶数)
k_term = 3*k*(k + 1)
# 任意の整数 k に対して 3k(k+1) % 6 が常に 0 になるか確認
k_term_mod_6_check = all((3*i*(i + 1)) % 6 == 0 for i in range(6))
# 結果の表示
print("=== [1] 基礎ステップ (n = 1) ===")
print(f"P(1) = 1^3 + 5*1 = {p_1}")
print(f"P(1) mod 6 = {p_1_mod_6} (6の倍数であるか: {p_1_mod_6 == 0})")
print("\n=== [2] 帰納ステップ (n = k + 1) ===")
print(f"P(k + 1) の展開結果 : {p_k_plus_1_expanded}")
print(f"仮定 (k^3 = 6m - 5k) を代入後 : {p_k_plus_1_simplified}")
print(f"6で括った形 : 6*m + 3*k*(k + 1) + 6")
print(f"3k(k+1) が常に6の倍数か (k mod 6 全判定) : {k_term_mod_6_check}")
計算結果
=== [1] 基礎ステップ (n = 1) ===
P(1) = 1^3 + 5*1 = 6
P(1) mod 6 = 0 (6の倍数であるか: True)
=== [2] 帰納ステップ (n = k + 1) ===
P(k + 1) の展開結果 : k**3 + 3*k**2 + 8*k + 6
仮定 (k^3 = 6m - 5k) を代入後 : 3*k**2 + 3*k + 6*m + 6
6で括った形 : 6*m + 3*k*(k + 1) + 6
3k(k+1) が常に6の倍数か (k mod 6 全判定) : True
整数ですけど
整数ですけど、負の数だとソースコードが変ってきますか。
いいえ、負の数であってもソースコードを変更する必要はありません。
数学的にもプログラム的にも、「すべての整数 $n$(正・0・負)」に対してそのまま成り立ちます。
- 式変形(パート1)の観点...
- 数学的帰納法(パート2)の観点...
負の数も含めた検証 SymPy コード
# 負の数も含めた整数全域での検証
import sympy as sp
n = sp.Symbol('n', integer=True)
expr = n**3 + 5*n
# -5 から 5 までの負の数・0・正の数を評価
results = {i: expr.subs(n, i) for i in range(-5, 6)}
print("=== 負の数・0・正の数での代入結果と 6 の倍数判定 ===")
for val, res in results.items():
is_divisible = (res % 6 == 0)
print(f"n = {val:2d} : {val:2d}^3 + 5*({val:2d}) = {res:4d} (6の倍数: {is_divisible})")
=== 負の数・0・正の数での代入結果と 6 の倍数判定 ===
n = -5 : -5^3 + 5*(-5) = -150 (6の倍数: True)
n = -4 : -4^3 + 5*(-4) = -84 (6の倍数: True)
n = -3 : -3^3 + 5*(-3) = -42 (6の倍数: True)
n = -2 : -2^3 + 5*(-2) = -18 (6の倍数: True)
n = -1 : -1^3 + 5*(-1) = -6 (6の倍数: True)
n = 0 : 0^3 + 5*( 0) = 0 (6の倍数: True)
n = 1 : 1^3 + 5*( 1) = 6 (6の倍数: True)
n = 2 : 2^3 + 5*( 2) = 18 (6の倍数: True)
n = 3 : 3^3 + 5*( 3) = 42 (6の倍数: True)
n = 4 : 4^3 + 5*( 4) = 84 (6の倍数: True)
n = 5 : 5^3 + 5*( 5) = 150 (6の倍数: True)
mod を 使ったsympy のソースコード を教えて下さい。
# SymPyを用いて n^3 + 5n が 6 の倍数であることを mod (剰余) で検証するコード
import sympy as sp
# 記号 n を整数として定義
n = sp.Symbol('n', integer=True)
# 与式
expr = n**3 + 5*n
# 1. 式全体に対する mod 6 計算(合同式での簡略化: 5n ≡ -n mod 6 より n^3 - n ≡ (n-1)n(n+1) ≡ 0)
mod_expr = sp.Mod(expr, 6)
# 2. n を 6 で割った余り (0, 1, 2, 3, 4, 5) ごとの評価
mod_results = {r: sp.Mod(expr.subs(n, r), 6) for r in range(6)}
# 3. 負の数を含む任意の整数(例: -5 ~ 5)での Mod 評価
all_check = {k: sp.Mod(expr.subs(n, k), 6) for k in range(-5, 6)}
# 結果の表示
print("=== SymPy Mod 関数による検証 ===")
print(f"元式 : {expr}")
print(f"Mod(n^3 + 5n, 6) 構造 : {mod_expr}")
print("\n=== n = 0, 1, 2, 3, 4, 5 (mod 6) での検証 ===")
for r, res in mod_results.items():
print(f"n ≡ {r} (mod 6) のとき: Mod({r}^3 + 5*{r}, 6) = {res}")
print("\n=== 負の数・0・正の数 (n = -5 ~ 5) での検証 ===")
print(f"すべての余りが 0 か : {all(res == 0 for res in all_check.values())}")
計算結果
=== SymPy Mod 関数による検証 ===
元式 : n**3 + 5*n
Mod(n^3 + 5n, 6) 構造 : Mod(n**3 + 5*n, 6)
=== n = 0, 1, 2, 3, 4, 5 (mod 6) での検証 ===
n ≡ 0 (mod 6) のとき: Mod(0^3 + 5*0, 6) = 0
n ≡ 1 (mod 6) のとき: Mod(1^3 + 5*1, 6) = 0
n ≡ 2 (mod 6) のとき: Mod(2^3 + 5*2, 6) = 0
n ≡ 3 (mod 6) のとき: Mod(3^3 + 5*3, 6) = 0
n ≡ 4 (mod 6) のとき: Mod(4^3 + 5*4, 6) = 0
n ≡ 5 (mod 6) のとき: Mod(5^3 + 5*5, 6) = 0
=== 負の数・0・正の数 (n = -5 ~ 5) での検証 ===
すべての余りが 0 か : True
n^3+5*n は, オンライン整数列辞典 にありますか
OEIS ID: A004006
(おまけ)Gemini先生へ。履歴。
・重複していますが、そのままです。
1. n^3+5*n は,6の倍数である。
2. 2つに分けて。
3. [1]をsympy のソースコードで教えて下さい。計算結果もmarkdown の背景黒で。
4. [2]をsympy のソースコードで教えて下さい。計算結果もmarkdown の背景黒で。
5. 整数ですけど、負の数だとソースコードが変ってきますか。
6. n^3+5*n は, オンライン整数列辞典 にありますか
7. url を教えて
8. 間違っています
9. mod を 使ったsympy のソースコード を教えて下さい。
10. 上記の私の質問すべてから、Markdownのテキスト形式で、質問リストを出力して。追番を追加して。本質問も含めて。コピーできる形式で。空白行不要です。
いつもの? sympyの実行環境 と 参考のおすすめです。
sympyのweb上での実行方法
SymPy Live Shellで。FreeCADのマクロは、以下で実行できません。
いつもと違うおすすめです。
sympy のdoc
Qiita内で
・PR
数列といえば。tagもありますが、シツコイゾーです。
wikipedia で
・後半で
・OEISで
https://en.wikipedia.org/wiki/On-Line_Encyclopedia_of_Integer_Sequences