Верно ли нахожу Индекс совпадений для отдельной буквы и общий в шифре Виженера?

Пытаюсь определить длину в тексте, зашифрованном Виженером. Правильно ли я нахожу Индекс Совпадений для отдельной буквы, формула: n*(n-1)/L*(L-1) для каждой буквы. Где n - число раз, когда буква встречается в строке, L - длина строки. Просто по итогу, если буква встречается всего один раз, то её ИС будет = 0, нормально ли это?

Так же, подскажите, верно ли я понял, что общий ИС всей строки будет средним арифметическим всех ИС букв?

Заранее спасибо за помощь.


Ответы (1 шт):

Автор решения: kos channel

Формула используется верно. ИС для каждой длины ключа находится по ней. Пример реализации на C++:

for (int key_length = 2; key_length <= max_key_length; key_length++)
{
    int tmp_counter = 0;
    string substr_result;
    for (int i = 0; i < strlen(encoded_text.c_str()); i++)
    {
        if (++tmp_counter % key_length == 0)
            substr_result += encoded_text[i];
    }

    pair<int, string> _p = pair<int, string>(key_length, substr_result);
    key_length_and_substring.push_back(_p);
}
→ Ссылка