public static void Quadratic(GNFS gnfs) { if (gnfs.PrimeFactorBase.QuadraticFactorBase.Any()) { Save.Object(gnfs.PrimeFactorBase.QuadraticFactorBase, Path.Combine(gnfs.SaveLocations.SaveDirectory, $"{nameof(GNFSCore.FactorBase.QuadraticFactorBase)}.json")); } }
public static void All(GNFS gnfs) { Save.Gnfs(gnfs); int counter = 1; foreach (Polynomial poly in gnfs.PolynomialCollection) { string filename = $"Polynomial.{counter:00}"; Save.Object(poly, Path.Combine(gnfs.SaveLocations.SaveDirectory, filename)); counter++; } //Save.FactorBase.Rational(gnfs); //Save.FactorBase.Algebraic(gnfs); //Save.FactorBase.Quadratic(gnfs); Save.FactorPair.Rational(gnfs); Save.FactorPair.Algebraic(gnfs); Save.FactorPair.Quadratic(gnfs); Save.Relations.Smooth.Append(gnfs); Save.Relations.Rough.Append(gnfs); Save.Relations.Free.AllSolutions(gnfs); }
public static void Algebraic(GNFS gnfs) { if (gnfs.AlgebraicFactorPairCollection.Any()) { Save.Object(gnfs.AlgebraicFactorPairCollection, Path.Combine(gnfs.SaveLocations.SaveDirectory, $"{nameof(GNFS.AlgebraicFactorPairCollection)}.json")); } }
public static GNFS All(string filename) { string loadJson = File.ReadAllText(filename); GNFS gnfs = JsonConvert.DeserializeObject <GNFS>(loadJson); string directoryName = Path.GetDirectoryName(filename); gnfs.SaveLocations = new DirectoryLocations(directoryName); gnfs.CurrentPolynomial = gnfs.PolynomialCollection.Last(); ((Polynomial)gnfs.CurrentPolynomial).SetDegree(); Load.FactorBase.Rational(ref gnfs); Load.FactorBase.Algebraic(ref gnfs); Load.FactorBase.Quadratic(ref gnfs); Load.FactorPair.Rational(ref gnfs); Load.FactorPair.Algebraic(ref gnfs); Load.FactorPair.Quadratic(ref gnfs); gnfs.CurrentRelationsProgress._gnfs = gnfs; Load.Relations.Smooth(ref gnfs); Load.Relations.Rough(ref gnfs); Load.Relations.Free(ref gnfs); return(gnfs); }
private static bool FileExists(GNFS gnfs) { if (!_fileExists.HasValue || _fileExists == false) { _fileExists = File.Exists(Path.Combine(gnfs.SaveLocations.SaveDirectory, $"{nameof(RelationContainer.RoughRelations)}.json")); } return(_fileExists.Value); }
public static void SingleSolution(GNFS gnfs, List <Relation> solution) { if (solution.Any()) { solution.ForEach(rel => rel.IsPersisted = true); Save.Object(solution, Path.Combine(gnfs.SaveLocations.SaveDirectory, $"{nameof(RelationContainer.FreeRelations)}_{gnfs.CurrentRelationsProgress.FreeRelationsCounter}.json")); gnfs.CurrentRelationsProgress.FreeRelationsCounter += 1; } }
public static void Quadratic(ref GNFS gnfs) { string filename = Path.Combine(gnfs.SaveLocations.SaveDirectory, $"{nameof(GNFS.QuadraticFactorPairCollection)}.json"); if (File.Exists(filename)) { gnfs.QuadraticFactorPairCollection = Load.Generic <FactorPairCollection>(filename); } }
public static void Quadratic(ref GNFS gnfs) { string filename = Path.Combine(gnfs.SaveLocations.SaveDirectory, $"{nameof(GNFSCore.FactorBase.QuadraticFactorBase)}.json"); if (File.Exists(filename)) { gnfs.PrimeFactorBase.QuadraticFactorBase = Load.Generic <List <BigInteger> >(filename); } }
public static void AppendList(GNFS gnfs, List <Relation> roughRelations) { if (roughRelations != null && roughRelations.Any()) { string filename = Path.Combine(gnfs.SaveLocations.SaveDirectory, $"{nameof(RelationContainer.RoughRelations)}.json"); string json = JsonConvert.SerializeObject(roughRelations, Formatting.Indented); json = json.Replace("[", "").Replace("]", ","); File.AppendAllText(filename, json); roughRelations.ForEach(rel => rel.IsPersisted = true); } }
public static void Rough(ref GNFS gnfs) { string filename = Path.Combine(gnfs.SaveLocations.SaveDirectory, $"{nameof(RelationContainer.RoughRelations)}.json"); if (File.Exists(filename)) { List <Relation> temp = Load.GenericFixedArray <List <Relation> >(filename); temp.ForEach(rel => rel.IsPersisted = true); gnfs.CurrentRelationsProgress.Relations.RoughRelations = temp; } }
public static void AllSolutions(GNFS gnfs) { if (gnfs.CurrentRelationsProgress.Relations.FreeRelations.Any()) { gnfs.CurrentRelationsProgress.FreeRelationsCounter = 1; foreach (List <Relation> solution in gnfs.CurrentRelationsProgress.Relations.FreeRelations) { SingleSolution(gnfs, solution); } } }
public static void Append(GNFS gnfs) { if (gnfs.CurrentRelationsProgress.Relations.RoughRelations.Any()) { List <Relation> toSave = gnfs.CurrentRelationsProgress.Relations.RoughRelations.Where(rel => !rel.IsPersisted).ToList(); foreach (Relation rel in toSave) { Append(gnfs, rel); } } }
public PolyRelationsSieveProgress(GNFS gnfs, int quantity, int valueRange) { _gnfs = gnfs; Relations = new RelationContainer(); A = 0; B = 3; Quantity = quantity; ValueRange = valueRange; if (MaxB == 0) { MaxB = (uint)gnfs.PrimeFactorBase.AlgebraicFactorBaseMax; } }
public static void All(GNFS gnfs) { Save.Gnfs(gnfs); Save.FactorBase.Rational(gnfs); Save.FactorBase.Algebraic(gnfs); Save.FactorBase.Quadratic(gnfs); Save.FactorPair.Rational(gnfs); Save.FactorPair.Algebraic(gnfs); Save.FactorPair.Quadratic(gnfs); Save.Relations.Smooth.Append(gnfs); Save.Relations.Rough.Append(gnfs); Save.Relations.Free.AllSolutions(gnfs); }
public static void Append(GNFS gnfs, Relation roughRelation) { if (roughRelation != null && !roughRelation.IsSmooth && !roughRelation.IsPersisted) { string filename = Path.Combine(gnfs.SaveLocations.SaveDirectory, $"{nameof(RelationContainer.RoughRelations)}.json"); string json = JsonConvert.SerializeObject(roughRelation, Formatting.Indented); if (FileExists(gnfs)) { json += ","; } File.AppendAllText(filename, json); roughRelation.IsPersisted = true; } }
public static GNFS All(string filename) { string loadJson = File.ReadAllText(filename); GNFS gnfs = JsonConvert.DeserializeObject <GNFS>(loadJson); string directoryName = Path.GetDirectoryName(filename); gnfs.SaveLocations = new DirectoryLocations(directoryName); int counter = 0; bool finished = false; string polyFilename = string.Empty; do { counter++; polyFilename = Path.GetFullPath(Path.Combine(gnfs.SaveLocations.SaveDirectory, $"Polynomial.{counter:00}")); if (File.Exists(polyFilename)) { Polynomial deserializedPoly = Load.Polynomial(polyFilename); gnfs.PolynomialCollection.Add(deserializedPoly); } else { finished = true; } }while (!finished); gnfs.CurrentPolynomial = gnfs.PolynomialCollection.First(); Load.FactorBase(ref gnfs); Load.FactorPair.Rational(ref gnfs); Load.FactorPair.Algebraic(ref gnfs); Load.FactorPair.Quadratic(ref gnfs); gnfs.CurrentRelationsProgress._gnfs = gnfs; Load.Relations.Smooth(ref gnfs); Load.Relations.Rough(ref gnfs); Load.Relations.Free(ref gnfs); return(gnfs); }
public static void Append(GNFS gnfs, Relation relation) { if (relation != null && relation.IsSmooth && !relation.IsPersisted) { string filename = Path.Combine(gnfs.SaveLocations.SaveDirectory, $"{nameof(RelationContainer.SmoothRelations)}.json"); string json = JsonConvert.SerializeObject(relation, Formatting.Indented); if (FileExists(gnfs)) { json = json.Insert(0, ","); } File.AppendAllText(filename, json); gnfs.CurrentRelationsProgress.SmoothRelationsCounter += 1; relation.IsPersisted = true; } }
public static List <Relation> MultiplyLikeRoughNumbers(GNFS gnfs, List <Relation[]> likeRoughNumbersGroups) { List <Relation> result = new List <Relation>(); foreach (Relation[] likePair in likeRoughNumbersGroups) { var As = likePair.Select(lp => lp.A).ToList(); var Bs = likePair.Select(lp => lp.B).ToList(); int a = (int)(As[0] + Bs[0]) * (int)(As[0] - Bs[0]); //(int)Math.Round(Math.Sqrt(As.Sum())); uint b = (uint)(As[1] + Bs[1]) * (uint)(As[1] - Bs[1]); //(int)Math.Round(Math.Sqrt(Bs.Sum())); if (a > 0 && b > 0) { result.Add(new Relation(gnfs, a, b)); } } return(result); }
public Relation(GNFS gnfs, int a, uint b) : this() { A = a; B = b; AlgebraicNorm = Normal.Algebraic(A, B, gnfs.CurrentPolynomial); // b^deg * f( a/b ) RationalNorm = Normal.Rational(A, B, gnfs.PolynomialBase); // a + bm AlgebraicQuotient = BigInteger.Abs(AlgebraicNorm); RationalQuotient = BigInteger.Abs(RationalNorm); if (AlgebraicNorm.Sign == -1) { AlgebraicFactorization.Add(BigInteger.MinusOne); } if (RationalNorm.Sign == -1) { RationalFactorization.Add(BigInteger.MinusOne); } }
public PolyRelationsSieveProgress(GNFS gnfs, int smoothRelationsTargetQuantity, BigInteger valueRange) { _gnfs = gnfs; Relations = new RelationContainer(); A = 0; B = 3; ValueRange = valueRange; if (smoothRelationsTargetQuantity == -1) { SmoothRelations_TargetQuantity = SmoothRelationsRequiredForMatrixStep; } else { SmoothRelations_TargetQuantity = smoothRelationsTargetQuantity; } if (MaxB == 0) { MaxB = (uint)gnfs.PrimeFactorBase.AlgebraicFactorBaseMax; } }
public static void Free(ref GNFS gnfs) { if (gnfs.CurrentRelationsProgress.Relations.FreeRelations.Any(lst => lst.Any(rel => !rel.IsPersisted))) { List <List <Relation> > unsaved = gnfs.CurrentRelationsProgress.Relations.FreeRelations.Where(lst => lst.Any(rel => !rel.IsPersisted)).ToList(); foreach (List <Relation> solution in unsaved) { Serialization.Save.Object(solution, Path.Combine(gnfs.SaveLocations.SaveDirectory, $"!!UNSAVED__{nameof(RelationContainer.FreeRelations)}.json")); } } gnfs.CurrentRelationsProgress.Relations.FreeRelations.Clear(); gnfs.CurrentRelationsProgress.FreeRelationsCounter = 0; IEnumerable <string> freeRelations = Directory.EnumerateFiles(gnfs.SaveLocations.SaveDirectory, $"{nameof(RelationContainer.FreeRelations)}_*.json"); foreach (string solution in freeRelations) { List <Relation> temp = Load.Generic <List <Relation> >(solution); temp.ForEach(rel => rel.IsPersisted = true); gnfs.CurrentRelationsProgress.Relations.FreeRelations.Add(temp); gnfs.CurrentRelationsProgress.FreeRelationsCounter += 1; } }
public static void FactorBase(ref GNFS gnfs) { gnfs.SetPrimeFactorBases(); }
public PolyRelationsSieveProgress(GNFS gnfs, BigInteger valueRange) : this(gnfs, -1, valueRange) { }
public static void Gnfs(GNFS gnfs) { Save.Object(gnfs, gnfs.SaveLocations.GnfsParameters_SaveFile); }