Skip to content

Commit 3f76fd8

Browse files
committed
'Auto-commit changes made by Claude
🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>'
1 parent f389f6f commit 3f76fd8

File tree

1 file changed

+309
-0
lines changed

1 file changed

+309
-0
lines changed

csharp/Platform.Numbers/Math.cs

Lines changed: 309 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
24
using System.Numerics;
35
using System.Runtime.CompilerServices;
46

@@ -103,5 +105,312 @@ public static bool IsPowerOfTwo<TLinkAddress>(TLinkAddress x) where TLinkAddress
103105
{
104106
return (x & x - TLinkAddress.One) == TLinkAddress.Zero;
105107
}
108+
109+
/// <summary>
110+
/// <para>Adds two values and returns the result.</para>
111+
/// <para>Складывает два значения и возвращает результат.</para>
112+
/// </summary>
113+
/// <typeparam name="T">
114+
/// <para>The type that supports addition operations.</para>
115+
/// <para>Тип, который поддерживает операции сложения.</para>
116+
/// </typeparam>
117+
/// <param name="left">
118+
/// <para>The first value to add.</para>
119+
/// <para>Первое значение для сложения.</para>
120+
/// </param>
121+
/// <param name="right">
122+
/// <para>The second value to add.</para>
123+
/// <para>Второе значение для сложения.</para>
124+
/// </param>
125+
/// <returns>
126+
/// <para>The result of adding left and right.</para>
127+
/// <para>Результат сложения left и right.</para>
128+
/// </returns>
129+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
130+
public static T Add<T>(T left, T right) where T : IAdditionOperators<T, T, T>
131+
{
132+
return left + right;
133+
}
134+
135+
/// <summary>
136+
/// <para>Subtracts one value from another and returns the result.</para>
137+
/// <para>Вычитает одно значение из другого и возвращает результат.</para>
138+
/// </summary>
139+
/// <typeparam name="T">
140+
/// <para>The type that supports subtraction operations.</para>
141+
/// <para>Тип, который поддерживает операции вычитания.</para>
142+
/// </typeparam>
143+
/// <param name="left">
144+
/// <para>The value to subtract from.</para>
145+
/// <para>Значение, из которого вычитается.</para>
146+
/// </param>
147+
/// <param name="right">
148+
/// <para>The value to subtract.</para>
149+
/// <para>Значение, которое вычитается.</para>
150+
/// </param>
151+
/// <returns>
152+
/// <para>The result of subtracting right from left.</para>
153+
/// <para>Результат вычитания right из left.</para>
154+
/// </returns>
155+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
156+
public static T Subtract<T>(T left, T right) where T : ISubtractionOperators<T, T, T>
157+
{
158+
return left - right;
159+
}
160+
161+
/// <summary>
162+
/// <para>Multiplies two values and returns the result.</para>
163+
/// <para>Умножает два значения и возвращает результат.</para>
164+
/// </summary>
165+
/// <typeparam name="T">
166+
/// <para>The type that supports multiplication operations.</para>
167+
/// <para>Тип, который поддерживает операции умножения.</para>
168+
/// </typeparam>
169+
/// <param name="left">
170+
/// <para>The first value to multiply.</para>
171+
/// <para>Первое значение для умножения.</para>
172+
/// </param>
173+
/// <param name="right">
174+
/// <para>The second value to multiply.</para>
175+
/// <para>Второе значение для умножения.</para>
176+
/// </param>
177+
/// <returns>
178+
/// <para>The result of multiplying left and right.</para>
179+
/// <para>Результат умножения left и right.</para>
180+
/// </returns>
181+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
182+
public static T Multiply<T>(T left, T right) where T : IMultiplyOperators<T, T, T>
183+
{
184+
return left * right;
185+
}
186+
187+
/// <summary>
188+
/// <para>Divides one value by another and returns the result.</para>
189+
/// <para>Делит одно значение на другое и возвращает результат.</para>
190+
/// </summary>
191+
/// <typeparam name="T">
192+
/// <para>The type that supports division operations.</para>
193+
/// <para>Тип, который поддерживает операции деления.</para>
194+
/// </typeparam>
195+
/// <param name="left">
196+
/// <para>The dividend.</para>
197+
/// <para>Делимое.</para>
198+
/// </param>
199+
/// <param name="right">
200+
/// <para>The divisor.</para>
201+
/// <para>Делитель.</para>
202+
/// </param>
203+
/// <returns>
204+
/// <para>The result of dividing left by right.</para>
205+
/// <para>Результат деления left на right.</para>
206+
/// </returns>
207+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
208+
public static T Divide<T>(T left, T right) where T : IDivisionOperators<T, T, T>
209+
{
210+
return left / right;
211+
}
212+
213+
/// <summary>
214+
/// <para>Negates a value and returns the result.</para>
215+
/// <para>Отрицает значение и возвращает результат.</para>
216+
/// </summary>
217+
/// <typeparam name="T">
218+
/// <para>The type that supports unary negation operations.</para>
219+
/// <para>Тип, который поддерживает операции унарного отрицания.</para>
220+
/// </typeparam>
221+
/// <param name="value">
222+
/// <para>The value to negate.</para>
223+
/// <para>Значение для отрицания.</para>
224+
/// </param>
225+
/// <returns>
226+
/// <para>The negated value.</para>
227+
/// <para>Отрицательное значение.</para>
228+
/// </returns>
229+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
230+
public static T Negate<T>(T value) where T : IUnaryNegationOperators<T, T>
231+
{
232+
return -value;
233+
}
234+
235+
/// <summary>
236+
/// <para>Returns the smaller of two values.</para>
237+
/// <para>Возвращает меньшее из двух значений.</para>
238+
/// </summary>
239+
/// <typeparam name="T">
240+
/// <para>The type that supports comparison operations.</para>
241+
/// <para>Тип, который поддерживает операции сравнения.</para>
242+
/// </typeparam>
243+
/// <param name="left">
244+
/// <para>The first value to compare.</para>
245+
/// <para>Первое значение для сравнения.</para>
246+
/// </param>
247+
/// <param name="right">
248+
/// <para>The second value to compare.</para>
249+
/// <para>Второе значение для сравнения.</para>
250+
/// </param>
251+
/// <returns>
252+
/// <para>The smaller of the two values.</para>
253+
/// <para>Меньшее из двух значений.</para>
254+
/// </returns>
255+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
256+
public static T Min<T>(T left, T right) where T : IComparisonOperators<T, T, bool>
257+
{
258+
return left < right ? left : right;
259+
}
260+
261+
/// <summary>
262+
/// <para>Returns the larger of two values.</para>
263+
/// <para>Возвращает большее из двух значений.</para>
264+
/// </summary>
265+
/// <typeparam name="T">
266+
/// <para>The type that supports comparison operations.</para>
267+
/// <para>Тип, который поддерживает операции сравнения.</para>
268+
/// </typeparam>
269+
/// <param name="left">
270+
/// <para>The first value to compare.</para>
271+
/// <para>Первое значение для сравнения.</para>
272+
/// </param>
273+
/// <param name="right">
274+
/// <para>The second value to compare.</para>
275+
/// <para>Второе значение для сравнения.</para>
276+
/// </param>
277+
/// <returns>
278+
/// <para>The larger of the two values.</para>
279+
/// <para>Большее из двух значений.</para>
280+
/// </returns>
281+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
282+
public static T Max<T>(T left, T right) where T : IComparisonOperators<T, T, bool>
283+
{
284+
return left > right ? left : right;
285+
}
286+
287+
/// <summary>
288+
/// <para>Returns the absolute value of a number.</para>
289+
/// <para>Возвращает абсолютное значение числа.</para>
290+
/// </summary>
291+
/// <typeparam name="T">
292+
/// <para>The type that supports number operations.</para>
293+
/// <para>Тип, который поддерживает числовые операции.</para>
294+
/// </typeparam>
295+
/// <param name="value">
296+
/// <para>The value to get the absolute value of.</para>
297+
/// <para>Значение, для которого нужно получить абсолютное значение.</para>
298+
/// </param>
299+
/// <returns>
300+
/// <para>The absolute value of the input.</para>
301+
/// <para>Абсолютное значение входного параметра.</para>
302+
/// </returns>
303+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
304+
public static T Abs<T>(T value) where T : INumberBase<T>
305+
{
306+
return T.Abs(value);
307+
}
308+
309+
/// <summary>
310+
/// <para>Returns a value that indicates the sign of a number.</para>
311+
/// <para>Возвращает значение, которое указывает знак числа.</para>
312+
/// </summary>
313+
/// <typeparam name="T">
314+
/// <para>The type that supports number operations.</para>
315+
/// <para>Тип, который поддерживает числовые операции.</para>
316+
/// </typeparam>
317+
/// <param name="value">
318+
/// <para>The value to get the sign of.</para>
319+
/// <para>Значение, для которого нужно получить знак.</para>
320+
/// </param>
321+
/// <returns>
322+
/// <para>A number that indicates the sign of value: -1 if value is less than zero, 0 if value equals zero, 1 if value is greater than zero.</para>
323+
/// <para>Число, которое указывает знак value: -1, если value меньше нуля, 0, если value равно нулю, 1, если value больше нуля.</para>
324+
/// </returns>
325+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
326+
public static int Sign<T>(T value) where T : INumber<T>
327+
{
328+
return T.Sign(value);
329+
}
330+
331+
/// <summary>
332+
/// <para>Computes the sum of a sequence of numeric values.</para>
333+
/// <para>Вычисляет сумму последовательности числовых значений.</para>
334+
/// </summary>
335+
/// <typeparam name="T">
336+
/// <para>The type that supports addition operations.</para>
337+
/// <para>Тип, который поддерживает операции сложения.</para>
338+
/// </typeparam>
339+
/// <param name="values">
340+
/// <para>A sequence of values to calculate the sum of.</para>
341+
/// <para>Последовательность значений для вычисления суммы.</para>
342+
/// </param>
343+
/// <returns>
344+
/// <para>The sum of the values in the sequence.</para>
345+
/// <para>Сумма значений в последовательности.</para>
346+
/// </returns>
347+
public static T Sum<T>(IEnumerable<T> values) where T : IAdditiveIdentity<T, T>, IAdditionOperators<T, T, T>
348+
{
349+
return values.Aggregate(T.AdditiveIdentity, Add);
350+
}
351+
352+
/// <summary>
353+
/// <para>Computes the average of a sequence of numeric values.</para>
354+
/// <para>Вычисляет среднее значение последовательности числовых значений.</para>
355+
/// </summary>
356+
/// <typeparam name="T">
357+
/// <para>The type that supports division and addition operations.</para>
358+
/// <para>Тип, который поддерживает операции деления и сложения.</para>
359+
/// </typeparam>
360+
/// <param name="values">
361+
/// <para>A sequence of values to calculate the average of.</para>
362+
/// <para>Последовательность значений для вычисления среднего.</para>
363+
/// </param>
364+
/// <returns>
365+
/// <para>The average of the values in the sequence.</para>
366+
/// <para>Среднее значение последовательности.</para>
367+
/// </returns>
368+
public static T Average<T>(IEnumerable<T> values) where T : IAdditiveIdentity<T, T>, IAdditionOperators<T, T, T>, IDivisionOperators<T, T, T>, INumber<T>
369+
{
370+
var valuesList = values.ToList();
371+
if (valuesList.Count == 0)
372+
{
373+
throw new InvalidOperationException("Sequence contains no elements.");
374+
}
375+
var sum = Sum(valuesList);
376+
var count = T.CreateTruncating(valuesList.Count);
377+
return Divide(sum, count);
378+
}
379+
380+
/// <summary>
381+
/// <para>Gets the additive identity value for the specified type.</para>
382+
/// <para>Получает аддитивную идентичность для указанного типа.</para>
383+
/// </summary>
384+
/// <typeparam name="T">
385+
/// <para>The type that supports additive identity.</para>
386+
/// <para>Тип, который поддерживает аддитивную идентичность.</para>
387+
/// </typeparam>
388+
/// <returns>
389+
/// <para>The additive identity (zero) for the type.</para>
390+
/// <para>Аддитивная идентичность (ноль) для типа.</para>
391+
/// </returns>
392+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
393+
public static T Zero<T>() where T : IAdditiveIdentity<T, T>
394+
{
395+
return T.AdditiveIdentity;
396+
}
397+
398+
/// <summary>
399+
/// <para>Gets the multiplicative identity value for the specified type.</para>
400+
/// <para>Получает мультипликативную идентичность для указанного типа.</para>
401+
/// </summary>
402+
/// <typeparam name="T">
403+
/// <para>The type that supports multiplicative identity.</para>
404+
/// <para>Тип, который поддерживает мультипликативную идентичность.</para>
405+
/// </typeparam>
406+
/// <returns>
407+
/// <para>The multiplicative identity (one) for the type.</para>
408+
/// <para>Мультипликативная идентичность (единица) для типа.</para>
409+
/// </returns>
410+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
411+
public static T One<T>() where T : IMultiplicativeIdentity<T, T>
412+
{
413+
return T.MultiplicativeIdentity;
414+
}
106415
}
107416
}

0 commit comments

Comments
 (0)