12 from __future__
import division
13 from __future__
import print_function
16 VERSION =
'polynomial --- 2010 March 16'
18 import numbers, string
29 ALPHA = string.ascii_uppercase + string.ascii_lowercase
32 ALPHA_DOWN = string.ascii_lowercase + string.ascii_uppercase
41 """Terme(tuple de Number ou de None
42 représentant les exposants pour chaque variable)"""
46 """Renvoie le terme sous forme de string "'Term(tuple des exposants)'"
51 return "'Term({0})'".format(tuple.__repr__(self))
55 def __str__(self, varsstr=ALPHA, nonestr='?',
56 mulstr=
'*', expstr=
'^', exprstr=
'', simplify=
True):
57 """Renvoie le terme sous forme de string.
58 varsstr spécifie le caractère des variables utilisées
59 nonestr spécifie la chaîne de caractères
60 représentant les valeurs indéterminées None
61 Les facteurs sont séparés par multstr.
62 expstr est placé à gauche de chaque exposant et exprstr à droite.
63 Si simplify alors chaque élément sera présent dans le résultat,
64 sinon passe les variables d'exposant 0
65 et passe les exposants 1.
66 Si le résultat ne contient aucun élément
67 alors finalement renvoie '1'.
69 Pre: varsstr: string assez grand
70 pour que chaque variable ait un caractère
80 assert isinstance(varsstr, str), type(varsstr)
81 assert len(varsstr) >= len(self), (len(varsstr), len(self))
82 assert isinstance(nonestr, str), type(nonestr)
83 assert isinstance(mulstr, str), type(mulstr)
84 assert isinstance(expstr, str), type(expstr)
85 assert isinstance(exprstr, str), type(exprstr)
88 for i
in range(len(self)):
91 assert isinstance(e, numbers.Number)
or (e ==
None), (i, e)
93 if simplify
and (e == 1):
95 elif (
not simplify)
or (e != 0):
96 l.append(
'{0}{1}{2}{3}'.format(varsstr[i], expstr, (e
if e !=
None
97 else nonestr), exprstr))
98 return (mulstr.join(l)
if l != []
104 """Compare les exposants (d'après l'ordre déterminé par order)
105 des 2 Term et renvoie -1 si self < other
108 Si order == None alors utilise l'ordre normal
112 ou tuple de naturels assez grand
113 pour que chaque variable ait un indice
118 assert isinstance(other, Term), type(other)
119 assert len(self) == len(other), (len(self), len(other))
120 assert order ==
None or isinstance(order, tuple), type(order)
121 assert order ==
None or len(order) >= len(self), (len(order), len(self))
124 for i
in range(len(self)):
125 c = cmp(self[i], other[i])
131 for i
in range(len(self)):
133 c = cmp(self[c], other[c])
142 """Renvoie la kème dérivée partielle pour la variable d'indice i
143 Si k > 0 alors pour le terme (..., n, ...)
144 renvoie (n(n - 1)...(n - k + 1), Term((..., n - k, ...)))
145 En particulier si k == 1
146 alors renvoie (n, Term((..., n - 1, ...)))
147 Si k == 0 alors renvoie (1, Term(self))
148 Si k < 0 alors pour le terme (..., n, ...)
149 renvoie (1/((n + 1)...(n - k)), Term((..., n - k, ...)))
150 (Si k <= n < 0 alors renvoie (None, Term((..., n - k, ...))))
151 Si n == None alors renvoie (None, Term((..., n, ...)))
152 Donc pour (..., n, ...) renvoie toujours
153 (numbernone.falling_factorial_pow(n, k), Term((..., n - k, ...)))
155 Pre: i: natural < len(self)
158 Result: (Number ou None, Term)
162 assert i < len(self), (i, len(self))
163 assert isinstance(k, numbers.Integral), k
165 return ((numbernone.falling_factorial_pow(self[i], k),
166 Term(self[:i] + (self[i] - k, ) + self[i + 1:]))
if self[i] !=
None
167 else (
None,
Term(self)))
172 """Renvoie le terme évalué en fonction des valeurs de values
173 Pour le terme (a, b, c, ...)
174 si values est un Number
175 alors renvoie values^a * values^b * values^c * ...
176 si values est une séquence
177 alors renvoie values[0]^a * values[1]^b * values[2]^c * ...
178 Si un des ces Number est None alors renvoie None
180 Pre: value: Number ou None
181 ou tuple (de Number ou de None) assez grand
182 pour que chaque variable ait une valeur
183 ou list (de Number ou de None) assez grand
184 pour que chaque variable ait une valeur
186 Result: Number ou None
189 assert isinstance(values, numbers.Number)
or (values ==
None) \
190 or isinstance(values, tuple)
or isinstance(values, list), type(values)
191 assert isinstance(values, numbers.Number)
or (values ==
None) \
192 or (len(values) >= len(self)), (len(values), len(self))
194 if isinstance(values, numbers.Number):
206 assert len(values) >= len(self), (len(values), len(self))
209 for i
in range(len(self)):
211 if (e ==
None)
or (values[i] ==
None):
213 if (e != 0)
and (values[i] != 1):
223 """Renvoie une "évaluation partielle" du terme
224 sous forme de (coef, Term) en fonction des valeurs de values.
225 Pour chaque Number de values,
226 la variable correspondante est évaluée,
227 le résultat multiplie coef et l'exposant est réinitialisé à 0,
228 alors que pour chaque None de values,
229 la variable correspondante est ignorée
230 et son exposant conservé.
231 Si le terme est vide alors renvoie (1, Term())
232 Si le terme contient un exposant None qui doit être évalué
233 alors renvoie (None, Term) où les exposants None sont conservés
235 Pre: value: tuple de Number ou de None assez grand
236 pour que chaque variable ait une valeur
237 ou list de Number ou de None assez grand
238 pour que chaque variable ait une valeur
240 Result: (Number ou None, Term)
243 assert isinstance(values, tuple)
or isinstance(values, list), type(values)
244 assert len(values) >= len(self), (len(values), len(self))
249 for i
in range(len(self)):
258 return (coef
if notnone
265 """Polynôme (dictionnaire[Term] = coefficient,
266 avec varsstr, une chaîne de caractères pour les variables)"""
269 def __init__(self, value=(), coef=1, varsstr=ALPHA):
270 """Initialise le polynôme à value * coef et
271 et spécifie le caractère des variables par varsstr.
272 Si value est un Polynomial
273 alors varsstr est ignoré et value.varsstr est utilisé
275 Pre: value: Polynomial
276 ou dict de Term de même taille pour les clés
277 et de Number pour les valeurs
279 ou tuple de Term de même taille
280 ou liste de Term de même taille
282 varsstr: string assez grand
283 pour que chaque variable ait un caractère
288 assert isinstance(value, Polynomial)
or isinstance(value, Term)
or isinstance(value, dict) \
289 or isinstance(value, tuple)
or isinstance(value, list), type(value)
290 assert isinstance(coef, numbers.Number), coef
291 assert isinstance(varsstr, str), type(varsstr)
294 self.
varsstr = (value.varsstr
if isinstance(value, Polynomial)
297 if isinstance(value, Polynomial)
or isinstance(value, dict):
298 if (coef == 1)
and isinstance(value, Polynomial):
299 dict.__init__(self, value)
303 assert isinstance(t, Term), t
304 assert len(t) == len(list(value.keys())[0]), (len(t), len(value.keys()[0]))
306 if value[t]*coef != 0:
307 self[t] = value[t] * coef
308 elif isinstance(value, Term):
309 assert len(varsstr) >= len(value), (len(varsstr), len(value))
311 dict.__init__(self, {value: coef})
315 assert isinstance(t, Term), type(t)
316 assert len(t) == len(value[0]), (len(t), len(value[0]))
330 """Renvoie le polynôme auquel est ajouté value * coef
332 Pre: value: Polynomial de même taille des termes
333 ou Term (de taille quelconque si le polynôme est vide,
334 de taille lenterms() sinon)
335 ou Number (si le polynôme n'est pas vide)
342 if isinstance(value, Term):
343 if (
not self)
or (self.
lenterms() == len(value)):
344 if value
not in self:
351 elif isinstance(value, numbers.Number):
363 elif isinstance(value, Polynomial)
and (value.lenterms() == self.
lenterms()):
366 self[t] = value[t] * coef
368 self[t] += value[t] * coef
372 raise NotImplementedError
379 """Renvoie le polynôme sous forme
380 de string "'Polynomial(tuple des exposants, varsstr="...")'"
385 return "'Polynomial({0}, varsstr=\"{1}\")'".format(dict.__repr__(self), self.
varsstr)
389 def __str__(self, varsstr=None, nonestr='?', addstr=' + ', substr=' - ', mulstr='*',
390 expstr=
'^', exprstr=
'', simplify=
True, order=
None):
391 """Renvoie le polynôme sous forme de string.
392 varsstr spécifie le caractère des variables utilisées
393 (si varsstr == None alors utilise self.varsstr).
394 nonestr spécifie la chaîne de caractères
395 représentant les valeurs indéterminées None
396 Les termes de coefficients >= 0 sont séparés par addstr,
398 Les facteurs sont séparés par mulstr.
399 expstr est placé à gauche de chaque exposant et exprstr à droite.
400 Si simplify alors chaque élément sera présent dans le résultat,
401 sinon passe le coefficient si == 1,
402 passe les variables d'exposant 0
403 et passe les exposants 1.
405 Si le résultat ne contient aucun élément alors renvoie ''.
408 ou string assez grand
409 pour que chaque variable ait un caractère
418 ou tuple de naturels ou liste de tuple de naturels
419 assez grand pour que chaque variable ait un indice
427 assert isinstance(varsstr, str), type(varsstr)
430 assert isinstance(nonestr, str), type(nonestr)
431 assert isinstance(addstr, str), type(addstr)
432 assert isinstance(substr, str), type(substr)
433 assert isinstance(mulstr, str), type(mulstr)
434 assert isinstance(expstr, str), type(expstr)
435 assert isinstance(exprstr, str), type(exprstr)
436 assert order ==
None or isinstance(order, tuple)
or isinstance(order, list), type(order)
437 assert order ==
None or len(order) >= len(self), (len(order), len(self))
440 raise NotImplementedError
446 assert isinstance(t, Term), type(t)
451 l.append(str(self[t]))
452 t_str = t.__str__(varsstr=varsstr, nonestr=nonestr,
453 mulstr=mulstr, expstr=expstr, exprstr=exprstr)
454 if (self[t] != 1)
and (t_str !=
'1'):
456 if (t_str !=
'1')
or (self[t] == 1):
463 l.append(str(-self[t]))
464 t_str = t.__str__(varsstr=varsstr, nonestr=nonestr,
465 mulstr=mulstr, expstr=expstr, exprstr=exprstr)
466 if (self[t] != -1)
and (t_str !=
'1'):
468 if (t_str !=
'1')
or (self[t] == -1):
472 assert isinstance(t, Term), type(t)
476 l.append(str(self[t]))
477 t_str = t.__str__(varsstr=varsstr, nonestr=nonestr,
478 mulstr=mulstr, expstr=expstr, exprstr=exprstr, simplify=
False)
483 l.append(str(-self[t]))
484 t_str = t.__str__(varsstr=varsstr, nonestr=nonestr,
485 mulstr=mulstr, expstr=expstr, exprstr=exprstr, simplify=
False)
488 return ''.join(l[1:])
493 """Renvoie la kème dérivée partielle pour la variable d'indice i
494 (c.-à-d. la somme des dérivées de ses termes)
496 Pre: i: natural < self.lenterms()
499 Result: (Number ou None, Term)
504 assert isinstance(k, numbers.Integral), k
508 (c, dt) = t.deriv(i=i, k=k)
509 d[dt] = (self[t] * c
if c !=
None
516 """Renvoie le polynôme évalué en fonction des valeurs de values
519 ou tuple de Number assez grand
520 pour que chaque variable ait une valeur
521 ou list de Number assez grand
522 pour que chaque variable ait une valeur
524 Result: Number ou None ???
527 assert isinstance(values, numbers.Number)
or isinstance(values, tuple) \
528 or isinstance(values, list), type(values)
529 assert isinstance(values, numbers.Number)
or (len(values) >= self.
lenterms()), \
530 (len(values), self.lenlenterms())
534 p = t.eval(values) * self[t]
542 """Renvoie la taille des termes ou None si le polynôme est vide
547 return (len(list(self.keys())[0])
if len(self) > 0
553 """Renvoie une "évaluation partielle" du polynôme
554 en fonction des valeurs de values.
555 Pour chaque Number de values,
556 la variable correspondante est évaluée,
557 le résultat multiplie le coefficient du terme
558 et l'exposant est réinitialisé à 0,
559 alors que pour chaque None de values,
560 la variable correspondante est ignorée et son exposant conservé.
561 Si le polynôme est vide alors renvoie Polynomial()
563 Pre: value: tuple de Number ou de None assez grand
564 pour que chaque variable ait une valeur
565 ou list de Number ou de None assez grand
566 pour que chaque variable ait une valeur
571 assert isinstance(values, tuple)
or isinstance(values, list), type(values)
577 (c, new_t) = t.partialeval(values)
593 if __name__ ==
'__main__':
600 debug.test_begin(VERSION, __debug__)
602 print(
"ALPHA == '{0}'".format(ALPHA)); sys.stdout.flush()
603 print(
"ALPHA_DOWN == '{0}'".format(ALPHA_DOWN)); sys.stdout.flush()
608 print(
'Term()...', end=
''); sys.stdout.flush()
611 assert Term((1, 2)) == (1, 2),
Term((1, 2))
612 assert Term([1, 2]) == (1, 2),
Term([1, 2])
613 assert Term((1,
None, 2)) == (1,
None, 2),
Term((1,
None, 2))
614 assert Term((3, -5, 7)) == (3, -5, 7),
Term((3, -5, 7))
615 assert Term((3, 5.0, decimal.Decimal(
'7'))) == (3, 5.0, decimal.Decimal(
'7')), \
616 Term((3, 5.0, decimal.Decimal(
'7')))
618 assert isinstance(
Term((3, 5, 7)), Term),
Term((3, 5, 7))
619 assert isinstance(
Term((3, 5, 7)), tuple),
Term((3, 5, 7))
620 assert not isinstance(
Term((3, 5, 7)), list),
Term((3, 5, 7))
621 print(
'ok'); sys.stdout.flush()
624 print(
'Term.__repr__()...', end=
''); sys.stdout.flush()
625 assert repr(
Term()) ==
"'Term(())'", repr(
Term())
626 assert repr(
Term((0, 0))) ==
"'Term((0, 0))'", repr(
Term((0, 0)))
627 assert repr(
Term((1, 2))) ==
"'Term((1, 2))'", repr(
Term((1, 2)))
628 assert repr(
Term([1, 2])) ==
"'Term((1, 2))'", repr(
Term([1, 2]))
629 assert repr(
Term((1,
None, 2))) ==
"'Term((1, None, 2))'", repr(
Term((1,
None, 2)))
630 assert repr(
Term((3, -5, 7))) ==
"'Term((3, -5, 7))'", repr(
Term((3, -5, 7)))
631 assert repr(
Term((3, 5.0, decimal.Decimal(
'7')))) ==
"'Term((3, 5.0, Decimal('7')))'",\
632 repr(
Term((3, 5.0, decimal.Decimal(
'7'))))
633 assert repr(
Term((3, 1, 7))) ==
"'Term((3, 1, 7))'", repr(
Term((3, 1, 7)))
634 assert repr(
Term((3, 0, 7))) ==
"'Term((3, 0, 7))'", repr(
Term((3, 0, 7)))
635 print(
'ok'); sys.stdout.flush()
638 print(
'Term.__str__()...', end=
''); sys.stdout.flush()
639 assert str(
Term()) ==
'1', str(
Term())
640 assert str(
Term((0, 0))) ==
'1', str(
Term((0, 0)))
641 assert str(
Term((1, 2))) ==
'A*B^2', str(
Term((1, 2)))
642 assert str(
Term([1, 2])) ==
'A*B^2', str(
Term([1, 2]))
643 assert str(
Term((3, -5, 7))) ==
'A^3*B^-5*C^7', str(
Term((3, -5, 7)))
644 assert str(
Term((3, 5.0, decimal.Decimal(
'7')))) ==
'A^3*B^5.0*C^7', \
645 str(
Term((3, 5.0, decimal.Decimal(
'7'))))
646 assert str(
Term((3, 1, 7))) ==
'A^3*B*C^7', str(
Term((3, 1, 7)))
647 assert str(
Term((3, 0, 7))) ==
'A^3*C^7', str(
Term((3, 0, 7)))
648 assert str(
Term((1,
None, 0, 2))) ==
'A*B^?*D^2', str(
Term((1,
None, 0, 2)))
649 t =
Term((3, 0, 7,
None, 1))
650 assert str(t) ==
'A^3*C^7*D^?*E', str(t)
651 assert Term.__str__(t, mulstr=
'') ==
'A^3C^7D^?E', (t, Term.__str__(t, mulstr=
''))
652 assert Term.__str__(t, mulstr=
' . ') ==
'A^3 . C^7 . D^? . E', \
653 (t, Term.__str__(t, mulstr=
' . '))
654 assert Term.__str__(t, simplify=
True) ==
'A^3*C^7*D^?*E', \
655 (t, Term.__str__(t, simplify=
True))
656 assert Term.__str__(t, simplify=
False) ==
'A^3*B^0*C^7*D^?*E^1', \
657 (t, Term.__str__(t, simplify=
False))
658 assert Term.__str__(t, varsstr=
'tuXYZ') ==
't^3*X^7*Y^?*Z', \
659 (t, Term.__str__(t, varsstr=
'tuXY'))
660 assert Term.__str__(t, varsstr=
'tuXYZ', nonestr=
'None') ==
't^3*X^7*Y^None*Z', \
661 (t, Term.__str__(t, varsstr=
'tuXY', nonestr=
'None'))
662 assert Term.__str__(t, varsstr=
'tuXYZ', mulstr=
' . ', simplify=
False) \
663 ==
't^3 . u^0 . X^7 . Y^? . Z^1', \
664 (t, Term.__str__(t, varsstr=
'tuXYZ', mulstr=
' . ', simplify=
False))
665 assert Term.__str__(t, varsstr=
'tuXYZ', expstr=
'^(', exprstr=
')') ==
't^(3)*X^(7)*Y^(?)*Z',\
666 (t, Term.__str__(t, varsstr=
'tuXYZ', expstr=
'^(', exprstr=
')'))
667 print(
'ok'); sys.stdout.flush()
670 print(
'Term.cmp_order()...', end=
''); sys.stdout.flush()
672 print(
'ok'); sys.stdout.flush()
675 print(
'Term.deriv()...', end=
''); sys.stdout.flush()
676 for n
in range(-100, 100):
677 assert Term.deriv(
Term((n, ))) == (n,
Term((n - 1, ))), (n, Term.deriv(
Term((n, ))))
678 assert Term.deriv(
Term((n, 33))) == (n,
Term((n - 1, 33))), \
679 (n, Term.deriv(
Term((n, 33))))
680 assert Term.deriv(
Term((0, 1, 2, n, 4, 5)), i=3) == (n,
Term((0, 1, 2, n - 1, 4, 5))), \
681 (n, Term.deriv(
Term((0, 1, 2, n, 4, 5)), i=3))
682 assert Term.deriv(
Term((n, 33)), k=0) == (1,
Term((n, 33))), \
683 (n, Term.deriv(
Term((n, 33)), k=0))
684 assert Term.deriv(
Term((n, 33)), k=2) == (n*(n - 1),
Term((n - 2, 33))), \
685 (n, Term.deriv(
Term((n, 33)), k=2))
686 assert Term.deriv(
Term((n, 33)), k=3) == (n*(n - 1)*(n - 2),
Term((n - 3, 33))), \
687 (n, Term.deriv(
Term((n, 33)), k=3))
689 assert Term.deriv(
Term((n, 33)), k=-1) == (
None,
Term((n + 1, 33))), \
690 (n, Term.deriv(
Term((n, 33)), k=-1))
692 assert Term.deriv(
Term((n, 33)), k=-1) == (1/(n + 1),
Term((n + 1, 33))), \
693 (n, Term.deriv(
Term((n, 33)), k=-1))
695 assert Term.deriv(
Term((n, 33)), k=-2) == (
None,
Term((n + 2, 33))), \
696 (n, Term.deriv(
Term((n, 33)), k=-2))
698 assert Term.deriv(
Term((n, 33)), k=-2) \
699 == (1/((n + 1)*(n + 2)),
Term((n + 2, 33))), \
700 (n, Term.deriv(
Term((n, 33)), k=-2))
702 assert Term.deriv(
Term((n, 33)), k=-3) == (
None,
Term((n + 3, 33))), \
703 (n, Term.deriv(
Term((n, 33)), k=-3))
705 assert Term.deriv(
Term((n, 33)), k=-3) \
706 == (1/((n + 1)*(n + 2)*(n + 3)),
Term((n + 3, 33))), \
707 (n, Term.deriv(
Term((n, 33)), k=-3))
708 assert Term.deriv(
Term((
None, 33)), k=n) == (
None,
Term((
None, 33))), \
709 (
None, Term.deriv(
Term((
None, 33)), k=n))
710 print(
'ok'); sys.stdout.flush()
713 print(
'Term.eval()...', end=
''); sys.stdout.flush()
715 assert t.eval() == 1, (t, t.eval())
716 assert t.eval(0) == 1, (t, t.eval(0))
717 assert t.eval(1) == 1, (t, t.eval(1))
718 assert t.eval(2) == 1, (t, t.eval(2))
719 assert t.eval(3) == 1, (t, t.eval(3))
720 assert t.eval(
None) ==
None, (t, t.eval(
None))
722 assert t.eval() == 1, (t, t.eval())
723 assert t.eval(0) == 0, (t, t.eval(0))
724 assert t.eval(1) == 1, (t, t.eval(1))
725 assert t.eval(2) == 4, (t, t.eval(2))
726 assert t.eval(3) == 9, (t, t.eval(3))
727 assert t.eval(
None) ==
None, (t, t.eval(
None))
729 assert t.eval() == 1, (t, t.eval())
730 assert t.eval(0) == 0, (t, t.eval(0))
731 assert t.eval(1) == 1, (t, t.eval(1))
732 assert t.eval(2) == 4*8, (t, t.eval(2))
733 assert t.eval(3) == 9*27, (t, t.eval(3))
734 assert t.eval(
None) ==
None, (t, t.eval(
None))
736 assert t.eval() == 1, (t, t.eval())
737 assert t.eval(0) == 0, (t, t.eval(0))
738 assert t.eval(1) == 1, (t, t.eval(1))
739 assert t.eval(2) == 8, (t, t.eval(2))
740 assert t.eval(3) == 27, (t, t.eval(3))
741 assert t.eval(
None) ==
None, (t, t.eval(
None))
744 assert t.eval((0, 0)) == 1, (t, t.eval((0, 0)))
745 assert t.eval((4, 0)) == 1, (t, t.eval((4, 0)))
746 assert t.eval((4, 5)) == 1, (t, t.eval((4, 5)))
747 assert t.eval(
None) ==
None, (t, t.eval(
None))
749 assert t.eval((0, 0)) == 0, (t, t.eval((0, 0)))
750 assert t.eval((4, 0)) == 16, (t, t.eval((4, 0)))
751 assert t.eval((4, 5)) == 16, (t, t.eval((4, 5)))
752 assert t.eval((4,
None)) == 16, (t, t.eval((4,
None)))
754 assert t.eval((0, 0)) == 0, (t, t.eval((0, 0)))
755 assert t.eval((4, 0)) == 0, (t, t.eval((4, 0)))
756 assert t.eval((4, 5)) == 16*125, (t, t.eval((4, 5)))
757 assert t.eval([4, 5]) == 16*125, (t, t.eval([4, 5]))
758 assert t.eval((4,
None)) ==
None, (t, t.eval((4,
None)))
760 assert t.eval((0, 0)) == 0, (t, t.eval((0, 0)))
761 assert t.eval((4, 0)) == 0, (t, t.eval((4, 0)))
762 assert t.eval((0, 5)) == 125, (t, t.eval((4, 0)))
763 assert t.eval((4, 5)) == 125, (t, t.eval((4, 5)))
764 assert t.eval((4, 5, 6)) == 125, (t, t.eval((4, 5, 6)))
765 assert t.eval((4,
None)) ==
None, (t, t.eval((4,
None)))
767 assert t.eval((4, 0)) == 0, (t, t.eval((4, 0)))
768 assert t.eval((4, 5)) == 125/16, (t, t.eval((4, 5)))
769 assert t.eval((4,
None)) ==
None, (t, t.eval((4,
None)))
771 assert t.eval((4, 0)) ==
None, (t, t.eval((4, 0)))
772 assert t.eval((4, 5)) ==
None, (t, t.eval((4, 5)))
773 assert t.eval((4,
None)) ==
None, (t, t.eval((4,
None)))
774 print(
'ok'); sys.stdout.flush()
777 print(
'Term.partialeval()...', end=
''); sys.stdout.flush()
779 assert t.partialeval(()) == (1, t), (t, t.partialeval(()))
780 assert t.partialeval((0, 5)) == (1, t), (t, t.partialeval((0, 5)))
781 assert t.partialeval((4, 5)) == (1, t), (t, t.partialeval((4, 5)))
782 assert t.partialeval((
None, 5)) == (1, t), (t, t.partialeval((
None, 5)))
783 assert t.partialeval((4,
None)) == (1, t), (t, t.partialeval((4,
None)))
784 assert t.partialeval((4,
None, 6)) == (1, t), (t, t.partialeval((4,
None, 6)))
786 assert t.partialeval((0, 5)) == (0, (0, 0)), (t, t.partialeval((0, 5)))
787 assert t.partialeval((4, 5)) == (16*125, (0, 0)), (t, t.partialeval((4, 5)))
788 assert t.partialeval((
None, 5)) == (125, (2, 0)), (t, t.partialeval((
None, 5)))
789 assert t.partialeval((4,
None)) == (16, (0, 3)), (t, t.partialeval((4,
None)))
790 assert t.partialeval((4,
None, 6)) == (16, (0, 3)), (t, t.partialeval((4,
None, 6)))
792 assert t.partialeval((4, 5)) == (125/16, (0, 0)), (t, t.partialeval((4, 5)))
793 assert t.partialeval((
None, 5)) == (125, (-2, 0)), (t, t.partialeval((
None, 5)))
794 assert t.partialeval((4,
None)) == (1/16, (0, 3)), (t, t.partialeval((4,
None)))
795 assert t.partialeval((4,
None, 6)) == (1/16, (0, 3)), (t, t.partialeval((4,
None, 6)))
797 assert t.partialeval((0, 5)) == (
None, (0,
None)), (t, t.partialeval((0, 5)))
798 assert t.partialeval((4, 5)) == (
None, (0,
None)), (t, t.partialeval((4, 5)))
799 assert t.partialeval((
None, 5)) == (
None, (2,
None)), (t, t.partialeval((
None, 5)))
800 assert t.partialeval((4,
None)) == (16, (0,
None)), (t, t.partialeval((4,
None)))
801 assert t.partialeval((4,
None, 6)) == (16, (0,
None)), (t, t.partialeval((4,
None, 6)))
802 print(
'ok'); sys.stdout.flush()
807 print(
'Polynomial()...', end=
''); sys.stdout.flush()
824 assert Polynomial([t, u, t], coef=-7) == {t: -14, u: -7}, \
828 print(
'ok'); sys.stdout.flush()
831 print(
'Polynomial.__iadd__()...', end=
''); sys.stdout.flush()
833 print(
'ok'); sys.stdout.flush()
836 print(
'Polynomial.__repr__()...', end=
''); sys.stdout.flush()
837 assert repr(
Polynomial()) ==
"'Polynomial({{}}, varsstr=\"{0}\")'".format(ALPHA), \
840 print(
'ok'); sys.stdout.flush()
843 print(
'Polynomial.__str__()...', end=
''); sys.stdout.flush()
848 print(
'ok'); sys.stdout.flush()
851 print(
'Polynomial.deriv()...', end=
''); sys.stdout.flush()
853 assert p.deriv() ==
Polynomial({
Term((2, 0, 7, 1)):15,
Term((-5, 2, 3, 1)):12}), p.deriv()
854 assert p.deriv(k=2) ==
Polynomial({
Term((1, 0, 7, 1)):30,
Term((-6, 2, 3, 1)):-60}), \
856 assert p.deriv(k=-1) ==
Polynomial({
Term((4, 0, 7, 1)):1.25,
Term((-3, 2, 3, 1)):1}), \
863 print(
'ok'); sys.stdout.flush()
866 print(
'Polynomial.eval()...', end=
''); sys.stdout.flush()
871 assert p.eval() == 1, (p, p.eval())
872 assert p.eval(1) == 1, (p, p.eval(1))
873 assert p.eval(2) == 8*128*2, (p, p.eval(2))
874 assert p.eval((5, 6, 2, 13)) == 125*128*13, (p, p.eval((5, 6, 2, 13)))
875 assert p.eval([5, 6, 2, 13]) == 125*128*13, (p, p.eval([5, 6, 2, 13]))
876 assert p.eval((5, 0, 2, 13)) == 125*128*13, (p, p.eval((5, 0, 2, 13)))
877 assert p.eval((5, 6, 2, 0)) == 0, (p, p.eval((5, 6, 2, 0)))
879 assert p.eval() == -3, (p, p.eval())
880 assert p.eval(1) == -3, (p, p.eval(1))
881 assert p.eval(2) == -3*8*128*2, (p, p.eval(2))
882 assert p.eval((5, 6, 2, 13)) == -3*125*128*13, (p, p.eval((5, 6, 2, 13)))
883 assert p.eval([5, 6, 2, 13]) == -3*125*128*13, (p, p.eval([5, 6, 2, 13]))
884 assert p.eval((5, 0, 2, 13)) == -3*125*128*13, (p, p.eval((5, 0, 2, 13)))
885 assert p.eval((5, 6, 2, 0)) == 0, (p, p.eval((5, 6, 2, 0)))
887 assert p.eval() == -6, (p, p.eval())
888 assert p.eval(1) == -6, (p, p.eval(1))
889 assert p.eval(2) == -3*8*128*2 - 3/4*4*8*2, (p, p.eval(2))
890 assert p.eval((5, 6, 2, 13)) == -3*125*128*13 - 3/25*36*8*13, (p, p.eval((5, 6, 2, 13)))
891 assert p.eval((5, 0, 2, 13)) == -3*125*128*13, (p, p.eval((5, 0, 2, 13)))
892 assert p.eval((5, 6, 2, 0)) == 0, (p, p.eval((5, 6, 2, 0)))
894 print(
'ok'); sys.stdout.flush()
897 print(
'Polynomial.lenterms()...', end=
''); sys.stdout.flush()
906 print(
'ok'); sys.stdout.flush()
909 print(
'Polynomial.partialeval()...', end=
''); sys.stdout.flush()
912 assert p.partialeval(()) == {}, (p, p.partialeval(()))
913 assert p.partialeval((0, 5)) == {}, (p, p.partialeval((0, 5)))
914 assert p.partialeval((
None, 5)) == {}, (p, p.partialeval((
None, 5)))
916 assert p.partialeval((0, 5)) ==
Polynomial(
Term((0, 0)), coef=0), \
917 (p, p.partialeval((0, 5)))
918 assert p.partialeval((4, 5)) ==
Polynomial(
Term((0, 0)), coef=16*125), \
919 (p, p.partialeval((4, 5)))
920 assert p.partialeval([4, 5]) ==
Polynomial(
Term((0, 0)), coef=16*125), \
921 (p, p.partialeval([4, 5]))
922 assert p.partialeval((
None, 5)) ==
Polynomial(
Term((2, 0)), coef=125), \
923 (p, p.partialeval((
None, 5)))
924 assert p.partialeval((4,
None)) ==
Polynomial(
Term((0, 3)), coef=16), \
925 (p, p.partialeval((4,
None)))
926 assert p.partialeval((4,
None, 6)) ==
Polynomial(
Term((0, 3)), coef=16), \
927 (p, p.partialeval((4,
None, 6)))
929 assert p.partialeval((5, 0, 2, 13)) ==
Polynomial(
Term((0, 0, 0, 0)), coef=-3*125*128*13), \
930 (p, p.partialeval((5, 0, 2, 13)))
931 assert p.partialeval((5, 6, 2, 13)) \
932 ==
Polynomial(
Term((0, 0, 0, 0)), coef= -3*125*128*13 - 3/25*36*8*13), \
933 (p, p.partialeval((5, 6, 2, 13)))
934 assert p.partialeval((5,
None, 2, 13)) \
936 Term((0, 2, 0, 0)): -3/25*8*13}), \
937 (p, p.partialeval((5,
None, 2, 13)))
939 print(
'ok'); sys.stdout.flush()