From 3b8a10a20bd70ba37ec4d347f856b4d936a8cce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Lema=C5=84czyk?= Date: Mon, 22 Sep 2025 19:54:54 +0200 Subject: [PATCH] Inline single-use modulo helpers --- .../Cpu/MersenneNumberLucasLehmerCpuTester.cs | 24 +++++++-------- PerfectNumbers.Core/PrimesGenerator.cs | 30 +++++++++++-------- PerfectNumbers.Core/UInt128Extensions.cs | 6 ++-- PerfectNumbers.Core/UIntExtensions.cs | 3 +- PerfectNumbers.Core/ULongExtensions.cs | 5 ++-- 5 files changed, 33 insertions(+), 35 deletions(-) diff --git a/PerfectNumbers.Core/Cpu/MersenneNumberLucasLehmerCpuTester.cs b/PerfectNumbers.Core/Cpu/MersenneNumberLucasLehmerCpuTester.cs index bbc5785..93dddb5 100644 --- a/PerfectNumbers.Core/Cpu/MersenneNumberLucasLehmerCpuTester.cs +++ b/PerfectNumbers.Core/Cpu/MersenneNumberLucasLehmerCpuTester.cs @@ -4,20 +4,16 @@ public class MersenneNumberLucasLehmerCpuTester { public bool IsPrime(ulong exponent) { - // Early rejections aligned with incremental/order sieves, but safe for small p: - // - If 3 | p and p != 3, then 7 | M_p -> composite. - // - If p ≡ 1 (mod 4) and p shares a factor with (p-1), reject fast. - // - If p is divisible by divisors specific to numbers ending with 1 or 7, reject fast. - ulong mod3 = exponent.Mod3(); - ulong mod5 = exponent.Mod5(); - ulong mod7 = exponent.Mod7(); - ulong mod11 = exponent.Mod11(); - if ( - (mod3 == 0UL && exponent != 3UL) || - (mod5 == 0UL && exponent != 5UL) || - (mod7 == 0UL && exponent != 7UL) || - (mod11 == 0UL && exponent != 11UL) - ) + // Early rejections aligned with incremental/order sieves, but safe for small p: + // - If 3 | p and p != 3, then 7 | M_p -> composite. + // - If p ≡ 1 (mod 4) and p shares a factor with (p-1), reject fast. + // - If p is divisible by divisors specific to numbers ending with 1 or 7, reject fast. + if ( + (exponent.Mod3() == 0UL && exponent != 3UL) || + (exponent.Mod5() == 0UL && exponent != 5UL) || + (exponent.Mod7() == 0UL && exponent != 7UL) || + (exponent.Mod11() == 0UL && exponent != 11UL) + ) { return false; } diff --git a/PerfectNumbers.Core/PrimesGenerator.cs b/PerfectNumbers.Core/PrimesGenerator.cs index 5714122..a51e555 100644 --- a/PerfectNumbers.Core/PrimesGenerator.cs +++ b/PerfectNumbers.Core/PrimesGenerator.cs @@ -97,17 +97,23 @@ public static class PrimesGenerator } } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static bool IsAllowedForLastOne(uint prime) - { - uint mod10 = prime % 10U; - return mod10 == 1U || mod10 == 3U || mod10 == 9U || prime == 7U || prime == 11U; - } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static bool IsAllowedForLastOne(uint prime) + { + return (prime % 10U) switch + { + 1U or 3U or 9U => true, + _ => prime == 7U || prime == 11U, + }; + } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static bool IsAllowedForLastSeven(uint prime) - { - uint mod10 = prime % 10U; - return mod10 == 3U || mod10 == 7U || mod10 == 9U || prime == 11U; - } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static bool IsAllowedForLastSeven(uint prime) + { + return (prime % 10U) switch + { + 3U or 7U or 9U => true, + _ => prime == 11U, + }; + } } diff --git a/PerfectNumbers.Core/UInt128Extensions.cs b/PerfectNumbers.Core/UInt128Extensions.cs index ecfde88..904d84c 100644 --- a/PerfectNumbers.Core/UInt128Extensions.cs +++ b/PerfectNumbers.Core/UInt128Extensions.cs @@ -241,9 +241,7 @@ public static class UInt128Extensions [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong Mod6(this UInt128 value) { - ulong mod3 = value.Mod3(); - ulong key = (mod3 << 1) | ((ulong)value & 1UL); - return key switch + return ((value.Mod3() << 1) | ((ulong)value & 1UL)) switch { 0UL => 0UL, 1UL => 3UL, @@ -318,4 +316,4 @@ public static class UInt128Extensions return result; } -} \ No newline at end of file +} diff --git a/PerfectNumbers.Core/UIntExtensions.cs b/PerfectNumbers.Core/UIntExtensions.cs index a43e191..d17afa0 100644 --- a/PerfectNumbers.Core/UIntExtensions.cs +++ b/PerfectNumbers.Core/UIntExtensions.cs @@ -23,8 +23,7 @@ public static class UIntExtensions [MethodImpl(MethodImplOptions.AggressiveInlining)] public static uint Mod6(this uint value) { - uint key = (value.Mod3() << 1) | (value & 1U); - return Mod6Lookup[(int)key]; + return Mod6Lookup[(int)(((value.Mod3() << 1) | (value & 1U)))]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/PerfectNumbers.Core/ULongExtensions.cs b/PerfectNumbers.Core/ULongExtensions.cs index eea9e9f..a9f6837 100644 --- a/PerfectNumbers.Core/ULongExtensions.cs +++ b/PerfectNumbers.Core/ULongExtensions.cs @@ -221,8 +221,7 @@ public static class ULongExtensions [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong Mod6(this ulong value) { - ulong key = (value.Mod3() << 1) | (value & 1UL); - return Mod6Lookup[(int)key]; + return Mod6Lookup[(int)(((value.Mod3() << 1) | (value & 1UL)))]; } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -647,4 +646,4 @@ public static class ULongExtensions return false; } -} \ No newline at end of file +}