From d9ca4f69b5b018a459f7a20861a87ef250e315ee Mon Sep 17 00:00:00 2001 From: Mahan Madani <93105700+mahan-m47@users.noreply.github.com> Date: Fri, 17 May 2024 23:05:19 +0330 Subject: [PATCH 1/2] pi number --- .../java/sbu/cs/CalculatePi/PiCalculator.java | 109 +++++++++++++++++- src/main/java/sbu/cs/CalculatePi/Report.md | 25 ++++ src/main/java/sbu/cs/CalculatePi/img.png | Bin 0 -> 6346 bytes .../java/sbu/cs/Semaphore/Controller.java | 1 - 4 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 src/main/java/sbu/cs/CalculatePi/Report.md create mode 100644 src/main/java/sbu/cs/CalculatePi/img.png diff --git a/src/main/java/sbu/cs/CalculatePi/PiCalculator.java b/src/main/java/sbu/cs/CalculatePi/PiCalculator.java index 3ebc56c..f9c5abe 100644 --- a/src/main/java/sbu/cs/CalculatePi/PiCalculator.java +++ b/src/main/java/sbu/cs/CalculatePi/PiCalculator.java @@ -1,5 +1,12 @@ package sbu.cs.CalculatePi; +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + public class PiCalculator { /** @@ -11,17 +18,113 @@ public class PiCalculator { * Create as many classes and threads as you need. * Your code must pass all of the test cases provided in the test folder. - * @param floatingPoint the exact number of digits after the floating point + * @param "floatingPoint" the exact number of digits after the floating point * @return pi in string format (the string representation of the BigDecimal object) */ - public String calculate(int floatingPoint) + public static class Calculatepi implements Runnable { + int n; + MathContext mc = new MathContext(10000); + public Calculatepi (int n) { + this.n = n; + } + @Override + public void run() { + BigDecimal sign = new BigDecimal(1); + if (n%2 == 1) { + sign = new BigDecimal(-1); + } + //BigDecimal n = new BigDecimal(m); + BigDecimal numerator = new BigDecimal(1); + BigDecimal denominator = new BigDecimal(1); + BigDecimal a = factorial(6*n); + BigDecimal b = new BigDecimal((545140134*n)+13591409); + numerator = numerator.multiply(sign,mc); + numerator = numerator.multiply(a,mc); + numerator = numerator.multiply(b,mc); + BigDecimal c = factorial(3*n); + BigDecimal d =factorial(n); + d = d.pow(3); + BigDecimal e = new BigDecimal(640320); + e = e.pow(3*n); + BigDecimal f = new BigDecimal(640320); + f = f.pow(3); + MathContext g = new MathContext(10000); + f = f.sqrt(g); + denominator = denominator.multiply(c,mc); + denominator = denominator.multiply(d,mc); + denominator = denominator.multiply(e,mc); + denominator = denominator.multiply(f,mc); + + MathContext mc = new MathContext(10000); + BigDecimal result = numerator.divide(denominator, mc); + addTosum(result); + } + public BigDecimal factorial(int k) { + BigDecimal temp = new BigDecimal(1); + for (int i = 1; i <= k; i++) { + temp = temp.multiply(new BigDecimal(i)); + } + return temp; + } + } + public static BigDecimal sum; + + public static synchronized void addTosum(BigDecimal value) { + sum = sum.add(value); + } + public static String calculate(int floatingPoint) { // TODO - return null; + //MathContext mc = new MathContext(floatingPoint); + ExecutorService threadpool = Executors.newFixedThreadPool(10); + sum = new BigDecimal(0); + + for (int i = 0; i < 1000; i++) { + Calculatepi task = new Calculatepi(i); + threadpool.execute(task); + } + threadpool.shutdown(); + + try { + threadpool.awaitTermination(1000000, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + BigDecimal factor = new BigDecimal(12); + MathContext mc = new MathContext(10000); + sum = sum.multiply(factor,mc); + sum = sum.pow(-1, mc); + sum = sum.setScale(floatingPoint, RoundingMode.DOWN); + String pi = String.valueOf(sum); + pi = pi.substring(0,floatingPoint+2); + return pi; } public static void main(String[] args) { // Use the main function to test the code yourself + /*ExecutorService threadpool = Executors.newFixedThreadPool(6); + sum = new BigDecimal(0); + + for (int i = 0; i < 1000; i++) { + Calculatepi task = new Calculatepi(i); + threadpool.execute(task); + } + threadpool.shutdown(); + + try { + threadpool.awaitTermination(100000, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + BigDecimal factor = new BigDecimal(12); + MathContext mc = new MathContext(10000); + sum = sum.multiply(factor); + sum = sum.pow(-1, mc); + sum = sum.setScale(2, RoundingMode.DOWN); + String pi = String.valueOf(sum); + System.out.println(pi); +*/ + } } diff --git a/src/main/java/sbu/cs/CalculatePi/Report.md b/src/main/java/sbu/cs/CalculatePi/Report.md new file mode 100644 index 0000000..3dbf4c9 --- /dev/null +++ b/src/main/java/sbu/cs/CalculatePi/Report.md @@ -0,0 +1,25 @@ +## PiCalculator + +Among the sites, 7learn.com site explained 4 algorithms well + +* Monte-Carlo method to calculate pi + +* A calculation method for the Pi number + +* The infinite sum method in calculating Pi + +* An improved infinite sum method for calculating Pi + +Among these four algorithms, the last algorithm was the most optimal and accurate algorithm + +## About this algorithm: +### Chudnovsky algorithm + +Ramanujan wrote two formulas to calculate pi. The Chanowski brothers, +Gregory (1952) and Dioud (1947) improved Ramanujan's early formulas. + +![img.png](img.png) + +The Chudnovsky algorithm is a fast method for calculating the digits of π, based on Ramanujan's π formulae. Published by the Chudnovsky brothers in 1988, it was used to calculate π to a billion decimal places. + +It was used in the world record calculations of 2.7 trillion digits of π in December 2009, 10 trillion digits in October 2011, 22.4 trillion digits in November 2016, 31.4 trillion digits in September 2018–January 2019, 50 trillion digits on January 29, 2020, 62.8 trillion digits on August 14, 2021, 100 trillion digits on March 21, 2022, and 105 trillion digits on March 14, 2024. \ No newline at end of file diff --git a/src/main/java/sbu/cs/CalculatePi/img.png b/src/main/java/sbu/cs/CalculatePi/img.png new file mode 100644 index 0000000000000000000000000000000000000000..dcd74cfdab26e18065f463be9b41ee590af3cd49 GIT binary patch literal 6346 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 NfV7RZYBe09{s#?ZgysMM literal 0 HcmV?d00001 diff --git a/src/main/java/sbu/cs/Semaphore/Controller.java b/src/main/java/sbu/cs/Semaphore/Controller.java index ff27df4..b29365e 100644 --- a/src/main/java/sbu/cs/Semaphore/Controller.java +++ b/src/main/java/sbu/cs/Semaphore/Controller.java @@ -35,7 +35,6 @@ public static void main(String[] args) { TODO Use a Semaphore to solve the synchronization problem. Every time a thread accesses the resource, print its Name and the current System Time. - Combine the 4 resulting blocks to create the final matrix product and return it. */ } From 5a8f548b5256c8a7add6ee4f27538ab4c5df4e6c Mon Sep 17 00:00:00 2001 From: Mahan Madani <93105700+mahan-m47@users.noreply.github.com> Date: Fri, 17 May 2024 23:05:19 +0330 Subject: [PATCH 2/2] finish --- .idea/.gitignore | 3 + .idea/gradle.xml | 18 +++ .idea/misc.xml | 5 + .idea/vcs.xml | 6 + ...ent-Advanced-Multithreading - Shortcut.lnk | Bin 0 -> 1239 bytes .../java/sbu/cs/CalculatePi/PiCalculator.java | 109 +++++++++++++++++- src/main/java/sbu/cs/CalculatePi/Report.md | 33 ++++++ src/main/java/sbu/cs/CalculatePi/img.png | Bin 0 -> 6346 bytes .../java/sbu/cs/Semaphore/Controller.java | 13 ++- src/main/java/sbu/cs/Semaphore/Operator.java | 30 +++-- 10 files changed, 205 insertions(+), 12 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 Sixth-Assignment-Advanced-Multithreading - Shortcut.lnk create mode 100644 src/main/java/sbu/cs/CalculatePi/Report.md create mode 100644 src/main/java/sbu/cs/CalculatePi/img.png diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..58144a2 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..172986e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Sixth-Assignment-Advanced-Multithreading - Shortcut.lnk b/Sixth-Assignment-Advanced-Multithreading - Shortcut.lnk new file mode 100644 index 0000000000000000000000000000000000000000..683ad2421bd99209fa64889a703eade6c9225c7c GIT binary patch literal 1239 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 NfV7RZYBe09{s#?ZgysMM literal 0 HcmV?d00001 diff --git a/src/main/java/sbu/cs/Semaphore/Controller.java b/src/main/java/sbu/cs/Semaphore/Controller.java index ff27df4..667531c 100644 --- a/src/main/java/sbu/cs/Semaphore/Controller.java +++ b/src/main/java/sbu/cs/Semaphore/Controller.java @@ -1,7 +1,11 @@ package sbu.cs.Semaphore; +import java.util.concurrent.Semaphore; + public class Controller { + public static final Semaphore sem = new Semaphore(2); + /** * A number of operators are trying to access a resource in parallel to each other. * A maximum of 2 operators should access the resource concurrently. Once 2 operators have entered @@ -18,7 +22,7 @@ public class Controller { * Note that every time a thread accesses the resource, you must print its Name and the System Time. */ - public static void main(String[] args) { + public static void main(String[] args) throws InterruptedException { Operator operator1 = new Operator("operator1"); Operator operator2 = new Operator("operator2"); Operator operator3 = new Operator("operator3"); @@ -35,8 +39,13 @@ public static void main(String[] args) { TODO Use a Semaphore to solve the synchronization problem. Every time a thread accesses the resource, print its Name and the current System Time. - Combine the 4 resulting blocks to create the final matrix product and return it. */ + operator1.join(); + operator2.join(); + operator3.join(); + operator4.join(); + operator5.join(); + } } diff --git a/src/main/java/sbu/cs/Semaphore/Operator.java b/src/main/java/sbu/cs/Semaphore/Operator.java index 33613e6..3baf2ae 100644 --- a/src/main/java/sbu/cs/Semaphore/Operator.java +++ b/src/main/java/sbu/cs/Semaphore/Operator.java @@ -1,5 +1,8 @@ package sbu.cs.Semaphore; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + public class Operator extends Thread { public Operator(String name) { @@ -8,14 +11,27 @@ public Operator(String name) { @Override public void run() { - for (int i = 0; i < 10; i++) - { - Resource.accessResource(); // critical section - a Maximum of 2 operators can access the resource concurrently - try { - sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); + try { + Controller.sem.acquire(); + for (int i = 0; i < 10; i++) { + Resource.accessResource(); // critical section - a Maximum of 2 operators can access the resource concurrently + try { + sleep(500); + } + catch (InterruptedException e) { + e.printStackTrace(); + } } + LocalTime currentTime = LocalTime.now (); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern ("HH:mm:ss"); + System.out.println (Thread.currentThread ().getName () + " accessed the resource at " + currentTime.format (formatter)); + } + catch (InterruptedException e) { + System.out.println(e.getMessage()); + } + finally { + Controller.sem.release(); } } }