39 if (text == NULL || *text ==
'\0')
return 0;
42 static const double ENGLISH_FREQ[26] = {
43 8.17, 1.49, 2.78, 4.25, 12.70, 2.23, 2.02, 6.09, 6.97, 0.15,
44 0.77, 4.03, 2.41, 6.75, 7.51, 1.93, 0.10, 5.99, 6.33, 9.06,
45 2.76, 0.98, 2.36, 0.15, 1.97, 0.07
51 for (
size_t i = 0; text[i] !=
'\0'; i++) {
52 if (isalpha((
unsigned char)text[i])) {
53 counts[toupper((
unsigned char)text[i]) -
'A']++;
57 if (total == 0)
return 0;
61 double best_chi = 1e18;
63 for (
int s = 0; s < 26; s++) {
65 for (
int i = 0; i < 26; i++) {
67 double observed = (double)counts[(i + s) % 26];
68 double expected = ENGLISH_FREQ[i] / 100.0 * (double)total;
69 double delta = observed - expected;
70 if (expected > 0) chi += (delta * delta) / expected;