Changeset - c1686e15f8d1
[Not reviewed]
default
0 0 2
Laman - 7 years ago 2017-09-24 11:25:29

tests for finite field arithmetic
2 files changed with 60 insertions and 0 deletions:
0 comments (0 inline, 0 general)
src/tests/__init__.py
Show inline comments
 
new file 100644
src/tests/test_gf256.py
Show inline comments
 
new file 100644
 
import random
 
import unittest
 
from unittest import TestCase
 

	
 
from gf256 import _gfmul
 
from gf256 import *
 

	
 

	
 
class TestGF256(TestCase):
 
	def test_gfmul(self):
 
		self.assertEqual(_gfmul(0,0), 0)
 
		self.assertEqual(_gfmul(1,1), 1)
 
		self.assertEqual(_gfmul(2,2), 4)
 
		self.assertEqual(_gfmul(0,21), 0)
 
		self.assertEqual(_gfmul(0x53,0xca), 0x01)
 
		self.assertEqual(_gfmul(0xff,0xff), 0x13)
 

	
 
	def testGfmul(self):
 
		for a in range(256):
 
			for b in range(256):
 
				self.assertEqual(_gfmul(a,b), gfmul(a,b))
 

	
 
	def testEvaluate(self):
 
		for x in range(256):
 
			(a0,a1,a2,a3)=(x,x>>1,x>>2,x>>3)
 
			self.assertEqual(evaluate([17],x), 17) # constant polynomial
 
			self.assertEqual(evaluate([a0,a1,a2,a3],0), x) # any polynomial at 0
 
			self.assertEqual(evaluate([a0,a1,a2,a3],1), a0^a1^a2^a3) # polynomial at 1 == sum of coefficients
 

	
 
	def testGetConstantCoef(self):
 
		self.assertEqual(getConstantCoef((1,1),(2,2),(3,3)), 0)
 

	
 
		random.seed(17)
 
		randomMatches=0
 
		for i in range(10):
 
			k=random.randint(2,255)
 

	
 
			# exact
 
			res=self.checkCoefsMatch(k,k)
 
			self.assertEqual(res[0], res[1])
 

	
 
			# overdetermined
 
			res=self.checkCoefsMatch(k,256)
 
			self.assertEqual(res[0], res[1])
 

	
 
			# underdetermined => random
 
			res=self.checkCoefsMatch(k,k-1)
 
			if res[0]==res[1]:
 
				randomMatches+=1
 
		self.assertLess(randomMatches, 2) # with a chance (255/256)**10=0.96 there should be no match
 

	
 
	def checkCoefsMatch(self,k,m):
 
		coefs=[random.randint(0,255) for i in range(k)]
 
		points=[(j, evaluate(coefs,j)) for j in range(1,256)]
 
		random.shuffle(points)
 
		return (getConstantCoef(*points[:m]), coefs[0])
 

	
 

	
 
if __name__ == '__main__':
 
	unittest.main()
0 comments (0 inline, 0 general)