/// <summary> /// данная функция создает новый блок псевдослучайных элементов последовательности из предыдущих. /// в двумерном массиве ключа в первой строке хранится коефициент /// во второй значение /// коэфициент*значание=новый элемент /// </summary> /// <param name="coefficients"></param> /// <param name="key"></param> public static void sequence(int[,] coefficients, LimitedSizeStack <int> key) { key.Restore(); for (int i = 0; i < coefficients.GetLength(1); i++) { int newElementSequence = 0; for (var j = 0; j <= coefficients.GetLength(0); j++) { var multiplier = key.PopLast(); newElementSequence += coefficients[0, j] * multiplier; } key.Restore(); key.Push(newElementSequence % Languege.z); } }
public string Decode(WordAndKey <int[, ]> element) { var numberLitera = Converter.ConvertWordToCode(element.Word);//TODO: может стоит объединить это в отдельный статический класс? var keyLitera = new LimitedSizeStack <int>(element.Key.GetLength(1)); for (var i = 0; i < element.Key.GetLength(1); i++) { keyLitera.Push(element.Key[1, i]); } foreach (var nL in numberLitera) { element.Encoded = Convert.ToString(FindValue.Findvalue((nL - keyLitera.PopFirst()) % Languege.z)); if (keyLitera.Count == 0) { Generate.sequence(element.Key, keyLitera); } } return(element.Encoded); }
public string Code(WordAndKey <int[, ]> element)//TODO: понять, как реализовать в других системах исчисления { var numberLitera = Converter.ConvertWordToCode(element.Word); var keyLitera = new LimitedSizeStack <int>(element.Key.GetLength(1)); for (var i = 0; i < element.Key.GetLength(1); i++) { keyLitera.Push(element.Key[1, i]); } foreach (var nL in numberLitera) { element.Encoded = Convert.ToString(FindValue.Findvalue((nL + keyLitera.PopFirst()) % Languege.z)); if (keyLitera.Count == 0) { Generate.sequence(element.Key, keyLitera); } } return(element.Encoded); }
public static List <int> PseudorandomSequence(int[,] basisOfSequence) { var result = new List <int>(); var generator = new LimitedSizeStack <int>(basisOfSequence.GetLength(1)); for (var i = 0; i < basisOfSequence.GetLength(1); i++) { generator.Push(basisOfSequence[1, i]); } for (var i = 0; i < 100; i++) { result.Add(generator.PopFirst() % Languege.z); if (checkRepetition(result, basisOfSequence, i)) { result.RemoveRange(result.Count - basisOfSequence.GetLength(1), basisOfSequence.GetLength(1)); return(result); } if (generator.Count == 0) { sequence(basisOfSequence, generator); } } return(result); }