0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonのユーザー定義関数「sympy で (sqrt(2)+2)/2 を 1+1/sqrt(2) と表示する方法を教えて下さい。」をAI先生ヘ。

Posted at

・確認してみましょう だけでよかった。

(本日の)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の実行環境と 参考のおすすめです。

(テンプレート)

いつもと違うおすすめです。

Qiita内

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?