2次方程式の新しい解法のおためし実装
2次方程式の新しい解法
↓ こんな記事を見かけた
天才数学者が二次方程式の簡単な解き方を考案!「推測も暗記も必要ない」 | ナゾロジー
計算だけで二次方程式が解けるそうな。
プログラムにしてみる
計算だけでできるならコンピュータ向き。 ためしにそのアルゴリズムを python で書いてみた。
niji.py
#!/usr/bin/python3 import os import sys import math # 二次方程式の計算 # @param a: x^2 の項の係数 # @param b: x の項の係数 # @param c: 定数項 # # @ref https://nazology.net/archives/49629 # https://arxiv.org/abs/1910.06709 # # @note 計算の概要 # x^2 - bx + c = 0 の二次方程式を (x-p)(x-q) の形にする。 # このとき p = b/2 + u, q = b/2 - u となる未知数 u を考える。 # すると # (x-(b/2+u))(x-(b/2-u)) = 0 # となる。このとき解は # x = b/2 + u, b/2 - u の2つ。 # これを ax^2 + bx + c = 0 で考えると解は # x = -b/2a + u, -b/2a - u ...(1) # である。 c は 2 つの解の積なので # c = (-b/2a + u)(-b/2a - u) # となり、これを計算すると未知数 u が得られる。 # c = (-b/2a)^2 - u^2 # u = sqrt((-b/2a)^2 - c) # あとは (1) 式に u を代入することで解を得る。 # x = -b/2a + sqrt((-b/2a)^2 - c), # -b/2a - sqrt((-b/2a)^2 - c) def quadratic_equation(a, b, c): center = (-1 * b) / (2 * a); gap = math.sqrt(center ** 2 - c) return center + gap, center - gap def print_qe(a, b, c): ans1, ans2 = quadratic_equation(a, b, c) print("ans1: ", ans1) print("ans2: ", ans2) def test(): print_qe(1, 2, 1) print_qe(1, -2, 1) print_qe(1, 4, 4) print_qe(1, -4, 4) print_qe(1, 6, 9) print_qe(1, -6, 9) print_qe(1, 10, 18) print("5+sqrt(7): ", 5+math.sqrt(7)) print("5-sqrt(7): ", 5-math.sqrt(7)) if __name__ == "__main__": test()
ふむふむ。 とりあえず動いてそう。
解の公式との違い
式を変形すると二次方程式の解の公式と同じになるらしい。
解の公式をプログラム化してみると・・・
# 解の公式 # x = (-b + sqrt(b^2 - 4ac)) / 2a, # (-b - sqrt(b^2 - 4ac)) / 2a def quadratic_equation_official(a, b, c): center = -1 * b gap = math.sqrt(b**2 - 4 * a * c) divider = 2 * a return (center + gap) / divider, (center - gap) / divider
プログラム化するときは割り算が一回で済む分、解の公式をそのままプログラム化するより、新しい方式のほうが有利かな。新しい方式のほうがかけ算の回数も少ないかな。