#! /usr/bin/env python
#
def i4_modp ( i, j ):
#*****************************************************************************80
#
## I4_MODP returns the nonnegative remainder of I4 division.
#
# Discussion:
#
# If
# NREM = I4_MODP ( I, J )
# NMULT = ( I - NREM ) / J
# then
# I = J * NMULT + NREM
# where NREM is always nonnegative.
#
# The MOD function computes a result with the same sign as the
# quantity being divided. Thus, suppose you had an angle A,
# and you wanted to ensure that it was between 0 and 360.
# Then mod(A,360) would do, if A was positive, but if A
# was negative, your result would be between -360 and 0.
#
# On the other hand, I4_MODP(A,360) is between 0 and 360, always.
#
# Example:
#
# I J MOD I4_MODP Factorization
#
# 107 50 7 7 107 = 2 * 50 + 7
# 107 -50 7 7 107 = -2 * -50 + 7
# -107 50 -7 43 -107 = -3 * 50 + 43
# -107 -50 -7 43 -107 = 3 * -50 + 43
#
# Licensing:
#
# This code is distributed under the GNU LGPL license.
#
# Modified:
#
# 08 May 2013
#
# Author:
#
# John Burkardt
#
# Parameters:
#
# Input, integer I, the number to be divided.
#
# Input, integer J, the number that divides I.
#
# Output, integer VALUE, the nonnegative remainder when I is
# divided by J.
#
from sys import exit
if ( j == 0 ):
print ( '' )
print ( 'I4_MODP - Fatal error!' )
print ( ' Illegal divisor J = %d' % ( j ) )
exit ( 'I4_MODP - Fatal error!' )
value = i % j
if ( value < 0 ):
value = value + abs ( j )
return value
def i4_modp_test ( ):
#*****************************************************************************80
#
## I4_MODP_TEST tests I4_MODP.
#
# Licensing:
#
# This code is distributed under the GNU LGPL license.
#
# Modified:
#
# 28 September 2014
#
# Author:
#
# John Burkardt
#
import numpy as np
import platform
test_num = 4
n_vec = np.array ( ( 107, 107, -107, -107 ) )
d_vec = np.array ( ( 50, -50, 50, -50 ) )
print ( '' )
print ( 'I4_MODP_TEST' )
print ( ' Python version: %s' % ( platform.python_version ( ) ) )
print ( ' I4_MODP factors a number' )
print ( ' into a multiple M and a positive remainder R.' )
print ( '' )
print ( ' Number Divisor Multiple Remainder' )
print ( '' )
for test in range ( 0, test_num ):
n = n_vec[test]
d = d_vec[test]
r = i4_modp ( n, d )
m = ( n - r ) // d
print ( ' %8d %8d %8d %8d' % ( n, d, m, r ) )
print ( '' )
print ( ' Repeat using Python % Operator:' )
print ( '' )
for test in range ( 0, test_num ):
n = n_vec[test]
d = d_vec[test]
m = n // d
r = n % d
print ( ' %8d %8d %8d %8d' % ( n, d, m, r ) )
#
# Terminate.
#
print ( '' )
print ( 'I4_MODP_TEST' )
print ( ' Normal end of execution.' )
return
if ( __name__ == '__main__' ):
from timestamp import timestamp
timestamp ( )
i4_modp_test ( )
timestamp ( )