Estoy intentando convertir el algoritmo siguiente conjetura de Collatz de:Parallel.For en C#
public class CollatzConjexture
{
public static int Calculate(int StartIndex, int MaxSequence)
{
int ChainLength = 0;
int key = 0;
bool ContinuteCalulating = true;
int LongestChain = 0;
Int64 Remainder = 0;
for (int i = StartIndex; i <= MaxSequence; i++)
{
ChainLength = 1;
Remainder = i;
ContinuteCalulating = true;
while (ContinuteCalulating)
{
Remainder = CalculateCollatzConjecture(Remainder);
if (Remainder == 1)
ContinuteCalulating = false;
ChainLength += 1;
}
if (ChainLength > LongestChain)
{
LongestChain = ChainLength;
key = i;
}
}
return key;
}
private static Int64 CalculateCollatzConjecture(Int64 Number)
{
if (Number % 2 == 0)
return Number/2;
else
return (3 * Number) + 1;
}
}
Para utilizar en su lugar el Parallel.For .NET 4.0:
int ChainLength = 0;
int key = 0;
bool ContinuteCalulating = true;
int LongestChain = 0;
Int64 Remainder = 0;
int[] nums = Enumerable.Range(1, 1500000).ToArray();
long total = 0;
// Use type parameter to make subtotal a long, not an int
Parallel.For<int>(1, nums.Length,() => 1, (j, loop, subtotal) =>
{
Remainder = j;
while (ContinuteCalulating)
{
Remainder = CalculateCollatzConjecture(Remainder);
if (Remainder == 1)
ContinuteCalulating = false;
ChainLength += 1;
}
if (ChainLength > LongestChain)
{
LongestChain = ChainLength;
key = j;
}
return key;
},
(x) => Interlocked.Add(ref key, x)
);
tengo la sensación de que' No estoy muy lejos de eso, famosas últimas palabras.
Gracias de antemano.
Cuando ejecuto esto, no necesariamente obtengo el índice más pequeño que produce la cadena Collatz más larga (es decir, de 1 a 1500000, el método serial devuelve 1117065 y el método LINQ 1126015, ambos con una longitud de cadena de 528) Como recién estoy aprendiendo LINQ, ¿hay alguna manera simple de modificar la llamada '.Aggregate' para arreglar esto? – chezy525
Estoy obteniendo ambas respuestas, de alguna manera, cuando depuro me sale (1117065, 1126015) en ocasiones separadas. Idealmente, me gustaría el índice mínimo. Gracias por adelantado. – Seany84
Después de jugar con esto un poco, creo que solo necesitas cambiar la declaración de condición en el '.Agregado'. es decir, 'max.len cur.key) ' –
chezy525