Potrzebuję napisać algorytm który będzie zamieniać mi wielomian na listę. Np.
w(x) = x^2+5x+17 na T(w)=[17,5,1] oraz odwrotnie na W([17,5,1])=x^2+5x+17, oczywiście wielomian może być dowolnej długości. Czy ktoś jest w stanie pomóc? Kod może dokładniej być napisany w SageMath.
Ale to prośba o pomoc, czy zlecenie? :)
Z listy na napis to banalne, a w drugą stronę:
- szukasz napisu 'x' (w pętli);
- to co jest po lewej każdego iksa (licząc do najbliższego +, - lub do końca) jest współczynnikiem, a to co po prawej (także do +, - lub do końca) jest potęgą (poprzedzoną znakiem ^); zamieniasz te podnapisy na liczby i wstawiasz do listy (potęga jest indeksem, a współczynnik wartością);
- pierwszy przypadek specjalny -- jest x, nie ma potęgi -- wtedy potęga równa się 1;
- drugi przypadek specjalny -- nie ma x -- więc jest to wyraz wolny, czyli potęga równa 0.
koszalek-opalek napisał(a):
Z listy na napis to banalne, a w drugą stronę:
- szukasz napisu 'x' (w pętli);
- to co jest po lewej każdego iksa (licząc do najbliższego +, - lub do końca) jest współczynnikiem, a to co po prawej (także do +, - lub do końca) jest potęgą (poprzedzoną znakiem ^); zamieniasz te podnapisy na liczby i wstawiasz do listy (potęga jest indeksem, a współczynnik wartością);
- pierwszy przypadek specjalny -- jest x, nie ma potęgi -- wtedy potęga równa się 1;
- drugi przypadek specjalny -- nie ma x -- więc jest to wyraz wolny, czyli potęga równa 0.
z listy na napis udało mi się stworzyć takie coś:
def W(n):
for i in range(len(n)-1,-1,-1):
if(i!=0):
print str(n[i])+"x^"+str(i)+" + ",
if(i==0):
print(n[0])
ale nie bardzo rozumiem w drugą stronę :)
Poza formatowaniem kodu, już merytorycznie -- to co robisz, to nie jest przetworzenie na napis, tylko wyświetlenie. Trzeba by to zrobić raczej jakoś tak:
def W(n):
wynik = ''
for i in range(len(n)-1,-1,-1):
if(i!=0):
wynik += str(n[i])+"x^"+str(i)+" + ",
if(i==0):
wynik += str(n[0])
return wynik
(można to jeszcze ulepszyć, ale bazowałem na Twoim kodzie).
A w drugą stronę? Jak będziesz szukać napisu 'x' w napisie? napis.find(...)
. Jak wycinać podnapis? napis[...:...]
. Jak przerabiać to na liczbę? float(...)
. Jak wstawić do listy? insert
, append
lub lista[...] = ...
(zależnie od sytuacji).
koszalek-opalek napisał(a):
Poza formatowaniem kodu, już merytorycznie -- to co robisz, to nie jest przetworzenie na napis, tylko wyświetlenie. Trzeba by to zrobić raczej jakoś tak:
def W(n): wynik = '' for i in range(len(n)-1,-1,-1): if(i!=0): wynik += str(n[i])+"x^"+str(i)+" + ", if(i==0): wynik += str(n[0]) return wynik
(można to jeszcze ulepszyć, ale bazowałem na Twoim kodzie).
A w drugą stronę? Jak będziesz szukać napisu 'x' w napisie?
napis.find(...)
. Jak wycinać podnapis?napis[...:...]
. Jak przerabiać to na liczbę?float(...)
. Jak wstawić do listy?insert
,append
lublista[...] = ...
(zależnie od sytuacji).
wywala mi taki błąd przy twoim kodzie :
TypeError Traceback (most recent call last)
<ipython-input-4-f916e4330ef2> in <module>()
7 wynik += str(n[Integer(0)])
8 return wynik
----> 9 W([Integer(7),Integer(9),Integer(1)])
<ipython-input-4-f916e4330ef2> in W(n)
3 for i in range(len(n)-Integer(1),-Integer(1),-Integer(1)):
4 if(i!=Integer(0)):
----> 5 wynik += str([i])+"x^"+str(i)+" + ",
6 if(i==Integer(0)):
7 wynik += str(n[Integer(0)])
TypeError: cannot concatenate 'str' and 'tuple' objects
TypeError Traceback (most recent call last)
<ipython-input-4-f916e4330ef2> in <module>()
7 wynik += str(n[Integer(0)])
8 return wynik
----> 9 W([Integer(7),Integer(9),Integer(1)])
<ipython-input-4-f916e4330ef2> in W(n)
3 for i in range(len(n)-Integer(1),-Integer(1),-Integer(1)):
4 if(i!=Integer(0)):
----> 5 wynik += str([i])+"x^"+str(i)+" + ",
6 if(i==Integer(0)):
7 wynik += str(n[Integer(0)])
TypeError: cannot concatenate 'str' and 'tuple' objects
def W(n):
wynik = ''
for i in range(len(n)-1,-1,-1):
if(i!=0):
wynik += str([i])+"x^"+str(i)+" + "
if(i==0):
wynik += str(n[0])
return wynik
W([7,9,1])
zwróciło takie coś:
'[2]x^2 + [1]x^1 + 7'
A, bo to w Sage'u... To jeszcze trzeba zamieniać te liczby Sage'owe na zwykłe i z powrotem -- chyba, nie znam Sage'a...