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

プログラム化するときは割り算が一回で済む分、解の公式をそのままプログラム化するより、新しい方式のほうが有利かな。新しい方式のほうがかけ算の回数も少ないかな。