gcd works with negatives numbers and it is now tested
This commit is contained in:
		| @@ -10,19 +10,30 @@ def gcd(a, b): | |||||||
|         :returns: the gcd |         :returns: the gcd | ||||||
|  |  | ||||||
|         """ |         """ | ||||||
|         if a > b: |         pos_a, _a = (a >= 0), abs(a) | ||||||
|             c = a % b |         pos_b, _b = (b >= 0), abs(b) | ||||||
|  |  | ||||||
|  |         gcd_sgn = (-1 + 2*(pos_a or pos_b)) | ||||||
|  |  | ||||||
|  |         if _a > _b: | ||||||
|  |             c = _a % _b | ||||||
|         else: |         else: | ||||||
|             c = b % a |             c = _b % _a | ||||||
|  |  | ||||||
|         if c == 0: |         if c == 0: | ||||||
|             return min(a,b) |             return gcd_sgn * min(_a,_b) | ||||||
|         elif a == 1: |         elif _a == 1: | ||||||
|             return b |             return gcd_sgn * _b | ||||||
|         elif b == 1: |         elif _b == 1: | ||||||
|             return a |             return gcd_sgn * _a | ||||||
|         else: |         else: | ||||||
|             return gcd(min(a,b), c) |             return gcd_sgn * gcd(min(_a,_b), c) | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     print(gcd(3, 15)) | ||||||
|  |     print(gcd(3, 15)) | ||||||
|  |     print(gcd(-15, -3)) | ||||||
|  |     print(gcd(-3, -12)) | ||||||
|  |  | ||||||
|  |  | ||||||
| # ----------------------------- | # ----------------------------- | ||||||
|   | |||||||
							
								
								
									
										42
									
								
								test/test_arthmetic.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								test/test_arthmetic.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  | # encoding: utf-8 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | import unittest | ||||||
|  |  | ||||||
|  | from pymath import arithmetic | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class TestArithmetic(unittest.TestCase): | ||||||
|  |     """Testing functions from pymath.arithmetic""" | ||||||
|  |  | ||||||
|  |     def test_gcd_commu(self): | ||||||
|  |         self.assertEqual(arithmetic.gcd(3, 15), arithmetic.gcd(15,3)) | ||||||
|  |  | ||||||
|  |     def test_gcd1(self): | ||||||
|  |         self.assertEqual(arithmetic.gcd(3, 15), 3) | ||||||
|  |  | ||||||
|  |     def test_gcd2(self): | ||||||
|  |         self.assertEqual(arithmetic.gcd(14, 21), 7) | ||||||
|  |  | ||||||
|  |     def test_gcd_prem(self): | ||||||
|  |         self.assertEqual(arithmetic.gcd(14, 19), 1) | ||||||
|  |  | ||||||
|  |     def test_gcd_neg(self): | ||||||
|  |         self.assertEqual(arithmetic.gcd(3, -15), 3) | ||||||
|  |         self.assertEqual(arithmetic.gcd(-3, -15), -3) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     unittest.main() | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | # ----------------------------- | ||||||
|  | # Reglages pour 'vim' | ||||||
|  | # vim:set autoindent expandtab tabstop=4 shiftwidth=4: | ||||||
|  | # cursor: 16 del  | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user