PageRenderTime 44ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/NerdSharp.Net_Studio/NerdSharp_UberNet/Science/Math/Utils/GeneralMath.cs

https://bitbucket.org/pastageek/scide-cad-scilife
C# | 417 lines | 362 code | 45 blank | 10 comment | 27 complexity | b7d2dcf83ba4c9816e31b4b5b81fc8d4 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Numerics;
  6. using M = System.Math;
  7. using NerdSharp.Net_Studio.NerdSharp_UberNet.Science.Math.TypeLibrary.Numeric;
  8. using NerdSharp.Net_Studio.NerdSharp_UberNet.Science.Math.TypeLibrary.Equation;
  9. using E = NerdSharp.Net_Studio.NerdSharp_UberNet.Science.Math.TypeLibrary.Equation.EquationSide;
  10. using System.Threading;
  11. namespace NerdSharp.Net_Studio.NerdSharp_UberNet.Science.Math.Utils
  12. {
  13. public class Math
  14. {
  15. public enum Signs
  16. {
  17. plus,
  18. minus,
  19. times,
  20. divide,
  21. pow
  22. }
  23. public static ulong[] primeNumbers = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
  24. 31, 37, 41, 43, 43, 47, 53, 61, 67,
  25. 71, 73, 79, 83, 89, 97, 101, 103, 107,
  26. 109, 113, 127, 131, 137, 139, 149, 151, 157,
  27. 163, 167, 173, 179, 181, 191, 193, 197, 199,
  28. 211, 223, 227, 229, 233, 239, 241, 251, 257,
  29. 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373,
  30. 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487,
  31. 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613,
  32. 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739,
  33. 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863,
  34. 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009,
  35. 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097,
  36. 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217,
  37. 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307,
  38. 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447,
  39. 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549,
  40. 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637,
  41. 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759,
  42. 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879,
  43. 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999, 2003,
  44. 2011, 2017, 2027, 2029, 2039, 2053, 2063, 2069, 2081, 2083, 2087, 2089, 2099, 2111, 2113,
  45. 2129, 2131, 2137, 2141, 2143, 2153, 2161, 2179, 2203, 2207, 2213, 2221, 2237, 2239, 2243,
  46. 2251, 2267, 2269, 2273, 2281, 2287, 2293, 2297, 2309, 2311, 2333, 2339, 2341, 2347, 2351,
  47. 2357, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2411, 2417, 2423, 2437, 2441, 2447, 2459,
  48. 2467, 2473, 2477, 2503, 2521, 2531, 2539, 2543, 2549, 2551, 2557, 2579, 2591, 2593, 2609,
  49. 2617, 2621, 2633, 2647, 2657, 2659, 2663, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2707,
  50. 2711, 2713, 2719, 2729, 2731, 2741, 2749, 2753, 2767, 2777, 2789, 2791, 2797, 2801, 2803,
  51. 2819, 2833, 2837, 2843, 2851, 2857, 2861, 2879, 2887, 2897, 2903, 2909, 2917, 2927, 2939,
  52. 2953, 2957, 2963, 2969, 2971, 2999, 3001, 3011, 3019, 3023, 3037, 3041, 3049, 3061, 3067,
  53. 3079, 3083, 3089, 3109, 3119, 3121, 3137, 3163, 3167, 3169, 3181, 3187, 3191, 3203, 3209,
  54. 3217, 3221, 3229, 3251, 3253, 3257, 3259, 3271, 3299, 3301, 3307, 3313, 3319, 3323, 3329,
  55. 3331, 3343, 3347, 3359, 3361, 3371, 3373, 3389, 3391, 3407, 3413, 3433, 3449, 3457, 3461,
  56. 3463, 3467, 3469, 3491, 3499, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3557, 3559,
  57. 3571, 3581, 3583, 3593, 3607, 3613, 3617, 3623, 3631, 3637, 3643, 3659, 3671, 3673, 3677,
  58. 3691, 3697, 3701, 3709, 3719, 3727, 3733, 3739, 3761, 3767, 3769, 3779, 3793, 3797, 3803,
  59. 3821, 3823, 3833, 3847, 3851, 3853, 3863, 3877, 3881, 3889, 3907, 3911, 3917, 3919, 3923,
  60. 3929, 3931, 3943, 3947, 3967, 3989, 4001, 4003, 4007, 4013, 4019, 4021, 4027, 4049, 4051,
  61. 4057, 4073, 4079, 4091, 4093, 4099, 4111, 4127, 4129, 4133, 4139, 4153, 4157, 4159, 4177,
  62. 4201, 4211, 4217, 4219, 4229, 4231, 4241, 4243, 4253, 4259, 4261, 4271, 4273, 4283, 4289,
  63. 4297, 4327, 4337, 4339, 4349, 4357, 4363, 4373, 4391, 4397, 4409, 4421, 4423, 4441, 4447,
  64. 4451, 4457, 4463, 4481, 4483, 4493, 4507, 4513, 4517, 4519, 4523, 4547, 4549, 4561, 4567,
  65. 4583, 4591, 4597, 4603, 4621, 4637, 4639, 4643, 4649, 4651, 4657, 4663, 4673, 4679, 4691,
  66. 4703, 4721, 4723, 4729, 4733, 4751, 4759, 4783, 4787, 4789, 4793, 4799, 4801, 4813, 4817,
  67. 4831, 4861, 4871, 4877, 4889, 4903, 4909, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967,
  68. 4969, 4973, 4987, 4993, 4999, 5003, 5009, 5011, 5021, 5023, 5039, 5051, 5059, 5077, 5081,
  69. 5087, 5099, 5101, 5107, 5113, 5119, 5147, 5153, 5167, 5171, 5179, 5189, 5197, 5209, 5227,
  70. 5231, 5233, 5237, 5261, 5273, 5279, 5281, 5297, 5303, 5309, 5323, 5333, 5347, 5351, 5381,
  71. 5387, 5393, 5399, 5407, 5413, 5417, 5419, 5431, 5437, 5441, 5443, 5449, 5471, 5477, 5479,
  72. 5483, 5501, 5503, 5507, 5519, 5521, 5527, 5531, 5557, 5563, 5569, 5573, 5581, 5591, 5623,
  73. 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5683, 5689, 5693, 5701, 5711, 5717, 5737,
  74. 5741, 5743, 5749, 5779, 5783, 5791, 5801, 5807, 5813, 5821, 5827, 5839, 5843, 5849, 5851,
  75. 5857, 5861, 5867, 5869, 5879, 5881, 5897, 5903, 5923, 5927, 5939, 5953, 5981, 5987, 6007,
  76. 6011, 6029, 6037, 6043, 6047, 6053, 6067, 6073, 6079, 6089, 6091, 6101, 6113, 6121, 6131,
  77. 6133, 6143, 6151, 6163, 6173, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6247, 6257, 6263,
  78. 6269, 6271, 6277, 6287, 6299, 6301, 6311, 6317, 6323, 6329, 6337, 6343, 6353, 6359, 6361,
  79. 6367, 6373, 6379, 6389, 6397, 6421, 6427, 6449, 6451, 6469, 6473, 6481, 6491, 6521, 6529,
  80. 6547, 6551, 6553, 6563, 6569, 6571, 6577, 6581, 6599, 6607, 6619, 6637, 6653, 6659, 6661,
  81. 6673, 6679, 6689, 6691, 6701, 6703, 6709, 6719, 6733, 6737, 6761, 6763, 6779, 6781, 6791,
  82. 6793, 6803, 6823, 6827, 6829, 6833, 6841, 6857, 6863, 6869, 6871, 6883, 6899, 6907, 6911,
  83. 6917, 6947, 6949, 6959, 6961, 6967, 6971, 6977, 6983, 6991, 6997, 7001, 7013, 7019, 7027,
  84. 7039, 7043, 7057, 7069, 7079, 7103, 7109, 7121, 7127, 7129, 7151, 7159, 7177, 7187, 7193,
  85. 7207, 7211, 7213, 7219, 7229, 7237, 7243, 7247, 7253, 7283, 7297, 7307, 7309, 7321, 7331,
  86. 7333, 7349, 7351, 7369, 7393, 7411, 7417, 7433, 7451, 7457, 7459, 7477, 7481, 7487, 7489,
  87. 7499, 7507, 7517, 7523, 7529, 7537, 7541, 7547, 7549, 7559, 7561, 7573, 7577, 7583, 7589,
  88. 7591, 7603, 7607, 7621, 7639, 7643, 7649, 7669, 7673, 7681, 7687, 7691, 7699, 7703, 7717,
  89. 7723, 7727, 7741, 7753, 7757, 7759, 7789, 7793, 7817, 7823, 7829, 7841, 7853, 7867, 7873,
  90. 7877, 7879, 7883, 7901, 7907, 7919 };
  91. #region linear
  92. public static double yMXBFormula(double slope, double x, double b)
  93. {
  94. return (slope * x) + b;
  95. }
  96. public static List<double> yMXBFormula(double slope, List<double> x, double b)
  97. {
  98. List<double> yListAnswer = new List<double>();
  99. for (int i = 0; i < x.Count; i++)
  100. {
  101. yListAnswer.Add((slope * x[i]) + b);
  102. }
  103. return yListAnswer;
  104. }
  105. public static double findSlopeM(double x1, double x2, double y1, double y2)
  106. {
  107. return (y2 - y1) / (x2 - x1);
  108. }
  109. #endregion
  110. public static List<double> FindYArrayPolynom(List<double> coefficients, List<double> x)
  111. {
  112. List<double> yAnswers = new List<double>();
  113. for (int i = 0; i < x.Count; i++)
  114. {
  115. for (int j = 0; j < coefficients.Count; j++)
  116. {
  117. }
  118. }
  119. return yAnswers;
  120. }
  121. public static object[] xQuadratic(double a, double b, double c)
  122. {
  123. object[] answer = new object[2];
  124. double x1 = 0.0d;
  125. double x2 = 0.0d;
  126. double sqrtCheck = (System.Math.Pow(b, 2)) - (4 * a * c);
  127. if (sqrtCheck < 0)
  128. {
  129. sqrtCheck = -1.0d * sqrtCheck;
  130. Complex twoComplex = new Complex(2.0d, 0.0d);
  131. Complex complex = new Complex(0.0d, M.Sqrt(sqrtCheck));
  132. Complex aComplex = new Complex(a, 0.0d);
  133. Complex bComplex = new Complex(b, 0.0d);
  134. Complex cComplex = new Complex(c, 0.0d);
  135. Complex x1complex = new Complex();
  136. Complex x2complex = new Complex();
  137. x1complex = ((-bComplex) + complex) / (twoComplex * aComplex);
  138. x2complex = ((-bComplex) - complex) / (twoComplex * aComplex);
  139. answer[0] = x1complex;
  140. answer[1] = x2complex;
  141. return answer;
  142. }
  143. else
  144. {
  145. x1 = ((-1.0d * b) + M.Sqrt(sqrtCheck)) / (2 * a);
  146. x2 = ((-1.0d * b) - M.Sqrt(sqrtCheck)) / (2 * a);
  147. answer[0] = x1;
  148. answer[1] = x2;
  149. return answer;
  150. }
  151. }
  152. public static List<ulong> PrimeFactorization(ulong number)
  153. {
  154. //http://www.amby.com/educate/math/2-1_fact.html
  155. //uses division by primes
  156. List<ulong> primeFactAnswer = new List<ulong>();
  157. ulong quotientAfterDivByPrime = number;
  158. ulong currentPrimeCount = 1;
  159. while (quotientAfterDivByPrime != 1)
  160. {
  161. ulong currentPrime = primeNumbers[currentPrimeCount];
  162. ulong ulongComparison = quotientAfterDivByPrime / currentPrime;
  163. if (IsDivisibleBy(quotientAfterDivByPrime, currentPrime))
  164. {
  165. quotientAfterDivByPrime = ulongComparison;
  166. primeFactAnswer.Add(currentPrime);
  167. }
  168. else if (!IsDivisibleBy(quotientAfterDivByPrime, currentPrime))
  169. {
  170. currentPrimeCount++;
  171. }
  172. }
  173. return primeFactAnswer;
  174. }
  175. #region Divisibility
  176. public static List<ulong> FindDivisibility(ulong number)
  177. {
  178. List<ulong> answer = new List<ulong>();
  179. for (ulong i = 2; i < number + 1; i++)
  180. {
  181. ulong ulongComparison = number / i;
  182. double doubleCmparison = Convert.ToDouble(number) / Convert.ToDouble(i);
  183. if (Convert.ToDouble(ulongComparison) == doubleCmparison)
  184. {
  185. answer.Add(i);
  186. }
  187. }
  188. return answer;
  189. }
  190. public static bool IsDivisibleBy(ulong dividend, ulong divisor)
  191. {
  192. ulong ulongComparison = dividend / divisor;
  193. double doubleCmparison = Convert.ToDouble(dividend) / Convert.ToDouble(divisor);
  194. if (Convert.ToDouble(ulongComparison) == doubleCmparison)
  195. {
  196. return true;
  197. }
  198. else
  199. {
  200. return false;
  201. }
  202. return false;
  203. }
  204. #endregion
  205. public static void DoNothing() { }
  206. public static float InternalAnglePolygon(float side)
  207. {
  208. return (side - 2) * 180 / side;
  209. }
  210. public static double Sumation(double[] numbers)
  211. {
  212. double sumOfnums = 0.0d;
  213. for (int i = 0; i < numbers.Length; i++)
  214. {
  215. sumOfnums += numbers[i];
  216. }
  217. return sumOfnums;
  218. }
  219. public static double Summation(E equationSide)
  220. {
  221. return 0;
  222. }
  223. #region Cubic
  224. public static double CubicRootX1(double a, double b, double c, double d)
  225. {
  226. //first two parts of the innermost root of part one
  227. double firstInnerRoot_0 = System.Math.Pow((2 * System.Math.Pow(b, 3) - 9 * a * b * c + 27 * System.Math.Pow(a, 2) * d), 2);
  228. double firstInnerRoot_1 = 4 * System.Math.Pow((System.Math.Pow(b, 2) - 3 * a * c), 3);
  229. double innerRoot = System.Math.Sqrt(firstInnerRoot_0 - firstInnerRoot_1);
  230. double outerRoot_0 = 2 * System.Math.Pow(b, 3) - 9 * a * b * c + 27 * System.Math.Pow(a, 2) * d;
  231. double outerRoot = NthRoot((innerRoot + outerRoot_0) / 2, 3);
  232. double firstPart = (-(1 / 3 * a)) * outerRoot;
  233. //secondPart
  234. double secondOuterRoot = NthRoot((innerRoot - outerRoot_0) / 2, 3);
  235. double secondPart = (-(1 / 3 * a)) * secondOuterRoot;
  236. return ((-b) / 3 * a) - firstPart - secondPart;
  237. }
  238. public static Complex CubicRootX2(double a, double b, double c, double d)
  239. {
  240. //makes ready answer and turns nums in form needed
  241. Complex i = new Complex(0, 1);
  242. Complex realOne = new Complex(1, 0);
  243. Complex answer = new Complex();
  244. //firstPart
  245. Complex firstPiece = new Complex(((-b) / 3 * a), 0);
  246. //secondPart
  247. Complex secondPiece = i * realOne;
  248. Complex innerRoot = new Complex();
  249. //thirdPart
  250. Complex thirdPiece = new Complex();
  251. Complex outerRoot = new Complex();
  252. //completes the final answer
  253. answer = firstPiece + secondPiece + thirdPiece;
  254. return answer;
  255. }
  256. public static double CubicRootX3(double a, double b, double c, double d)
  257. {
  258. return ((-b) / 3 * a);
  259. }
  260. public static object[] FindCubicsXVal(double a, double b, double c, double d, bool useMultiThreading)
  261. {
  262. object[] answer = new object[3];
  263. if (useMultiThreading)
  264. {
  265. ThreadStart job = new ThreadStart(X1Job);
  266. Thread t = new Thread(job);
  267. return answer;
  268. }
  269. else
  270. {
  271. answer[0] = CubicRootX1(a, b, c, d);
  272. //answer[1] = CubicRootX2(a, b, c, d);
  273. answer[2] = CubicRootX3(a, b, c, d);
  274. return answer;
  275. }
  276. }
  277. public static void X1Job()
  278. {
  279. }
  280. public static double CubicRootX1Monic(double a, double b, double c)
  281. {
  282. double firstRoot;
  283. double secondRoot;
  284. return -(a / 3);
  285. }
  286. public static object[] CubicYVals(object[] xVals)
  287. {
  288. object[] answer = new object[3];
  289. for (int i = 0; i < answer.Length; i++)
  290. {
  291. }
  292. return answer;
  293. }
  294. #endregion
  295. public static double NthRoot(double x, double index)
  296. {
  297. if (index == 0)
  298. {
  299. throw new DivideByZeroException("The zeroth root is the same as dividing by zero. Cannot perform operation.");
  300. }
  301. else
  302. {
  303. return System.Math.Pow(x, 1 / index);
  304. }
  305. return double.NaN;
  306. }
  307. public static double Product(double[] input)
  308. {
  309. double answer = 1.0d;
  310. for (int i = 0; i < input.Length; i++)
  311. {
  312. answer *= input[i];
  313. }
  314. return answer;
  315. }
  316. public static double NewtonsMethod(Function function, double x0, long iterations)
  317. {
  318. double xn = x0;
  319. for (int i = 0; i < iterations; i++)
  320. {
  321. }
  322. return xn;
  323. }
  324. public static BigDecimal E(BigInteger iterations)
  325. {
  326. BigDecimal answer = new BigDecimal();
  327. return answer;
  328. }
  329. public static long Factorial(long n)
  330. {
  331. long answer = 1;
  332. for (long i = n; i > 1; i--)
  333. {
  334. answer *= i;
  335. }
  336. return answer;
  337. }
  338. public static BigInteger Factorial(BigInteger n)
  339. {
  340. BigInteger answer = 1;
  341. for (BigInteger i = n; i > 1; i--)
  342. {
  343. answer *= i;
  344. }
  345. return answer;
  346. }
  347. public static long BinomialCoeffecient(long n, long k)
  348. {
  349. if (k <= 0)
  350. {
  351. throw new ArgumentException("");
  352. }
  353. if (n <= k)
  354. {
  355. throw new ArgumentException("");
  356. }
  357. return Factorial(n) / (Factorial(k) * Factorial(n - k));
  358. }
  359. public static BigInteger BinomialCoeffecient(BigInteger n, BigInteger k)
  360. {
  361. if (k <= 0)
  362. {
  363. throw new ArgumentException("");
  364. }
  365. if (n <= k)
  366. {
  367. throw new ArgumentException("");
  368. }
  369. return Factorial(n) / (Factorial(k) * Factorial(n - k));
  370. }
  371. }
  372. }