What's up with this code?

Gregory Petrosyan gregory.petrosyan at gmail.com
Wed Feb 22 18:02:11 EST 2006


Hello, it's me again.
I am trying to optimise small module for working with polynomials, and
I have encountered problem: new, optimised, code, doesn't work in some
specific case. Here's the old version of the code:

(3x^2 + 2x + 1  <=>  poly([3, 2, 1]), btw)

    def __add__(self, other):
        "Return sum of two polynomials"
        rcoefs1 = list(reversed(self.coefs))
        rcoefs2 = list(reversed(other.coefs))
        coefs = [c1+c2 for c1,c2 in zip(rcoefs1, rcoefs2)]
        minlen = min(len(rcoefs1), len(rcoefs2))
        coefs.extend(rcoefs1[minlen:] + rcoefs2[minlen:])
        return Polynomial(reversed(coefs))

Here's the new version:

    def __add__(self, other):
        rcoefs1 = reversed(self.coefs)
        rcoefs2 = reversed(other.coefs)
        coefs = [c1+c2 for c1,c2 in it.izip(rcoefs1, rcoefs2)]
        coefs.extend(it.chain(rcoefs1, rcoefs2)) #? -- here is magic
        if coefs[-1] != 0:
            return Polynomial(reversed(coefs), False, False)
        else:
            return Polynomial(reversed(coefs), False)

Last four lines are ok (tested), "magic" seems to occure in #? line.
What's the magic? Here it is:

poly([1,2,1]) + poly([1,-2,1]) is ok,
poly([1,-2,1]) + poly([5,4,3,2,1]) is ok,
poly([1]) + poly([2]) is ok,
poly([1,2,1]) + poly([5,4,3,2,1]) is ok, but

poly([1,0]) + poly([-1])  gives poly([-1]),
poly([1,-3]) + poly([-2]) gives poly([-5]) etc.

So, "magic" happens when processing something like poly([a,b]) +
poly([c]) and it gives poly([b+c]) as result. Can anybody help me with
it?

Regards, Gregory.




More information about the Python-list mailing list