Пример #1
0
 /// <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);
 }
Пример #2
0
        /// <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);
        }