Advertisement
Guest User

Untitled

a guest
Dec 10th, 2016
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.41 KB | None | 0 0
  1. package solution;
  2.  
  3. import java.math.BigInteger;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. public class ChineaseRemainder {
  8.  
  9. public static void main(String[] args) {
  10. List<BigInteger> n = new ArrayList<>();
  11. List<BigInteger> a = new ArrayList<>();
  12. List<BigInteger> b = new ArrayList<>();
  13.  
  14. n.add(new BigInteger("12"));
  15. n.add(new BigInteger("5"));
  16. n.add(new BigInteger("11"));
  17. n.add(new BigInteger("19"));
  18. n.add(new BigInteger("29"));
  19. n.add(new BigInteger("17"));
  20.  
  21. a.add(new BigInteger("19"));
  22. a.add(new BigInteger("13"));
  23. a.add(new BigInteger("31"));
  24. a.add(new BigInteger("53"));
  25. a.add(new BigInteger("97"));
  26. a.add(new BigInteger("123"));
  27.  
  28. b.add(new BigInteger("11"));
  29. b.add(new BigInteger("29"));
  30. b.add(new BigInteger("34"));
  31. b.add(new BigInteger("47"));
  32. b.add(new BigInteger("101"));
  33. b.add(new BigInteger("131"));
  34.  
  35. // BigInteger A = chineaseRemainder(a, n);
  36. // BigInteger B = chineaseRemainder(b, n);
  37. BigInteger A = new BigInteger("1");
  38. BigInteger B = new BigInteger("1");
  39. for(int i = 0; i < a.size(); i++) {
  40. A = A.multiply(a.get(i));
  41. B = B.multiply(b.get(i));
  42. }
  43.  
  44. System.out.println("A = " + A);
  45. System.out.println("B = " + B);
  46.  
  47. System.out.println("A + B = " + A.add(B));
  48. System.out.println("A * B = " + A.multiply(B));
  49.  
  50. List<BigInteger> sum = new ArrayList<>();
  51. List<BigInteger> product = new ArrayList<>();
  52.  
  53. for(int i = 0; i < a.size(); i++) {
  54. sum.add(a.get(i).add(b.get(i)));
  55. product.add(a.get(i).multiply(b.get(i)));
  56. }
  57.  
  58. BigInteger addRes = chineaseRemainder(sum, n);
  59. BigInteger multiplyRes = chineaseRemainder(product, n);
  60.  
  61. System.out.println("A + B = " + addRes);
  62. System.out.println("A * B = " + multiplyRes);
  63. }
  64.  
  65. /**
  66. * Gets A which is mapped to a1, a2, ....., ak
  67. * @param a the mapping of A
  68. * @param lowerCaseNumbers the list m1, m2, m3 ....., mk
  69. * @return A which is mapped to a1, a2, ....., ak and satisfies the following
  70. * for every i = 1 to k : A = ai (mod mi)
  71. */
  72. static BigInteger chineaseRemainder(List<BigInteger> a, List<BigInteger> lowerCaseNumbers) {
  73. BigInteger sum = new BigInteger("0");
  74.  
  75. // The product of all lower case numbers M = m1 * m2 * ....... * mk
  76. BigInteger capitalM = new BigInteger("1");
  77. for(int i = 0; i < lowerCaseNumbers.size(); i++) {
  78. capitalM = capitalM.multiply(lowerCaseNumbers.get(i));
  79. }
  80.  
  81. ExtendedEuclids ex = new ExtendedEuclids();
  82. for(int i = 0; i < lowerCaseNumbers.size(); i++) {
  83. // Mi which is equal to M/mi
  84. BigInteger upperCaseNumber = capitalM.divide(lowerCaseNumbers.get(i));
  85.  
  86. // The multiplicative inverse of Mi (mod mi)
  87. BigInteger mulInverse = ex.mulInverse(upperCaseNumber, lowerCaseNumbers.get(i));
  88.  
  89. // The summation formula for the inverse mapping
  90. sum = sum.add(((a.get(i)).multiply(upperCaseNumber)).multiply(mulInverse));
  91. }
  92. return sum.mod(capitalM);
  93. }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement