static void Main(string[] args)
 {
     QuadraticSieve.primeSupply = new derpy();
     BigInteger N = 90283;
     int B = 14;
     SieveRequest sievereq = new SieveRequest();
     QuadraticSieve.InitSievingRequest(N, B, x => x * x - N, sievereq);
     QuadraticSieve.SegmentSievingRequest(0, 60, sievereq);
     SievingData sievedat = new SievingData();
     QuadraticSieve.EvaluatePoly(sievereq, sievedat);
     QuadraticSieve.Sieve(sievereq, sievedat);
     SieveResult sieveres = new SieveResult();
     QuadraticSieve.CreateFormattedSievingResult(sievereq, sievedat, sieveres);
     printarr(sieveres.V);
     printarr(sieveres.SmoothRelations);
     Console.WriteLine();
     SolveRequest solvereq = new SolveRequest();
     QuadraticSieve.InitSolveRequest(sievereq.B, sieveres.V.Count, solvereq);
     QuadraticSieve.AddDataToSolveRequest(sieveres, solvereq);
     printarr(solvereq.Coefficients);
     Console.WriteLine();
     QuadraticSieve.Gaussian(solvereq);
     printarr(solvereq.Coefficients);
     Console.ReadLine();
 }
 public static void AddDataToSolveRequest(SieveResult data, SolveRequest solvereq)
 {
     //transpose matrix, add it to the coefficients (making sure to offset by startIdx of data)
     solvereq.V.AddRange(solvereq.V);
     for (int i = 0; i < data.V.Count; i++)
     {
         for (int j = 0; j < data.SourceRequest.B; j++)
         {
             solvereq.Coefficients[j][i + solvereq.V.Count] = data.SmoothRelations[i][j];
         }
     }
 }
 /// <summary>
 /// Takes a SieveResult object, and adds the data to a SolveRequest object
 /// </summary>
 /// <param name="solvereq">The SieveRequest to add the data to</param>
 /// <param name="data">The data to add</param>
 public static void AddDataToSolveRequest(SieveResult data, SolveRequest solvereq)
 {
     for (int i = 0; i < data.V.Count; i++)
     {
         for (int j = 0; j < data.SourceRequest.B; j++)
         {
             solvereq.Coefficients[j][i + data.SourceRequest.StartIdx] = data.SmoothRelations[i][j];
         }
     }
 }
 /// <summary>
 /// Formats data in a SieveData object into a proper SieveResult
 /// </summary>
 /// <param name="sievereq"></param>
 /// <param name="sievedat">The data to be formatted</param>
 /// <param name="sieveres">The SieveResult object where the formatted data will be put</param>
 public static void CreateFormattedSievingResult(SieveRequest sievereq, SievingData sievedat, SieveResult sieveres)
 {
     sieveres.SourceRequest = sievereq;
     sieveres.SmoothRelations = new List<BinaryVector>();
     sieveres.V = new List<BigInteger>();
     for (int i = 0; i < sievereq.L; i++)
     {
         if (sievedat.V[i] == 1)
         {
             sieveres.V.Add(sievereq.polyFunction(i + sievereq.AStart + sievereq.StartIdx));
             sieveres.SmoothRelations.Add(sievedat.Coefficients[i]);
         }
     }
 }
 public static void CreateFormattedSievingResult(SieveRequest sievereq, SievingData sievedat, SieveResult sieveres)
 {
     sieveres.SourceRequest   = sievereq;
     sieveres.SmoothRelations = new List <BinaryVector>();
     sieveres.V = new List <BigInteger>();
     for (int i = 0; i < sievereq.L; i++)
     {
         //if number only consisted of primes that were sieved, then it is smooth
         if (sievedat.V[i] == 1)
         {
             sieveres.V.Add(sievereq.polyFunction(i + sievereq.AStart + StartIdx));
             sieveres.SmoothRelations.Add(sievedat.Coefficients[i]);
         }
     }
 }