SolveCubic 實作細節
本頁為 SolveCubic - 解三次方程式 的實作細節。
分析
解三次方程式是一個複雜的問題,雖然有公式解,但很醜。
而 必有一個實數根,如果用勘根找到這個實根,那就可以將 化簡為 。
只需要用 解,非常簡單。
尋找有理根
將
全部代進 ,若 表示找到有理根。
如果沒有任何有理數符合,那麼這個 不存在有理根。
尋找實數根
如果沒找到有理根,需要求得一個近似實根 ( float
)。
以下會使用二分搜尋來求近似的實根,時間複雜度為 。
Step 1:
如果 同乘 使 。
- 如果 ,代表某個根一定 。
- 如果 ,代表某個根一定 。
- 如果 ,代表某個根一定 。
Step 2:
- 如果 ,檢查 的值是否 ,如果沒有就繼續檢查 , 直到找到一個異號區間 ,對這個範圍的 用二分搜尋逼近 。
- 如果 ,檢查 的值是否 ,如果沒有就繼續檢查 , 直到找到一個異號區間 ,對這個範圍的 用二分搜尋逼近 。
簡化問題
現在成功的得到了 的一個實根 ,因此 必整除 :
令 ,因此
可知
用 SolveQuad 解 ,再將計算結果與 合併,即可得到 的三個根。
排序
SolveCubic
和 SolveQuad
會把輸出的 2/3 Frac
或 2/3 float
做升序排列。