Skip to content

Commit 2c951a8

Browse files
Use dirty generic math
1 parent 8ee00c4 commit 2c951a8

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

csharp/Platform.Numbers/Math.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Numerics;
23
using System.Runtime.CompilerServices;
34

45
namespace Platform.Numbers
@@ -49,11 +50,11 @@ public static class Math
4950
/// <para>The product of all positive integers less than or equal to the number specified as an argument.</para>
5051
/// <para>Произведение всех положительных чисел меньше или равных указанному, в качестве аргумента, числу.</para>
5152
/// </returns>
52-
public static ulong Factorial(ulong n)
53+
public static TLinkAddress Factorial<TLinkAddress>(TLinkAddress n) where TLinkAddress : IUnsignedNumber<TLinkAddress>, IComparisonOperators<TLinkAddress, TLinkAddress, bool>
5354
{
54-
if (n >= 0 && n <= MaximumFactorialNumber)
55+
if (n >= TLinkAddress.Zero && n <= TLinkAddress.CreateTruncating(MaximumCatalanIndex))
5556
{
56-
return _factorials[n];
57+
return TLinkAddress.CreateTruncating(_factorials[ulong.CreateTruncating(n)]);
5758
}
5859
else
5960
{
@@ -73,11 +74,11 @@ public static ulong Factorial(ulong n)
7374
/// <para>The Catalan Number with the number specified as an argument.</para>
7475
/// <para>Число Катанала с номером, указанным в качестве аргумента.</para>
7576
/// </returns>
76-
public static ulong Catalan(ulong n)
77+
public static TLinkAddress Catalan<TLinkAddress>(TLinkAddress n) where TLinkAddress : IUnsignedNumber<TLinkAddress>, IComparisonOperators<TLinkAddress, TLinkAddress, bool>
7778
{
78-
if (n >= 0 && n <= MaximumCatalanIndex)
79+
if (n >= TLinkAddress.Zero && n <= TLinkAddress.CreateTruncating(MaximumCatalanIndex))
7980
{
80-
return _catalans[n];
81+
return TLinkAddress.CreateTruncating(_catalans[ulong.CreateTruncating(n)]);
8182
}
8283
else
8384
{
@@ -98,6 +99,9 @@ public static ulong Catalan(ulong n)
9899
/// <para>True, если число является степенью двойки, иначе - false.</para>
99100
/// </returns>
100101
[MethodImpl(MethodImplOptions.AggressiveInlining)]
101-
public static bool IsPowerOfTwo(ulong x) => (x & x - 1) == 0;
102+
public static bool IsPowerOfTwo<TLinkAddress>(TLinkAddress x) where TLinkAddress : IUnsignedNumber<TLinkAddress>, IBitwiseOperators<TLinkAddress, TLinkAddress, TLinkAddress>, IComparisonOperators<TLinkAddress, TLinkAddress, bool>
103+
{
104+
return (x & x - TLinkAddress.One) == TLinkAddress.Zero;
105+
}
102106
}
103107
}

0 commit comments

Comments
 (0)