File size: 3,700 Bytes
9b3b8c8
 
 
 
 
fe0557b
 
9b3b8c8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fe0557b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
"""
Performs addition, subtraction, or multiplication of two polynomials.
Polynomials are represented by lists of coefficients in descending order of power.
Example: [1, -2, 3] represents x^2 - 2x + 3.
"""
import gradio as gr

def polynomial_operations(poly1_coeffs: list[float], poly2_coeffs: list[float], operation: str) -> str:
    if not all(isinstance(c, (int, float)) for c in poly1_coeffs) or \
       not all(isinstance(c, (int, float)) for c in poly2_coeffs):
        return "Error: All coefficients must be numbers."
    if not poly1_coeffs:
        poly1_coeffs = [0]
    if not poly2_coeffs:
        poly2_coeffs = [0]
    op = operation.lower()
    if op == "add":
        len1, len2 = len(poly1_coeffs), len(poly2_coeffs)
        max_len = max(len1, len2)
        p1 = [0]*(max_len - len1) + poly1_coeffs
        p2 = [0]*(max_len - len2) + poly2_coeffs
        result_coeffs = [p1[i] + p2[i] for i in range(max_len)]
    elif op == "subtract":
        len1, len2 = len(poly1_coeffs), len(poly2_coeffs)
        max_len = max(len1, len2)
        p1 = [0]*(max_len - len1) + poly1_coeffs
        p2 = [0]*(max_len - len2) + poly2_coeffs
        result_coeffs = [p1[i] - p2[i] for i in range(max_len)]
    elif op == "multiply":
        len1, len2 = len(poly1_coeffs), len(poly2_coeffs)
        result_coeffs = [0] * (len1 + len2 - 1)
        for i in range(len1):
            for j in range(len2):
                result_coeffs[i+j] += poly1_coeffs[i] * poly2_coeffs[j]
    else:
        return "Error: Invalid operation. Choose 'add', 'subtract', or 'multiply'."
    if not result_coeffs or all(c == 0 for c in result_coeffs):
        return "0"
    terms = []
    degree = len(result_coeffs) - 1
    for i, coeff in enumerate(result_coeffs):
        power = degree - i
        if coeff == 0:
            continue
        term_coeff = ""
        if coeff == 1 and power != 0:
            term_coeff = ""
        elif coeff == -1 and power != 0:
            term_coeff = "-"
        else:
            term_coeff = str(coeff)
            if isinstance(coeff, float) and coeff.is_integer():
                term_coeff = str(int(coeff))
        if power == 0:
            terms.append(term_coeff)
        elif power == 1:
            terms.append(f"{term_coeff}x")
        else:
            terms.append(f"{term_coeff}x^{power}")
    result_str = terms[0]
    for term in terms[1:]:
        if term.startswith("-"):
            result_str += f" - {term[1:]}"
        else:
            result_str += f" + {term}"
    return result_str

def parse_coeffs(coeff_str: str) -> list[float]:
    """Helper to parse comma-separated coefficients from string input."""
    if not coeff_str.strip():
        return [0.0]
    try:
        return [float(x.strip()) for x in coeff_str.split(',') if x.strip() != '']
    except ValueError:
        # Return a value that indicates error, Gradio will show the function's error message
        raise gr.Error("Invalid coefficient input. Ensure all coefficients are numbers.")

polynomial_interface = gr.Interface(
    fn=lambda p1_str, p2_str, op: polynomial_operations(parse_coeffs(p1_str), parse_coeffs(p2_str), op),
    inputs=[
        gr.Textbox(label="Polynomial 1 Coefficients (comma-separated, highest power first, e.g., 1,-2,3 for x²-2x+3)"),
        gr.Textbox(label="Polynomial 2 Coefficients (comma-separated, e.g., 2,5 for 2x+5)"),
        gr.Radio(choices=["add", "subtract", "multiply"], label="Operation")
    ],
    outputs="text",
    title="Polynomial Operations",
    description="Add, subtract, or multiply two polynomials. Enter coefficients in descending order of power."
)

if __name__ == "__main__":
    polynomial_interface.launch()