Polynomial division¶
Numerical division can be split into two variants: floor division
(chaospy.floor_divide()) and true division (chaospy.true_divide()):
>>> dividend = 7
>>> divisor = 2
>>> quotient_true = numpy.true_divide(dividend, divisor)
>>> quotient_true
3.5
>>> quotient_floor = numpy.floor_divide(dividend, divisor)
>>> quotient_floor
3
The discrepancy between the two can be captured by a remainder
(chaospy.remainder()), which allow us to more formally define them as
follows:
>>> remainder = numpy.remainder(dividend, divisor)
>>> remainder
1
>>> dividend == quotient_floor*divisor+remainder
True
>>> dividend == quotient_true*divisor
True
In the case of polynomials, neither true nor floor division is supported like
this. Instead, it supports its own kind of polynomial division
chaospy.poly_divide(). Polynomial division falls back to behave like
floor division for all constants, as it does not round values:
>>> q0, q1 = chaospy.variable(2)
>>> dividend = q0**2+q1
>>> divisor = q0-1
>>> quotient = chaospy.poly_divide(dividend, divisor)
>>> quotient
polynomial(q0+1.0)
However, like floor division, it can still have remainders using
chaospy.poly_remainder(). For example:
>>> remainder = chaospy.poly_remainder(dividend, divisor)
>>> remainder
polynomial(q1+1.0)
>>> dividend == quotient*divisor+remainder
True
In numpy, the “Python syntactic sugar” operators have the following behavior:
/is used for true divisionchaospy.true_divide().//is used for floor divisionchaospy.floor_divide().%is used for remainderchaospy.remainder().divmodis used for floor division and remainder in combination to save computational cost throughchaospy.divmod().
In chaospy, which takes precedence if any of the values are of
chaospy.ndpoly objects, take the following behavior:
/is used for polynomial divisionchaospy.poly_divide(), which is not compatible with numpy.//is still used for floor divisionchaospy.floor_divide()which is compatible with numpy, and only works if divisor is a constant.%is used for polynomial remainderchaospy.poly_remainder(), which is not backwards compatible.divmoduseschaospy.poly_divmod()which is used to save computation cost by doingchaospy.poly_divide()andchaospy.remainder()at the same time.