User:I am islptng/WIP

From Esolang
Jump to navigation Jump to search
# -*- coding:utf-8 -*-

from math import gcd

def factorize(n):
	factors = {}
	if n == 0: return None # 0 is not factorizable
	if n == 1: return {} # 1 has no prime factors
	i = 2
	while i <= n:
		if n % i == 0: factors[i] = 0
		while n % i == 0:
			factors[i] += 1
			n //= i
		i += 1
	return factors

def sup(n):
	n = str(n).replace("1","¹").replace("2","²").replace("3","³").replace("4","⁴")
	n = n.replace("5","⁵").replace("6","⁶").replace("7","⁷")
	n = n.replace("8","⁸").replace("9","⁹").replace("0","⁰")
	return n

class TooComplex(Exception): pass # if the calculation is too complex

# (2,5,-7,4,3) -> -2⁴√7³/5i

class spItem:
	def __init__(self, num=0, den=1, base=1, root=2, power=1):
		self.n,self.d,self.b,self.r,self.p = num,den,base,root,power
		self.simplify()
	def __str__(self):
		if self.d == 0: return "infinity" if self.n else "NaN"
		if self.n == 0: return "0"
		n,d,b,r,p = self.n,self.d,self.b,self.r,self.p
		imaginary = False
		if b < 0 & r % 2 == 0:
			imaginary = True
			b *= -1
		res = ""
		if n < 0:
			res += "-"
			n *= -1
		if n != 1 or b != 1: res += str(n)
		if b != 1:
			if r != 2: res += sup(r)
			res += "√" + str(b)
			if p != 1: res += sup(p)
		if d != 1: res += "/" + str(d)
		if imaginary: res += "i"
		return res
	def simplify(self):
		if self.d == 0:
			if self.n == 0: self.b,self.r,self.p = 1,1,0
		if self.n == 0: self.d,self.b,self.r,self.p = 0,1,1,0
		if self.p == 0: self.b,self.r = 1,1