/// <summary> /// Определяет, удовлетворяет ли заданная функция критерию распространения заданной степени. /// </summary> /// <param name="Source">Исходная функция.</param> /// <param name="l">Степень критерия.</param> /// <returns></returns> public static bool HasSAC(BinaryFunction Source, int l) { if (l > Source.CountOfVariables) { throw new InvalidOperationException("Число l не должно превышать числа аргументов функции."); } if (l <= 1) { throw new InvalidOperationException("Число l должно быть больше единицы."); } for (int i = 0; i < Source.ValuesArray.Length; i++) { bool[] CurrentSet = Misc.Misc.GetBinaryArray(i, Source.CountOfVariables); int Weight = CurrentSet.Count(val => val); if (Weight >= l || Weight == 0) { continue; } if (!Source.GetDerivativeInDirection(CurrentSet).IsEquilibrium) { return(false); } } return(true); }
/// <summary> /// Определяет наивысшую степень критерия распространения для заданной функции. /// </summary> /// <param name="Source">Исходная функция.</param> /// <returns></returns> public static int GetMaxSACValue(BinaryFunction Source) { for (int l = 2; l < Source.CountOfVariables; l++) { for (int i = 0; i < Source.ValuesArray.Length; i++) { bool[] CurrentSet = Misc.Misc.GetBinaryArray(i, Source.CountOfVariables); int Weight = CurrentSet.Count(val => val); if (Weight != l) { continue; } if (!Source.GetDerivativeInDirection(CurrentSet).IsEquilibrium) { return(l - 1); } } } return(Source.CountOfVariables); }