def __rpow__(self, other): if other == 1 or other == 0: return other elif isinstance(other, int) and other < 0: raise ValueError("Cannot raise negative integer to Ordinal power") else: ordinals = [] for term in self.terms: if len(term) > 1: a = Ordinal([term]) b = self._raise_lower_index_to_single_term_power() else: a = term[0] b = other ** a ordinals.append(b) return product(ordinals)
def __pow__(self, other): if isinstance(other, int): if other > 0: return self._raise_to_integer_power(other) elif other == 0: return 1 else: raise ValueError("Cannot raise Ordinal to negative integer power") else: ordinals = [] for term in other.terms: if len(term) > 1: a = Ordinal([term]) b = self._raise_ordinal_to_single_term_power(a) else: a = term[0] b = self._raise_to_integer_power(a) ordinals.append(b) return product(ordinals)
def _raise_to_integer_power(self, n): # naive approach: repeated multiplication (this # does not scale well). # TODO: find a formula for finite powers of ordinals. return product(self for _ in range(n))