Write only prime residue results

This commit is contained in:
Marek Lemańczyk committed 2025-09-20 05:25:00 +02:00
1 parent 68179b14d7
commit 6f692e93ef
2 files changed
+75 -45

No files matched your search

+18 -1
View File
@@ -404,12 +404,18 @@ public class ProgramTests
var outputField = typeof(Program).GetField("_outputBuilder", BindingFlags.NonPublic | BindingFlags.Static)!; var outputField = typeof(Program).GetField("_outputBuilder", BindingFlags.NonPublic | BindingFlags.Static)!;
var writeIndexField = typeof(Program).GetField("_writeIndex", BindingFlags.NonPublic | BindingFlags.Static)!; var writeIndexField = typeof(Program).GetField("_writeIndex", BindingFlags.NonPublic | BindingFlags.Static)!;
var compositeField = typeof(Program).GetField("_lastCompositeP", BindingFlags.NonPublic | BindingFlags.Static)!; var compositeField = typeof(Program).GetField("_lastCompositeP", BindingFlags.NonPublic | BindingFlags.Static)!;
var primeCountField = typeof(Program).GetField("_primeCount", BindingFlags.NonPublic | BindingFlags.Static)!;
var primeFoundField = typeof(Program).GetField("_primeFoundAfterInit", BindingFlags.NonPublic | BindingFlags.Static)!;
var consoleCounterField = typeof(Program).GetField("_consoleCounter", BindingFlags.NonPublic | BindingFlags.Static)!;
var printResult = typeof(Program).GetMethod("PrintResult", BindingFlags.NonPublic | BindingFlags.Static)!; var printResult = typeof(Program).GetMethod("PrintResult", BindingFlags.NonPublic | BindingFlags.Static)!;
var previousResidueMode = (bool)residueModeField.GetValue(null)!; var previousResidueMode = (bool)residueModeField.GetValue(null)!;
var previousOutput = (StringBuilder?)outputField.GetValue(null); var previousOutput = (StringBuilder?)outputField.GetValue(null);
var previousWriteIndex = (int)writeIndexField.GetValue(null)!; var previousWriteIndex = (int)writeIndexField.GetValue(null)!;
var previousComposite = (bool)compositeField.GetValue(null)!; var previousComposite = (bool)compositeField.GetValue(null)!;
var previousPrimeCount = (int)primeCountField.GetValue(null)!;
var previousPrimeFound = (bool)primeFoundField.GetValue(null)!;
var previousConsoleCounter = (int)consoleCounterField.GetValue(null)!;
var builder = StringBuilderPool.Rent(); var builder = StringBuilderPool.Rent();
@@ -420,11 +426,19 @@ public class ProgramTests
compositeField.SetValue(null, true); compositeField.SetValue(null, true);
outputField.SetValue(null, builder); outputField.SetValue(null, builder);
writeIndexField.SetValue(null, 0); writeIndexField.SetValue(null, 0);
primeCountField.SetValue(null, 0);
primeFoundField.SetValue(null, false);
consoleCounterField.SetValue(null, 0);
printResult.Invoke(null, new object[] { 9UL, false, false, false }); printResult.Invoke(null, new object[] { 9UL, false, false, false });
builder.Length.Should().Be(0); builder.ToString().Should().BeEmpty();
((int)writeIndexField.GetValue(null)!).Should().Be(0); ((int)writeIndexField.GetValue(null)!).Should().Be(0);
printResult.Invoke(null, new object[] { 11UL, true, false, true });
builder.ToString().Should().Be("11,True,False,True" + Environment.NewLine);
((int)writeIndexField.GetValue(null)!).Should().Be(1);
} }
finally finally
{ {
@@ -432,6 +446,9 @@ public class ProgramTests
writeIndexField.SetValue(null, previousWriteIndex); writeIndexField.SetValue(null, previousWriteIndex);
residueModeField.SetValue(null, previousResidueMode); residueModeField.SetValue(null, previousResidueMode);
compositeField.SetValue(null, previousComposite); compositeField.SetValue(null, previousComposite);
primeCountField.SetValue(null, previousPrimeCount);
primeFoundField.SetValue(null, previousPrimeFound);
consoleCounterField.SetValue(null, previousConsoleCounter);
builder.Clear(); builder.Clear();
StringBuilderPool.Return(builder); StringBuilderPool.Return(builder);
} }
+57 -44
View File
@@ -836,57 +836,70 @@ internal static class Program
} }
} }
if (_useResidueMode && _lastCompositeP) bool lastWasComposite = _lastCompositeP;
{ bool primeFlag = false, printToConsole = false;
return;
}
bool primeFlag = false, printToConsole = false; StringBuilder? localBuilder = passedAllTests ? StringBuilderPool.Rent() : null;
if (localBuilder is not null)
{
_ = localBuilder
.Append(currentP).Append(',')
.Append(searchedMersenne).Append(',')
.Append(detailedCheck).Append(',')
.Append(passedAllTests).Append('\n');
}
StringBuilder localBuilder = StringBuilderPool.Rent(); lock (Sync)
_ = localBuilder {
.Append(currentP).Append(',') if (_consoleCounter >= ConsoleInterval)
.Append(searchedMersenne).Append(',') {
.Append(detailedCheck).Append(',') printToConsole = true;
.Append(passedAllTests).Append('\n'); primeFlag = passedAllTests && !lastWasComposite && _primeFoundAfterInit;
_consoleCounter = 0;
}
else
{
_consoleCounter++;
}
lock (Sync) if (localBuilder is not null)
{ {
_ = _outputBuilder!.Append(localBuilder); _ = _outputBuilder!.Append(localBuilder);
if (_consoleCounter >= ConsoleInterval) _writeIndex++;
{ if (_writeIndex >= _writeBatchSize)
printToConsole = true; {
primeFlag = _primeFoundAfterInit; FlushBuffer();
_consoleCounter = 0; }
} }
else }
{
_consoleCounter++;
}
_writeIndex++; if (printToConsole)
if (_writeIndex >= _writeBatchSize) {
{ if (localBuilder is not null)
FlushBuffer(); {
} if (primeFlag)
} {
_ = localBuilder
.Remove(localBuilder.Length - 1, 1)
.Append(PrimeFoundSuffix)
.Append('\n');
}
if (printToConsole) Console.WriteLine(localBuilder.Remove(localBuilder.Length - 1, 1).ToString());
{ }
if (primeFlag) else
{ {
_ = localBuilder Console.WriteLine($"{currentP},{searchedMersenne},{detailedCheck},{passedAllTests}");
.Remove(localBuilder.Length - 1, 1) }
.Append(PrimeFoundSuffix) }
.Append('\n');
}
Console.WriteLine(localBuilder.Remove(localBuilder.Length - 1, 1).ToString()); if (localBuilder is not null)
} {
localBuilder.Clear();
StringBuilderPool.Return(localBuilder); StringBuilderPool.Return(localBuilder);
} }
}
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
private static void FlushBuffer() private static void FlushBuffer()