public static Link FromNumber(long number) { if (number == 0) { return(Net.Zero); } if (number == 1) { return(Net.One); } var links = new Link[Bit.Count(number)]; if (number >= 0) { for (long key = 1, powerOf2 = 0, i = 0; key <= number; key *= 2, powerOf2++) { if ((number & key) == key) { links[i] = FromPowerOf2(powerOf2); i++; } } } else { throw new NotSupportedException("Negative numbers are not supported yet."); } var sum = Link.Create(Net.Sum, Net.Of, LinkConverter.FromList(links)); return(sum); }
private static void GenerateAlphabetBasis(ref Link alphabet, ref Link letterOfAlphabet, Link[] letters) { // Принцип, на примере латинского алфавита. //latin alphabet: alphabet that consists of a and b and c and ... and z. //a: letter of latin alphabet that is before b. //b: letter of latin alphabet that is between (a and c). //c: letter of latin alphabet that is between (b and e). //... //y: letter of latin alphabet that is between (x and z). //z: letter of latin alphabet that is after y. const int firstLetterIndex = 0; for (var i = firstLetterIndex; i < letters.Length; i++) { letters[i] = Net.CreateThing(); } var lastLetterIndex = letters.Length - 1; Link.Update(ref letters[firstLetterIndex], letterOfAlphabet, Net.ThatIsBefore, letters[firstLetterIndex + 1]); Link.Update(ref letters[lastLetterIndex], letterOfAlphabet, Net.ThatIsAfter, letters[lastLetterIndex - 1]); const int secondLetterIndex = firstLetterIndex + 1; for (var i = secondLetterIndex; i < lastLetterIndex; i++) { Link.Update(ref letters[i], letterOfAlphabet, Net.ThatIsBetween, letters[i - 1] & letters[i + 1]); } Link.Update(ref alphabet, Net.Alphabet, Net.ThatConsistsOf, LinkConverter.FromList(letters)); }