commit 4210f632d7fdaed4e19c95e4d7c20403066f48d1 Author: Lukasz M Date: Thu Mar 24 18:41:44 2022 +0100 initial version of linalg-practice program with mult feature diff --git a/linalg-practice.py b/linalg-practice.py new file mode 100644 index 0000000..9066aca --- /dev/null +++ b/linalg-practice.py @@ -0,0 +1,71 @@ +import sympy as sp +import time +import random + +# in function to take arbitrary matrix input from user +def inmat(rowcol) : + # initialise list of lists + mat=[[]]*rowcol + # take input from user into list + print("Enter line by line with entries separated by space:") + for i in range(rowcol): + mat[i]=input().split(" ") + for j in range(len(mat[i])) : + # convert list using nsimplify in order to take rational number symbolically + mat[i][j] = sp.nsimplify(mat[i][j]) + return mat + +# multcheck function to check if two matrices are multiplied together +def multcheck(a, b, rowcol, intmax) : + sp.pprint(b) + print("Multiply these two matrices together") + # return bool based on if input equals the two matrices multiplied together + return (sp.Matrix(inmat(rowcol)) == a*b) + +# practice function +def practice(t) : + count = 0 + rowcol = int(input("What size of matrix do you want to practice with? ")) + intmax = int(input("What maximum size of integer do you want the matrix to be made out of? ")) + dif = float(input("What difficulty (probability for a matrix of rational values between 0, 1) do you want? ")) + + # choose the function of the program that you want + if t == "mult" : + f = multcheck + else : + exit() + + # initialise time measurement + tic = time.perf_counter() + + # infinite loop of practice + while True : + # generate a random matrices + a = sp.randMatrix(rowcol, rowcol, 0, intmax) + b = sp.randMatrix(rowcol, rowcol, 0, intmax) + + # if determinant non-zero, radnom value less than difficulty, set a to its inverse + if a.det() != 0 and random.random() <= dif : + a = a.inv() + + # infinite loop until user succeeds + while True : + sp.pprint(a) + # if return of function is True + if f(a, b, rowcol, intmax) : + # take time interval + toc = time.perf_counter() + tictoc=toc-tic + # increment count + count += 1 + # print success message + print("Correct! You have solved", count, "problems in %.2f seconds" %tictoc) + break + else : + # print failure message + print("Try again") + continue + +# take input from user on the type of practice they want to do +t = input("What do you want to practice? (mult, det, inv, eig) ") +practice(t)