Small optimizations

This commit is contained in:
mlemanczyk committed 2025-10-11 13:37:23 +02:00
1 parent 74fb7f1535
commit 1cbf49c8b5
4 files changed
+31 -16

No files matched your search

+14 -3
View File
@@ -1,8 +1,19 @@
namespace PerfectNumbers.Core namespace PerfectNumbers.Core
{ {
public readonly struct FactorEntry(ulong value, int exponent) public readonly struct FactorEntry
{ {
public readonly ulong Value = value; public readonly ulong Value;
public readonly int Exponent = exponent; public readonly int Exponent = 1;
public FactorEntry(ulong value, int exponent)
{
Value = value;
Exponent = exponent;
}
public FactorEntry(ulong value)
{
Value = value;
}
} }
} }
+3 -3
View File
@@ -38,7 +38,7 @@ namespace PerfectNumbers.Core
return instance; return instance;
} }
public static readonly PartialFactorResult Empty = new PartialFactorResult public static readonly PartialFactorResult Empty = new()
{ {
Cofactor = 1UL, Cofactor = 1UL,
FullyFactored = true, FullyFactored = true,
@@ -50,13 +50,13 @@ namespace PerfectNumbers.Core
if (source is null || Count == 0) if (source is null || Count == 0)
{ {
FactorEntry[] local = ArrayPool<FactorEntry>.Shared.Rent(1); FactorEntry[] local = ArrayPool<FactorEntry>.Shared.Rent(1);
local[0] = new FactorEntry(prime, 1); local[0] = new FactorEntry(prime);
return Rent(local, 1UL, true, 1); return Rent(local, 1UL, true, 1);
} }
FactorEntry[] extended = ArrayPool<FactorEntry>.Shared.Rent(Count + 1); FactorEntry[] extended = ArrayPool<FactorEntry>.Shared.Rent(Count + 1);
Array.Copy(source, 0, extended, 0, Count); Array.Copy(source, 0, extended, 0, Count);
extended[Count] = new FactorEntry(prime, 1); extended[Count] = new FactorEntry(prime);
Span<FactorEntry> span = extended.AsSpan(0, Count + 1); Span<FactorEntry> span = extended.AsSpan(0, Count + 1);
span.Sort(static (a, b) => a.Value.CompareTo(b.Value)); span.Sort(static (a, b) => a.Value.CompareTo(b.Value));
return Rent(extended, 1UL, true, Count + 1); return Rent(extended, 1UL, true, Count + 1);
@@ -1062,15 +1062,20 @@ internal static partial class PrimeOrderCalculator
private readonly struct FactorEntry128 private readonly struct FactorEntry128
{ {
public FactorEntry128(UInt128 value)
{
Value = value;
}
public FactorEntry128(UInt128 value, int exponent) public FactorEntry128(UInt128 value, int exponent)
{ {
Value = value; Value = value;
Exponent = exponent; Exponent = exponent;
} }
public UInt128 Value { get; } public readonly UInt128 Value;
public int Exponent { get; } public readonly int Exponent = 1;
} }
private readonly struct PartialFactorResult128 private readonly struct PartialFactorResult128
@@ -1083,13 +1088,13 @@ internal static partial class PrimeOrderCalculator
Count = count; Count = count;
} }
public FactorEntry128[]? Factors { get; } public readonly FactorEntry128[]? Factors;
public UInt128 Cofactor { get; } public readonly UInt128 Cofactor;
public bool FullyFactored { get; } public readonly bool FullyFactored;
public int Count { get; } public readonly int Count;
public static PartialFactorResult128 Empty => new(null, UInt128.One, true, 0); public static PartialFactorResult128 Empty => new(null, UInt128.One, true, 0);
@@ -1097,14 +1102,13 @@ internal static partial class PrimeOrderCalculator
{ {
if (Factors is null) if (Factors is null)
{ {
FactorEntry128[] local = new FactorEntry128[1]; FactorEntry128[] local = [new FactorEntry128(prime)];
local[0] = new FactorEntry128(prime, 1);
return new PartialFactorResult128(local, UInt128.One, true, 1); return new PartialFactorResult128(local, UInt128.One, true, 1);
} }
FactorEntry128[] extended = new FactorEntry128[Count + 1]; FactorEntry128[] extended = new FactorEntry128[Count + 1];
Array.Copy(Factors, extended, Count); Array.Copy(Factors, extended, Count);
extended[Count] = new FactorEntry128(prime, 1); extended[Count] = new FactorEntry128(prime);
return new PartialFactorResult128(extended, UInt128.One, true, Count + 1); return new PartialFactorResult128(extended, UInt128.One, true, Count + 1);
} }
} }
+1 -1
View File
@@ -248,7 +248,7 @@ internal static partial class PrimeOrderCalculator
// bool isPrime = PrimeTester.IsPrimeInternal(factors.Cofactor, CancellationToken.None); // bool isPrime = PrimeTester.IsPrimeInternal(factors.Cofactor, CancellationToken.None);
if (!factors.FullyFactored && factors.Cofactor > 1UL && isPrime) if (!factors.FullyFactored && factors.Cofactor > 1UL && isPrime)
{ {
buffer[length] = new FactorEntry(factors.Cofactor, 1); buffer[length] = new FactorEntry(factors.Cofactor);
length++; length++;
} }