diff --git a/dev-requirements.txt b/dev-requirements.txt index c29cf4e..7b33738 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,4 +1,5 @@ pytest hypothesis flake8 -autopep8 \ No newline at end of file +autopep8 +sympy \ No newline at end of file diff --git a/mathgenerator/funcs/__init__.py b/mathgenerator/funcs/__init__.py index 36f02f8..f054a11 100644 --- a/mathgenerator/funcs/__init__.py +++ b/mathgenerator/funcs/__init__.py @@ -76,3 +76,4 @@ from .angleBtwVectorsFunc import * from .absoluteDifferenceFunc import * from .vectorDotFunc import * from .binary2sComplement import * +from .matrixInversion import * diff --git a/mathgenerator/funcs/matrixInversion.py b/mathgenerator/funcs/matrixInversion.py new file mode 100644 index 0000000..7de9f15 --- /dev/null +++ b/mathgenerator/funcs/matrixInversion.py @@ -0,0 +1,68 @@ +from .__init__ import * + +def matrixInversion(SquareMatrixDimension=3, MaxMatrixElement=99, OnlyIntegerElementsInInvertedMatrix=False): + if OnlyIntegerElementsInInvertedMatrix is True: + isItOk = False + Mat = list() + while (isItOk is False): + Mat = list() + for i in range(0, SquareMatrixDimension): + z = list() + for j in range(0, SquareMatrixDimension): + z.append(0) + z[i] = 1 + Mat.append(z) + MaxAllowedMatrixElement = math.ceil( + pow(MaxMatrixElement, 1 / (SquareMatrixDimension))) + randomlist = random.sample( + range(0, MaxAllowedMatrixElement + 1), SquareMatrixDimension) + + for i in range(0, SquareMatrixDimension): + if i == SquareMatrixDimension - 1: + Mat[0] = [j + (k * randomlist[i]) + for j, k in zip(Mat[0], Mat[i])] + else: + Mat[i + 1] = [j + (k * randomlist[i]) + for j, k in zip(Mat[i + 1], Mat[i])] + + for i in range(1, SquareMatrixDimension - 1): + Mat[i] = [sum(i) + for i in zip(Mat[SquareMatrixDimension - 1], Mat[i])] + + isItOk = True + for i in Mat: + for j in i: + if j > MaxMatrixElement: + isItOk = False + break + if isItOk is False: + break + + random.shuffle(Mat) + Mat = sympy.Matrix(Mat) + Mat = sympy.Matrix.transpose(Mat) + Mat = Mat.tolist() + random.shuffle(Mat) + Mat = sympy.Matrix(Mat) + Mat = sympy.Matrix.transpose(Mat) + + else: + randomlist = list(sympy.primerange(0, MaxMatrixElement + 1)) + plist = random.sample(randomlist, SquareMatrixDimension) + randomlist = random.sample( + range(0, MaxMatrixElement + 1), SquareMatrixDimension * SquareMatrixDimension) + randomlist = list(set(randomlist) - set(plist)) + n_list = random.sample( + randomlist, SquareMatrixDimension * (SquareMatrixDimension - 1)) + Mat = list() + for i in range(0, SquareMatrixDimension): + z = list() + z.append(plist[i]) + for j in range(0, SquareMatrixDimension - 1): + z.append(n_list[(i * SquareMatrixDimension) + j - i]) + random.shuffle(z) + Mat.append(z) + Mat = sympy.Matrix(Mat) + problem = 'Inverse of Matrix ' + str(Mat) + ' is:' + solution = str(sympy.Matrix.inv(Mat)) + return problem, solution \ No newline at end of file diff --git a/mathgenerator/mathgen.py b/mathgenerator/mathgen.py index cdad10d..4a0810c 100644 --- a/mathgenerator/mathgen.py +++ b/mathgenerator/mathgen.py @@ -1,6 +1,7 @@ import random import math import fractions +import sympy from .funcs import * genList = [] @@ -161,3 +162,4 @@ angleBtwVectors=Generator("Angle between 2 vectors", 70, "Angle Between 2 vector absoluteDifference=Generator("Absolute difference between two numbers", 71, "Absolute difference betweeen two numbers a and b =", "|a-b|", absoluteDifferenceFunc) vectorDot = Generator("Dot Product of 2 Vectors", 72, "a . b = ", "c", vectorDotFunc) binary2sComplement = Generator("Binary 2's Complement", 73, "2's complement of 11010110 =", "101010", binary2sComplementFunc) +invertmatrix = Generator("Inverse of a Matrix", 74, "Inverse of a matrix A is", "A^(-1)", matrixInversion)