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)
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)
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))
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
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()
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