def toPolynomial(self):

        def processOneSide(origLeftMonomial):
            
            newLeft = Monomial.constantMonomial(origLeftMonomial.getCoefficient())
            newRight = Monomial.constantMonomial(1)

            for var, expo in origLeftMonomial.getVars():
                switch_sides = 'Inv' in var
                var = var.replace('Inv','')

                if 'zpprime' in var:
                    newLeftMultiply = (
                        Monomial.constantMonomial(-1) *
                        Monomial.fromVariableName(
                            var.replace('zpprime','OneMinusz')))
                    newRightMultiply = (
                        Monomial.fromVariableName(
                            var.replace('zpprime','z')))
                elif 'zprime' in var:
                    newLeftMultiply = (
                        Monomial.constantMonomial(1))
                    newRightMultiply = (
                        Monomial.fromVariableName(
                            var.replace('zprime','OneMinusz')))
                else:
                    newLeftMultiply = (
                        Monomial.fromVariableName(var))
                    newRightMultiply = (
                        Monomial.constantMonomial(1))
                    
                if switch_sides:
                    newLeft = newLeft * newRightMultiply**expo
                    newRight = newRight * newLeftMultiply**expo
                else:
                    newLeft = newLeft * newLeftMultiply**expo
                    newRight = newRight * newRightMultiply**expo
            
            return newLeft, newRight
        
        l1, r1 = processOneSide(self.left)
        l2, r2 = processOneSide(self.right)

        newLeft = Polynomial((l1*r2,))
        newRight = Polynomial((l2*r1,))


        substDict = dict(
            [
                (var, 
                 Polynomial(
                        (
                            Monomial.constantMonomial(1),
                            Monomial.constantMonomial(-1)*
                            Monomial.fromVariableName(
                                var.replace('OneMinusz','z')))))
                for var in newLeft.variables() + newRight.variables()
                if 'OneMinusz' in var])

        return (
              newLeft.substitute(substDict) 
            - newRight.substitute(substDict))