・確認してみましょう だけでよかった。
(本日の)ChatGPT先生へ
# 質問リスト
1. sympy で (sqrt(2)+2)/2 を 1+1/sqrt(2) と表示する方法を教えて下さい。
2. 希望します。
3. 整数 + 分数(分母に sqrt を含む形) に変形する関数 で分子が1で教えて下さい。
4. 分母は整式で。例として、分母が1+sqrt(2) で教えて下さい。
5. 整数+1/整式 整式は√を含む です。
6. 元の式は (sqrt(2)+2)/2 は対応していますか。
7. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。
(以下回答抜粋)
方法1:radsimp()と式の操作で変形
from sympy import symbols, sqrt, simplify, radsimp
# 元の式
expr = (sqrt(2) + 2) / 2
# 表示を 1 + 1/sqrt(2) の形にしたい場合
# 1 + 1/sqrt(2) に変形して同値であることを確認する
target_expr = 1 + 1/sqrt(2)
# 式を表示
print("元の式:", expr)
print("変形後:", target_expr)
print("等価か?", simplify(expr - target_expr) == 0)
方法2:式を明示的に変形(手動で構成)
from sympy import sqrt
# 元の式
expr = (sqrt(2) + 2) / 2
# 手動で 1 + 1/sqrt(2) に変形
transformed = 1 + 1/sqrt(2)
print("元の式:", expr)
print("手動変形:", transformed)
✅ 関数例:rewrite_as_integer_plus_radical_fraction
from sympy import sqrt, Rational, simplify, nsimplify
def rewrite_as_integer_plus_radical_fraction(expr):
"""
指定された式を「整数 + √を含む分数」の形に変形する。
例: (sqrt(2) + 2)/2 → 1 + 1/sqrt(2)
"""
expr = simplify(expr)
# 数値評価
expr_val = expr.evalf()
# 近似的に 1 + x という形を探す
for i in range(-5, 6):
trial = expr_val - i
try:
# √a 近似とみなして nsimplify する
radical = nsimplify(trial, rational=False)
if simplify(i + radical - expr) == 0:
return i + radical
except Exception:
continue
return expr # うまく変形できなければ元のまま
🧪 使用例:
from sympy import sqrt
expr = (sqrt(2) + 2) / 2
transformed = rewrite_as_integer_plus_radical_fraction(expr)
print("元の式:", expr)
print("変形後 :", transformed)
🎯 目的(より厳密な変形)
✅ 関数:rewrite_as_integer_plus_inverse_radical
from sympy import simplify, nsimplify, sqrt, Rational
def rewrite_as_integer_plus_inverse_radical(expr, max_n=20):
"""
expr を「整数 + 係数 / sqrt(n)」の形に変形しようとする。
見つかればその形を返し、なければ元の式を返す。
"""
expr = simplify(expr)
val = expr.evalf()
# 試しに整数部 i を取り出して 係数部分を探索
for i in range(-5, 6):
remainder = val - i
# 係数 / sqrt(n) の形で表現できるかを探索
for n in range(1, max_n + 1):
rad = sqrt(n).evalf()
coeff = remainder * rad
coeff_rational = nsimplify(coeff, rational=True)
if simplify(i + coeff_rational / sqrt(n) - expr) == 0:
return i + coeff_rational / sqrt(n)
# 該当しなければ元の式
return expr
🧪 使用例
from sympy import sqrt
expr = (sqrt(2) + 2) / 2
transformed = rewrite_as_integer_plus_inverse_radical(expr)
print("元の式:", expr)
print("変形後 :", transformed)
🧾 出力例
元の式: sqrt(2)/2 + 1
変形後 : 1 + 1/sqrt(2)
✅ 応用可能例
from sympy import sqrt
expr1 = (sqrt(2) + 2) / 2 # → 1 + 1/√2
expr2 = (3 + sqrt(5)) / 2 # → 1 + 0.5/√5
expr3 = (2*sqrt(3) + 3)/3 # → 1 + 2/√3
for e in [expr1, expr2, expr3]:
print("変形:", rewrite_as_integer_plus_inverse_radical(e))
✅ 関数定義:rewrite_as_integer_plus_one_over_sqrt_n
from sympy import simplify, nsimplify, sqrt
def rewrite_as_integer_plus_one_over_sqrt_n(expr, max_n=100):
"""
expr を「整数 + 1/√n」の形に変形する。
n は 1 以上 max_n 以下の整数。
該当しない場合は元の式を返す。
"""
expr = simplify(expr)
val = expr.evalf()
for i in range(-10, 11): # 整数部分を試す
remainder = val - i
for n in range(1, max_n + 1): # √n を試す
rad = sqrt(n).evalf()
if abs(remainder - 1/rad) < 1e-10:
# 確認:式が元の式と等しいか
candidate = i + 1/sqrt(n)
if simplify(candidate - expr) == 0:
return candidate
return expr # 該当しない場合はそのまま
✅ 対応関数:rewrite_as_fraction_with_radical_denominator
from sympy import simplify, sqrt
def rewrite_as_fraction_with_radical_denominator(expr):
"""
expr を分母が √を含む整式の形(例: (a + b√c)/√d )に書き換える。
例: 1 + 1/√2 → (√2 + 1)/√2
"""
expr = simplify(expr)
# 展開:分母を共通にする形で整理する
if expr.is_Add:
terms = expr.as_ordered_terms()
common_denom = 1
for term in terms:
if term.is_Pow and term.exp == -1:
common_denom *= term.base
if common_denom != 1:
# 共通分母をかけて結合
numer = simplify(expr * common_denom)
return numer / common_denom
return expr # 変形できない場合はそのまま返す
🧪 使用例
from sympy import sqrt
expr = 1 + 1/sqrt(2)
result = rewrite_as_fraction_with_radical_denominator(expr)
print("元の式:", expr)
print("変形後 :", result)
✅ 目標関数:rewrite_as_integer_plus_one_over_radical_poly
from sympy import simplify, sqrt, nsimplify
def rewrite_as_integer_plus_one_over_radical_poly(expr, max_n=100):
"""
与えられた式を「整数 + 1/(a + b√n)」の形に変換する。
a, b, n は整数。最大 √n の候補を max_n まで試す。
"""
expr = simplify(expr)
val = expr.evalf()
for i in range(-10, 11): # 整数部分の候補
remainder = val - i
for n in range(1, max_n+1):
sqrt_n = sqrt(n).evalf()
for a in range(-5, 6):
for b in range(1, 6): # b≠0(分母に√nが含まれる)
denom_val = a + b * sqrt_n
if abs(1 / denom_val - remainder) < 1e-10:
# 式の確認
denom = a + b * sqrt(n)
candidate = i + 1 / denom
if simplify(candidate - expr) == 0:
return candidate
return expr # 該当しなければそのまま
from sympy import sqrt
expr = (sqrt(2) + 2) / 2
result = rewrite_as_integer_plus_one_over_radical_poly(expr)
print("元の式:", expr)
print("変形後 :", result)
元の式: sqrt(2)/2 + 1
変形後 : 1 + 1/(1 + sqrt(2))
🔬 確認してみましょう
from sympy import sqrt
from sympy import simplify
expr = (sqrt(2) + 2) / 2
# 関数(先ほどの再掲)
def rewrite_as_integer_plus_one_over_radical_poly(expr, max_n=100):
expr = simplify(expr)
val = expr.evalf()
for i in range(-10, 11): # 整数部分の候補
remainder = val - i
for n in range(1, max_n+1):
sqrt_n = sqrt(n).evalf()
for a in range(-5, 6):
for b in range(1, 6): # b≠0
denom_val = a + b * sqrt_n
if abs(1 / denom_val - remainder) < 1e-10:
denom = a + b * sqrt(n)
candidate = i + 1 / denom
if simplify(candidate - expr) == 0:
return candidate
return expr
# 実行
result = rewrite_as_integer_plus_one_over_radical_poly(expr)
print("元の式:", expr)
print("変形後 :", result)
Gemini先生へ
copilot先生へ
いつもの? sympyの実行環境と 参考のおすすめです。