maxrusmos

Untitled

Apr 11th, 2020
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.61 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Collections;
  5. using System.Linq;
  6. using MatrixOp;
  7.  
  8. namespace PolynomOp {
  9. class Polynom<T>: ICloneable, IEnumerable, IEnumerable<T>, IComparable, IComparable<Polynom<T>> where T : IComparable, new(){
  10.  
  11. private Dictionary<int, T> _polynomDictionary = new Dictionary<int, T>();
  12.  
  13. public Polynom() { }
  14.  
  15. public Polynom(int power, params T[] koefArr) {
  16. for (int i = power; i >= 0; i--) {
  17. _polynomDictionary.Add(i, koefArr[power - i]);
  18. }
  19. }
  20.  
  21. public Polynom(T[] koefArr) {
  22. for (int i = koefArr.Length - 1; i >= 0; i--) {
  23. _polynomDictionary.Add(i, koefArr[koefArr.Length - 1 - i]);
  24. }
  25. }
  26.  
  27. public Polynom(Dictionary<int, T> dict) {
  28. foreach (var kvp in dict) {
  29. _polynomDictionary.Add(kvp.Key, kvp.Value);
  30. }
  31. }
  32.  
  33. IEnumerator IEnumerable.GetEnumerator() {
  34. return _polynomDictionary.Values.GetEnumerator();
  35. }
  36.  
  37. IEnumerator<T> IEnumerable<T>.GetEnumerator() {
  38. return _polynomDictionary.Values.GetEnumerator();
  39. }
  40.  
  41. public object Clone() {
  42. Dictionary<int, T > cloneDictionary = new Dictionary<int, T>(_polynomDictionary.Count);
  43. foreach (var kvp in _polynomDictionary) {
  44. cloneDictionary.Add(kvp.Key, kvp.Value);
  45. }
  46. return cloneDictionary;
  47. }
  48.  
  49. public int CompareTo(Polynom<T> A) {
  50. return _polynomDictionary.Keys.Max().CompareTo(A._polynomDictionary.Keys.Max());
  51. }
  52.  
  53. int IComparable.CompareTo(object obj) {
  54. if (obj is null) {
  55. throw new ArgumentNullException("NULL", nameof(obj));
  56. }
  57. if (!(obj is Polynom<T>)) {
  58. throw new ArgumentException("Это не полином", nameof(obj));
  59. }
  60. return CompareTo((Polynom<T>)obj);
  61. }
  62.  
  63. //Словарь из нулей
  64. private static Dictionary<int, T> MakeZeroDict(Polynom<T> A) {
  65. var resultDictionary = new Dictionary<int, T>(A._polynomDictionary.Count);
  66. foreach (var kvp in A._polynomDictionary) {
  67. resultDictionary.Add(kvp.Key, new T());
  68. }
  69. return resultDictionary;
  70. }
  71.  
  72. //наибольший полином из двух
  73. private static Polynom<T> SearchMaxPolynom(Polynom<T> A, Polynom<T> B) {
  74. if (A.CompareTo(B) < 0) {
  75. return B;
  76. } else if (A.CompareTo(B) > 0) {
  77. return A;
  78. } else {
  79. return A;
  80. }
  81. }
  82.  
  83. //наимеьший полином из двух
  84. private static Polynom<T> SearchMinPolynom(Polynom<T> A, Polynom<T> B) {
  85. if (A.CompareTo(B) < 0) {
  86. return A;
  87. } else if (A.CompareTo(B) > 0) {
  88. return B;
  89. } else {
  90. return A;
  91. }
  92. }
  93.  
  94. //сумма полиномов
  95. public static Polynom<T> PolynomSum(Polynom<T> A, Polynom<T> B) {
  96. var maxPolynom = SearchMaxPolynom(A, B);
  97. var resultPolynom = new Polynom<T>(MakeZeroDict(maxPolynom));
  98. for (int i = 0; i < maxPolynom._polynomDictionary.Count; i++) {
  99. if (SearchMinPolynom(A, B)._polynomDictionary.ContainsKey(i)) {
  100. resultPolynom._polynomDictionary[i] = (dynamic)A._polynomDictionary[i] + B._polynomDictionary[i];
  101. } else {
  102. resultPolynom._polynomDictionary[i] = maxPolynom._polynomDictionary[i];
  103. }
  104. }
  105. return resultPolynom;
  106. }
  107.  
  108. public static Polynom<T> operator +(Polynom<T> A, Polynom<T> B) {
  109. return PolynomSum(A, B);
  110. }
  111.  
  112. //разность полиномов
  113. public static Polynom<T> PolynomDifference(Polynom<T> A, Polynom<T> B) {
  114. var maxPolynom = SearchMaxPolynom(A, B);
  115. var resultPolynom = new Polynom<T>(MakeZeroDict(maxPolynom));
  116. for (int i = 0; i < maxPolynom._polynomDictionary.Count; i++) {
  117. if (!A._polynomDictionary.ContainsKey(i)) {
  118. resultPolynom._polynomDictionary[i] = (dynamic)(-1) * B._polynomDictionary[i];
  119. } else if (!B._polynomDictionary.ContainsKey(i)) {
  120. resultPolynom._polynomDictionary[i] = A._polynomDictionary[i];
  121. } else {
  122. resultPolynom._polynomDictionary[i] = (dynamic)A._polynomDictionary[i] - (dynamic)B._polynomDictionary[i];
  123. }
  124. }
  125. return resultPolynom;
  126. }
  127.  
  128. public static Polynom<T> operator -(Polynom<T> A, Polynom<T> B) {
  129. return PolynomDifference(A, B);
  130. }
  131.  
  132. //произведение полиномов
  133. public static Polynom<T> PolynomComposition(Polynom<T> A, Polynom<T> B) {
  134. var maxPolynom = SearchMaxPolynom(A, B);
  135. var resultPolynom = new Polynom<T>();
  136. for (int i = 0; i < A._polynomDictionary.Count; i++) {
  137. for (int j = 0; j < B._polynomDictionary.Count; j++) {
  138. if (resultPolynom._polynomDictionary.ContainsKey(i + j)) {
  139. resultPolynom._polynomDictionary[i + j] += (dynamic)A._polynomDictionary[i] * B._polynomDictionary[j];
  140. } else {
  141. resultPolynom._polynomDictionary.Add(i + j, (dynamic)A._polynomDictionary[i] * B._polynomDictionary[j]);
  142. }
  143. }
  144. }
  145. return resultPolynom;
  146. }
  147.  
  148. public static Polynom<T> operator *(Polynom<T> A, Polynom<T> B) {
  149. return PolynomComposition(A, B);
  150. }
  151.  
  152. //умножение полинома на число
  153. public static Polynom<T> PolynomCompositionWithNum(Polynom<T> A, T num) {
  154. var resultPolynom = new Polynom<T>();
  155. for (int i = 0; i < A._polynomDictionary.Count; i++) {
  156. resultPolynom._polynomDictionary[i] = (dynamic)A._polynomDictionary[i] * num;
  157. }
  158. return resultPolynom;
  159. }
  160.  
  161. public static Polynom<T> operator *(Polynom<T> A, T num) {
  162. return PolynomCompositionWithNum(A, num);
  163. }
  164.  
  165. //возведение полинома в степень
  166. public static Polynom<T> PolynomPow(Polynom<T> A, int pow) {
  167. Polynom<T> resultPolynom = A;
  168. for (int i = 1; i < pow; i++) {
  169. resultPolynom *= A;
  170. }
  171. return resultPolynom;
  172. }
  173.  
  174. //значение полинома в точке
  175. public T PolynomInDot(T dot) {
  176. T result = new T();
  177. for (int i = 0; i < _polynomDictionary.Count; i++) {
  178. if (dot is Matrix) {
  179. result += Matrix.MatrixPow((dynamic)dot, i) * _polynomDictionary[i];
  180. } else {
  181. result += Math.Pow((dynamic)dot, i) * _polynomDictionary[i];
  182. }
  183. }
  184. return result;
  185. }
  186.  
  187. //композиция полиномов
  188. public static Polynom<T> CompositionPolynimWithPolynom(Polynom<T> A, Polynom<T> B) {
  189. var resultPolynom = new Polynom<T>(MakeZeroDict(A));
  190. var polynomArr = new Polynom<T>[A._polynomDictionary.Count];
  191. for (int i = 1; i < polynomArr.Length; i++) {
  192. polynomArr[i] = new Polynom<T>((dynamic)PolynomCompositionWithNum(PolynomPow(B, i), A._polynomDictionary[i])._polynomDictionary);
  193. }
  194. for (int i = 1; i < polynomArr.Length; i++) {
  195. resultPolynom += (dynamic)polynomArr[i];
  196. }
  197. resultPolynom._polynomDictionary[0] = (dynamic)resultPolynom._polynomDictionary[0] + A._polynomDictionary[0];
  198. return resultPolynom;
  199. }
  200.  
  201. //вывод
  202. public override string ToString() {
  203. StringBuilder str = new StringBuilder();
  204. for (int i = _polynomDictionary.Count - 1; i >= 0; i--) {
  205. if (_polynomDictionary[i] is Matrix) {
  206. if (i == 0) {
  207. str.Append($"{_polynomDictionary[i]} * x^{i}{Environment.NewLine}");
  208. } else {
  209. str.Append($"{_polynomDictionary[i]} * x^{i} + {Environment.NewLine}");
  210. }
  211. } else {
  212. if (_polynomDictionary[i] == (dynamic)0) {
  213. str.Append("");
  214. } else {
  215. if (i == _polynomDictionary.Count - 1) {
  216. if (_polynomDictionary[i] == (dynamic)(-1)) {
  217. str.Append($"-x^{i}");
  218. } else if (_polynomDictionary[i] == (dynamic)1) {
  219. str.Append($"x^{i}");
  220. } else {
  221. str.Append($"{_polynomDictionary[i]}x^{i}");
  222. }
  223. } else {
  224. if (_polynomDictionary[i] > (dynamic)0) {
  225. if (i == 1) {
  226. if (_polynomDictionary[i] == (dynamic)1) {
  227. str.Append($" + x");
  228. } else {
  229. str.Append($" + {_polynomDictionary[i]}x");
  230. }
  231. } else {
  232. if (i == 0) {
  233. str.Append($" + {_polynomDictionary[i]}");
  234. } else {
  235. if (_polynomDictionary[i] == (dynamic)1) {
  236. str.Append($" + x^{i}");
  237. } else {
  238. str.Append($" + {_polynomDictionary[i]}x^{i}");
  239. }
  240. }
  241. }
  242. } else {
  243. if (_polynomDictionary[i] == (dynamic)(-1) && i == 1 && i != 0) {
  244. str.Append($" - x");
  245. } else {
  246. if (i == 0) {
  247. str.Append($" - {Math.Abs((dynamic)_polynomDictionary[i])}");
  248. } else {
  249. if (i == 1) {
  250. str.Append($" - {Math.Abs((dynamic)_polynomDictionary[i])}x");
  251. } else {
  252. if (_polynomDictionary[i] == (dynamic)(-1)) {
  253. str.Append($" - x^{i}");
  254. } else {
  255. str.Append($" - {Math.Abs((dynamic)_polynomDictionary[i])}x^{i}");
  256. }
  257. }
  258. }
  259. }
  260. }
  261. }
  262. }
  263. }
  264. }
  265. return str.ToString();
  266. }
  267. }
  268. }
Add Comment
Please, Sign In to add comment