From cc5a88398281934b8569fd8c925f4e489bed90ec Mon Sep 17 00:00:00 2001 From: Hubert Tylkowski Date: Fri, 29 Jun 2018 12:30:53 +0200 Subject: [PATCH] Added Polynomial class and basic math operations --- .../com/tylkowski/ilorazy/Main.class | Bin 719 -> 734 bytes .../com/tylkowski/ilorazy/Polynomial.class | Bin 0 -> 7142 bytes .../tylkowski/ilorazy/QuotientRingTask.class | Bin 0 -> 826 bytes .../src/com/tylkowski/ilorazy/Main.java | 2 +- .../src/com/tylkowski/ilorazy/Polynomial.java | 189 ++++++++++++++++++ .../tylkowski/ilorazy/QuotientRingTask.java | 12 ++ 6 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 Zadanie-04/out/production/Zadanie-04/com/tylkowski/ilorazy/Polynomial.class create mode 100644 Zadanie-04/out/production/Zadanie-04/com/tylkowski/ilorazy/QuotientRingTask.class create mode 100644 Zadanie-04/src/com/tylkowski/ilorazy/Polynomial.java create mode 100644 Zadanie-04/src/com/tylkowski/ilorazy/QuotientRingTask.java diff --git a/Zadanie-04/out/production/Zadanie-04/com/tylkowski/ilorazy/Main.class b/Zadanie-04/out/production/Zadanie-04/com/tylkowski/ilorazy/Main.class index 5a946d09e93d9ba0562dc2e1c64ec5fb8a48d7a6..a2a04960e1937db292936ae8ca598c14e859bb08 100644 GIT binary patch literal 734 zcmZ`%+fKqj5Ix%hm5Ksh5$_ia@?aC=o5mLt6OwvCjfwGT!3{2yu9l*~zw!yAi67uc z8E4Ui1Zy8=dd|+AnLXLhueT2XyV$fbf}Djp3way!Sg>JY(T0H~3(FQ(7!v!^m*D|} zS=_o}h#jh1!H{;PFHSnGst7K5)gxxYRWl}0G?~!JUGQ&*q#%=IN?s(jI5}$B=r@NdY^5*LJCRP44ctw59=_jL>HbZuj{LpvZvLzz*ImwI3?{o@qHM4vPryA=*&+eCNN1TM}kwBrbss>Y+&{q&Zn|X literal 719 zcmZ`%T~8B16g{`QblY|Lu%&{4Knv=&iklGMFg`%SQ~5}0nh>9+?W7Lu?ljx2rv58^ zD2XQi0DqL>&O!o6nTLC3&b{~CkIdhHzy1Jtj~y2-mWz0f6$h&>EG!$dR=^8`>n=91 z>7eSMM#z6qu}VJ@EWh3+*ax~N3G+=A%i~ehk;x~~37IK1bytLKktp-NA?@^w8WPr; zT^$AKIK0r`h8HSOp-#m2ad0G5yvLdmBjK6_5> zn6PjwcG5YQ-Si&S8V^$$@xJtk9hK{mlnzdLo|LDOBI23zVla?#kFeuU8TtWr(=I0# zQhmJ|!lGY)5XcebtiAgc3C_UO4|&g(X%*Y3qR8LEoE*q(kL@hK0!Ct-XoZVQ0SDPvm~XI=h73uy!YyDdpKTY;&E!nV@j1>~aG} TzY6D$dJT)HFwg&lZ4OIU#J-~J diff --git a/Zadanie-04/out/production/Zadanie-04/com/tylkowski/ilorazy/Polynomial.class b/Zadanie-04/out/production/Zadanie-04/com/tylkowski/ilorazy/Polynomial.class new file mode 100644 index 0000000000000000000000000000000000000000..8b3c863e014aa35d01f67d563a6c3ebf84257790 GIT binary patch literal 7142 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 literal 0 HcmV?d00001 diff --git a/Zadanie-04/out/production/Zadanie-04/com/tylkowski/ilorazy/QuotientRingTask.class b/Zadanie-04/out/production/Zadanie-04/com/tylkowski/ilorazy/QuotientRingTask.class new file mode 100644 index 0000000000000000000000000000000000000000..32f30b35e8f85e849c6cc3a6f14e90f18cb66753 GIT binary patch literal 826 zcmah{YfBqJ6g{)qxN%)yv59ScBtDyHbP@V3rBDh&AwDC4Qv5K9i;kJy37grL_^_sXRTrw=zS}OE)Pqx*!Zd>?5s+eE({KLOFRfdswA`<#N!&+&0dbz=1 ze^h4y!(>fF!G01pgZP9uC3&(n)#9?jV`27xoVLCYU54kdj}oOt5b0wPouBY-n+VxP zLVuz{x2}@773>OgLhf<;_9g$yJ&a?Op*Tz|gY#vlLgUm_ta(_+8xJL{Iw*VCz@~$W zhb?R~tUrzQ_;`jXL%^3jI`!Y~%9vqY*7am)#JfK$EK)j>#{R6@*heM&<4hr~w{tAK~p@tFsv|GTMK9g`#@ zsvFeOmsu@0u!K>1nE<1wI0o-w#i+9r*OX#mifo<=00%ZQm?7|4f?p)yY4R5PP{>lmd polynomial, int modulo) { + this.polynomial = polynomial.stream().mapToInt(i -> i).toArray(); + this.modulo = modulo; + } + + public int getModulo() { + return modulo; + } + + int getSize() { + return polynomial.length; + } + + private int[] parsePolynomialString(String poly) { + poly = poly.substring(1, poly.length() - 1); + return Arrays.stream(poly.split(",\\s*")).map(String::trim).mapToInt(Integer::parseInt).toArray(); + } + + public List asList() { + return Arrays.stream(polynomial).boxed().collect(Collectors.toList()); + } + + public int[] asArray(List list) { + return list.stream().mapToInt(i -> i).toArray(); + } + + public Polynomial add(Polynomial polyTwo) { + int size = Math.max(polynomial.length, polyTwo.getSize()); + int[] result = new int[size]; + for (int i = 0; i < size; i++) { + int res = 0; + if (i >= polynomial.length) { + res = polyTwo.valueAt(i); + } + if (i >= polyTwo.getSize()) { + res = polynomial[i]; + } + if (i < polynomial.length && i< polyTwo.getSize()) { + res = polynomial[i] + polyTwo.valueAt(i); + } + result[i] = res; + } + return new Polynomial(result, modulo); + } + + public Polynomial subtract(Polynomial polyTwo) { + int[] result = new int[polynomial.length]; + for (int i = 0; i < polynomial.length; i++) { + result[i] = polynomial[i] - polyTwo.valueAt(i); + } + return new Polynomial(result, modulo); + } + + public Polynomial multiply(Polynomial multiplyPolynomial) { + int[] multiplied = new int[polynomial.length + multiplyPolynomial.getSize() - 1]; + int sizeOfFirstPoly = polynomial.length; + int sizeOfSecondPoly = multiplyPolynomial.getSize(); + for (int i = 0; i < sizeOfFirstPoly; i++) { + for (int j = 0; j < sizeOfSecondPoly; j++) + multiplied[i + j] = (multiplied[i + j] + (polynomial[i] * multiplyPolynomial.valueAt(j))); + } + return new Polynomial(multiplied, modulo); + } + + public Polynomial divide(Polynomial polyTwo) { + int[] poly = polynomial; + if (poly.length < polyTwo.getSize()) { + return null; + } + int firstPolyDeg = poly.length - 1; + int secondPolyDeg = polyTwo.getSize() - 1; + int[] tempArr = new int[poly.length]; + int[] result; + fillTemporaryArray(polyTwo.getPolynomialArray(), tempArr); + int tempMultiplier; + int shift = 0; + while (firstPolyDeg >= secondPolyDeg) { + parseNegativeElement(poly, firstPolyDeg); + tempMultiplier = findMultiplier(poly[firstPolyDeg], polyTwo.valueAt(secondPolyDeg)); + tempArr = shiftValuesInArray(tempArr, shift); + tempArr = multiplyPolynomialByNumber(tempArr, tempMultiplier); + tempArr = moduloArray(tempArr); + poly = subtract(new Polynomial(tempArr, modulo)).getPolynomialArray(); + firstPolyDeg--; + shift++; + } + result = Arrays.copyOf(poly, shift - 1); + return new Polynomial(result, modulo); + } + + public int valueAt(int index) { + return polynomial[index]; + } + + public void moduloPoly() { + for (int i = 0; i < polynomial.length; i++) { + polynomial[i] = polynomial[i] % modulo; + } + } + + public int[] moduloArray(int[] poly) { + for (int i = 0; i < poly.length; i++) { + poly[i] = poly[i] % modulo; + } + return poly; + } + + private Polynomial multiplyPolynomialByNumber(int multiplier) { + for (int i = 0; i < polynomial.length; i++) { + polynomial[i] = polynomial[i] * multiplier; + } + return new Polynomial(polynomial, modulo); + } + + private int[] multiplyPolynomialByNumber(int[] poly, int multiplier) { + for (int i = 0; i < poly.length; i++) { + poly[i] = poly[i] * multiplier; + } + return poly; + } + + + public int[] getPolynomialArray() { + return polynomial; + } + + private int[] shiftValuesInArray(int[] array, int amount) { + if (amount == 0) { + return array; + } else { + int[] res = new int[array.length]; + System.arraycopy(array, amount, res, 0, array.length - amount); + for (int j = array.length - amount + 1; j < res.length; j++) { + res[j] = 0; + } + return res; + } + } + + + private int findMultiplier(int a, int b) { + for (int i = 0; i < modulo; i++) { + if (a == (b * i) % modulo) { + return i; + } + } + return -1; + } + + private void fillTemporaryArray(int[] polyTwo, int[] tempArr) { + for (int i = 0; i < polyTwo.length; i++) { + tempArr[tempArr.length - 1 - i] = polyTwo[polyTwo.length - 1 - i]; + } + } + + private void parseNegativeElement(int[] polyOne, int polyDeg) { + while (polyOne[polyDeg] < 0) { + polyOne[polyDeg] = modulo + polyOne[polyDeg]; + } + } + + @Override + public String toString() { + return "Polynomial{" + + "polynomial=" + Arrays.toString(polynomial) + + ", modulo=" + modulo + + '}'; + } +} diff --git a/Zadanie-04/src/com/tylkowski/ilorazy/QuotientRingTask.java b/Zadanie-04/src/com/tylkowski/ilorazy/QuotientRingTask.java new file mode 100644 index 0000000..c0cce8b --- /dev/null +++ b/Zadanie-04/src/com/tylkowski/ilorazy/QuotientRingTask.java @@ -0,0 +1,12 @@ +package com.tylkowski.ilorazy; + +public class QuotientRingTask { + + private Polynomial polynomial; + + public QuotientRingTask(Polynomial poly) { + + } + + +}