Пример #1
0
    def is_ordered(self, letter=None):
        if letter is None:
            return all(self.is_ordered(l) for l in self.letters)
        elif not is_letter_valid(letter):
            raise ValueError("The letter must be a single letter from the "
                             "alphabet.")
        elif letter not in self.letters:
            return True

        def is_ordered(degrees, reverse=False, reverse_diff=False):
            diff = 1
            if reverse:
                degrees.reverse()
            if reverse_diff:
                diff = -1
            for i, d in enumerate(degrees):
                if i == len(degrees) - 1:
                    break
                if degrees[i + 1] not in (d, d - diff):
                    return False
            return True

        degrees = list(self.all_letter_degrees[letter])
        return is_ordered(degrees, False, False) or\
               is_ordered(degrees, True, False) or\
               is_ordered(degrees, True, True) or\
               is_ordered(degrees, False, True)
Пример #2
0
 def max_degree_of_letter(self, letter):
     if not is_letter_valid(letter):
         raise ValueError("The letter must be a single letter from the "
                          "alphabet.")
     elif letter not in self.letters:
         return 0
     all_vars = (l for c, l in self._monomials)
     return max(d for v in all_vars for l, d in iteritems(v) if l == letter)
Пример #3
0
 def is_complete(self, letter=None):
     if letter is None:
         return all(self.is_complete(l) for l in self.letters)
     elif not is_letter_valid(letter):
         raise ValueError("The letter must be a single letter from the "
                          "alphabet.")
     elif letter not in self.letters:
         return True
     return set(self.all_letter_degrees[letter]) ==\
            set(range_(self.max_degree_of_letter(letter) + 1))
Пример #4
0
    def sort(self, letter=None, reverse=False):
        if letter is not None and (not is_letter_valid(letter) or\
                                   letter not in self.letters):
            raise ValueError("The letter must be a single letter from the "
                             "alphabet contained in the Polynomial.")
        elif len(self) in (0, 1):
            return
        elif self.is_constant():
            return

        def _sort(monomials, letter=None):
            if letter is None:
                return sorted((m for m in monomials if not m[1]),
                              key=lambda m: m[0], reverse=True)
            return sorted((m for m in monomials if letter in m[1]),
                          key=lambda m: m[1][letter], reverse=True)

        degrees = self.all_max_letter_degrees
        letters = sorted(iterkeys(degrees),
                         key=lambda l: (degrees[l], 255 - ord(l)),
                         reverse=True)

        preferenced_letters = sorted(l for l in letters\
                                     if l in self.preferenced_letters)

        if preferenced_letters and letter is None:
            letter = preferenced_letters.pop(0)
        elif letter is None:
            letter = letters[0]

        letters.remove(letter)

        lower_letters = [l for l in letters\
                         if l.islower() and l not in preferenced_letters]
        upper_letters = [l for l in letters\
                         if l.isupper() and l not in preferenced_letters]

        letters = [letter] + preferenced_letters +\
                  lower_letters + upper_letters

        monomials = []
        for l in letters:
            for m in _sort(self._monomials, l):
                if m not in monomials:
                    monomials.append(m)
        for m in _sort(self._monomials):
            if m not in monomials:
                monomials.append(m)
        if reverse:
            monomials.reverse()
        self._monomials = monomials
Пример #5
0
 def complete(self, letter=None):
     if letter is None:
         for l in self.letters:
             self.complete(l)
         return
     elif not is_letter_valid(letter):
         raise ValueError("The letter must be a single letter from the "
                          "alphabet.")
     elif letter not in self.letters:
         return
     degrees = set(self.all_letter_degrees[letter])
     for d in set(range_(self.max_degree_of_letter(letter))) - degrees:
         self._monomials.append([0, {letter: d}])
     self.sort()
Пример #6
0
 def check_and_convert_iterable(iterable):
     monos = []
     for c, letters in iterable:
         if not isinstance(c, numbers.Number):
             raise ValueError("The coefficient must be a number.")
         vars_ = {}
         it = iteritems(letters) if isinstance(letters, dict)\
                                 else letters
         for letter, degree in it:
             if not is_letter_valid(letter):
                 raise ValueError("All letters must be a single letter "
                                  "from the alphabet.")
             elif not is_degree_valid(degree):
                 raise ValueError("The degree of each variable must be "
                                  "a positive integer.")
             vars_[letter] = degree
         monos.append([fractions.Fraction(str(c)), vars_])
     return monos