This repository has been archived by the owner on Sep 28, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 5
/
polynome.py
176 lines (141 loc) · 5.69 KB
/
polynome.py
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
from rational import Rational
class Polynome:
def __init__(self, polynome="0"):
"""Принимает строку с записью многочлена от переменной x
в каноническом виде, возвращает экземпляр класса. Малых Андрей"""
# Разбиение многочлена на список отдельных членов
polynome = polynome.replace('-', '+-').split('+')
polynome = [i.replace(' ', '') for i in polynome if i]
koeffs = [] # Список коэффициентов, записанных в строке polynome
degs = [] # Список степеней x, записанных в строке polynome
for i in polynome:
f = i.split('x')
if len(f) != 2:
f.append(int('0'))
elif not f[1]:
f[1] = int('1')
else:
f[1] = int(f[1][1:].strip())
if not f[0]:
f[0] = '1'
elif f[0] == '-':
f[0] = '-1'
koeffs.append(f[0])
degs.append(f[1])
self.m = max(degs) # Степень многочлена
self.C = [Rational('0')] * (self.m + 1) # Список коэффициентов
j = 0
for i in range(self.m + 1, -1, -1):
if i in degs:
self.C[self.m - i] = Rational(koeffs[j])
j += 1
def frontZerosDel(self):
"""Удаление нулевых коэффициентов перед старшим членом. Малых Андрей"""
while self.C[0].numer.A == [0] and len(self.C) > 1:
self.C.pop(0)
self.m = len(self.C) - 1
def __str__(self):
"""Возвращает строковое представление многочлена. Малых Андрей."""
def sign(num):
"""Определяет, какой знак выводить перед членом. Малых Андрей"""
if num:
if num == '-':
return ''
else:
return '' if num.numer.b else '+'
return '+'
def deg(i):
"""Принимает степень икса, возвращает строковое представление x^i. Малых Андрей"""
if i > 1:
return f'x^{i}'
elif i == 1:
return 'x'
return ''
res = ''
for i in range(self.m, -1, -1):
j = self.m - i # Номер коэффициента
koeff = self.C[j] # Вид коэффициента при выводе
if koeff.numer.A == [1] and koeff.denom.A == [1] and i != 0:
koeff = '-' if koeff.numer.b else ''
if self.C[j].numer.A != [0]:
res += sign(koeff) + f'{koeff}{deg(i)}'
if not res:
return '0'
elif res[0] == '+':
res = res[1:]
return res
def LED_P_Q(polynome):
"""Старший коэффициент многочлена. Таланков Влад."""
return polynome.C[0]
def DEG_P_N(polynome):
"""Степень многочлена. Таланков Влад."""
return polynome.m
def MUL_Pxk_P(a, k):
"""Умножение полинома на x^k. Угрюмов Михаил."""
a.m = a.m + k
for i in range(k):
a.C.append(Rational("0/1"))
return a
def DER_P_P(a):
"""Производная многочлена. Николаев Клим."""
if a.m == 0:
a.C[0] = 0
else:
a.m = a.m - 1
a.C.pop(len(a.C) - 1)
t = a.m
for i in range(len(a.C)):
a.C[i] = a.C[i] * Rational(str(t))
t -= 1
return a
def ADD_PP_P(poly1, poly2):
"""Сложение многочленов. Малых Андрей"""
if DEG_P_N(poly1) < DEG_P_N(poly2):
poly1, poly2 = poly2, poly1
for i in range(DEG_P_N(poly2) + 1):
poly1.C[i] = ADD_QQ_Q(poly1.C[i], poly2.C[i])
poly1.frontZerosDel()
return poly1
def SUB_PP_P(poly1, poly2):
"""Вычитание многочленов. Малых Андрей"""
if DEG_P_N(poly1) < DEG_P_N(poly2):
poly1, poly2 = poly2, poly1
for i in range(DEG_P_N(poly2) + 1):
poly1.C[i] = SUB_QQ_Q(poly1.C[i], poly2.C[i])
poly1.frontZerosDel()
return poly1
def MUL_PQ_P(polynome, num):
"""Умножение многочлена на число. Малых Андрей"""
for i in range(DEG_P_N(polynome) + 1):
polynome.C[i] = MUL_QQ_Q(polynome.C[i], num)
polynome.frontZerosDel()
return polynome
def FAC_P_Q(a):
"""Вынесение из многочлена НОК знаменателей коэффициентов и НОД числителей.Максимов Матвей"""
a = [ABS_Z_N(i.numer) for i in a.C if str(i.numer) != '0']
if len(a)<2:
return a[0]
elif len(a)==2:
return (GCF_NN_N(a[0],a[1]))
nod = GCF_NN_N(a[0], a[1])
for i in range(3,len(a)):
nod= GCF_NN_N(nod,a[i])
b = [ABS_Z_N(j.denom) for j in b.C if str(j.denom) != '0']
if len(b)<2:
return b[0]
elif len(b)==2:
return (LCM_NN_N(b[0],b[1]))
nok=LCM_NN_N(b[0],b[1])
for j in range(3,len(a)):
nok=LCM_NN_N(nok,b[i])
q = Rational(str(Rational(str(nod)))+'/'+str(Natural(str(nok))))
return q
if __name__ == '__main__':
a = Polynome("-4/3x^4 + 7/5x^3-13/2x-5/4")
b = Polynome("3/2 -13/7 -5/2")
k = int(input())
print(a)
print(LED_P_Q(a))
print(DEG_P_N(a))
print(MUL_Pxk_P(a, k))
print(DER_P_P(a))