Data Oriented Paradigm#
Initial Set-Up#
from pyrsistent import PRecord, field
class SinglePoint(PRecord):
a: int = field(mandatory=True)
class DoublePoint(PRecord):
a: SinglePoint = field(mandatory=True)
b: SinglePoint = field(mandatory=True)
Predecessor and Successor#
def predecessor(single_point: SinglePoint) -> SinglePoint:
result = single_point.a - 1
return SinglePoint(a=result)
assert predecessor(SinglePoint(a=1)) == SinglePoint(a=0)
assert predecessor(SinglePoint(a=10)) == SinglePoint(a=9)
def successor(single_point: SinglePoint) -> SinglePoint:
result = single_point.a + 1
return SinglePoint(a=result)
assert successor(SinglePoint(a=0)) == SinglePoint(a=1)
assert successor(SinglePoint(a=10)) == SinglePoint(a=11)
Addition#
def addition(addends: DoublePoint) -> SinglePoint:
result = addends.a
for _ in range(addends.b.a):
result = successor(result)
return result
assert addition(DoublePoint(a=SinglePoint(a=0), b=SinglePoint(a=0))) == SinglePoint(a=0)
assert addition(DoublePoint(a=SinglePoint(a=1), b=SinglePoint(a=0))) == SinglePoint(a=1)
assert addition(DoublePoint(a=SinglePoint(a=0), b=SinglePoint(a=1))) == SinglePoint(a=1)
assert addition(DoublePoint(a=SinglePoint(a=10), b=SinglePoint(a=10))) == SinglePoint(
a=20
)
Multiplication#
def multiplication(factors: DoublePoint) -> SinglePoint:
result = SinglePoint(a=0)
if factors.a.a == 0 or factors.b.a == 0:
return result
for _ in range(factors.b.a):
result = addition(DoublePoint(a=result, b=factors.a))
return result
assert multiplication(
DoublePoint(a=SinglePoint(a=0), b=SinglePoint(a=0))
) == SinglePoint(a=0)
assert multiplication(
DoublePoint(a=SinglePoint(a=2), b=SinglePoint(a=0))
) == SinglePoint(a=0)
assert multiplication(
DoublePoint(a=SinglePoint(a=0), b=SinglePoint(a=2))
) == SinglePoint(a=0)
assert multiplication(
DoublePoint(a=SinglePoint(a=10), b=SinglePoint(a=10))
) == SinglePoint(a=100)
Exponentiation#
def exponentiation(base: SinglePoint, exponent: SinglePoint) -> SinglePoint:
result = SinglePoint(a=1)
for _ in range(exponent.a):
result = multiplication(DoublePoint(a=result, b=base))
return result
assert exponentiation(SinglePoint(a=1), SinglePoint(a=0)) == SinglePoint(
a=1
), exponentiation(SinglePoint(a=3), SinglePoint(a=3))
assert exponentiation(SinglePoint(a=0), SinglePoint(a=1)) == SinglePoint(
a=0
), exponentiation(SinglePoint(a=3), SinglePoint(a=3))
assert exponentiation(SinglePoint(a=3), SinglePoint(a=3)) == SinglePoint(
a=27
), exponentiation(SinglePoint(a=3), SinglePoint(a=3))