Skip to content

Commit 126f277

Browse files
author
deepshekhardas
committed
fix: pivot on zero diagonal in points_to_polynomial
Gaussian elimination without pivoting divided by zero when any point had x = 0. Swap in a non-zero pivot row only when the diagonal is zero. Fixes #14817
1 parent f5988cc commit 126f277

1 file changed

Lines changed: 13 additions & 0 deletions

File tree

linear_algebra/src/polynom_for_points.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ def points_to_polynomial(coordinates: list[list[int]]) -> str:
3333
Traceback (most recent call last):
3434
...
3535
ValueError: The program cannot work out a fitting polynomial.
36+
>>> points_to_polynomial([[0, 1], [1, 2], [2, 5]])
37+
'f(x)=x^2*1.0+x^1*0.0+x^0*1.0'
3638
"""
3739
if len(coordinates) == 0 or not all(len(pair) == 2 for pair in coordinates):
3840
raise ValueError("The program cannot work out a fitting polynomial.")
@@ -62,6 +64,17 @@ def points_to_polynomial(coordinates: list[list[int]]) -> str:
6264
vector: list[float] = [coordinates[count_of_line][1] for count_of_line in range(x)]
6365

6466
for count in range(x):
67+
# Only swap when the current pivot is zero (e.g. a point with x = 0),
68+
# so existing exact arithmetic is preserved for well-behaved inputs.
69+
if matrix[count][count] == 0:
70+
pivot_row = max(
71+
range(count + 1, x), key=lambda row: abs(matrix[row][count])
72+
)
73+
if pivot_row == count or matrix[pivot_row][count] == 0:
74+
raise ValueError("The program cannot work out a fitting polynomial.")
75+
matrix[count], matrix[pivot_row] = matrix[pivot_row], matrix[count]
76+
vector[count], vector[pivot_row] = vector[pivot_row], vector[count]
77+
6578
for number in range(x):
6679
if count == number:
6780
continue

0 commit comments

Comments
 (0)