The Voynich Ninja
Voynichese is a numeric cipher? - Printable Version

+- The Voynich Ninja (https://www.voynich.ninja)
+-- Forum: Voynich Research (https://www.voynich.ninja/forum-27.html)
+--- Forum: Theories & Solutions (https://www.voynich.ninja/forum-58.html)
+--- Thread: Voynichese is a numeric cipher? (/thread-5798.html)

Pages: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20


RE: Voynichese is a numeric cipher? - ololololo - 02-08-2026

(02-08-2026, 03:38 PM)JoJo_Jost Wrote: You are not allowed to view links. Register or Login to view.No, I just meant that a little structure would help your approach. Then people might understand better what you're doing.
But I have to agree here...


RE: Voynichese is a numeric cipher? - ololololo - 03-08-2026

¡Experiment!*

I assumed that if we know the principle of letter alignment (which is probably similar to alphabetical alignment, but in the form of Roman numerals), we can generally match the unknown numbers with letters and enjoy the result.
I took the most "convenient" passage for this experiment - the first line of f6v, which clearly depicts the ricinus.
koary sar cheekar qoar shor chapchy s chear char otchy
You can see sequences of ar that are comparable to the series of numbers "XXV XV IV". There are only 10 words, so the original word should have about the same number of letters.This number includes the Bavarian (and apparently German traditional) name for the ricinus - Wunderbaam.
The following picture is emerging:
koary - W
sar - U/V
cheekar - R
qoar - N
shor - M
chapchy - E
s - D
chear - B
char - A
otchy - A
Unclear...
By the way, it could also be ricin9 if --us is encrypted as a single character. In this case, the ricin9 part is the words before the s.
What can be seen from the German translation: the parts chear (B) and char (A) can indeed be such, assuming that che follows ch (perhaps B = II and A = I. By the way, this might also be a trick - replacing numbers with similar ones, i.e. n/y with ch. But I don't know). The sar part (U/V) should then be equal to 20. So, oar = sar, it turns out that o = s. Perhaps this is 15?
But we have s = D, and D = 4. Even more confusing...
For some reason, this example gives me the impression that the peculiarity of the VMS cipher and its difference from a simple substitution is that it allows the same number (or letter) to be written in different ways. Perhaps these are simply two different alphabets that differ from each other in their numerical values, which alternate with each other. Alternatively, they may be the same numbers in principle, but written in different forms (for example, XV could be written as VVV or VVIV). Perhaps (almost as in my cipher), the principle of polyphonic encryption applies, which makes s equal to 15 somewhere and 4 somewhere else.

At the moment, I can't say for sure...

* This header means that everything below is highly questionable.


RE: Voynichese is a numeric cipher? - ololololo - 07-08-2026

The previous example made me think that ar is probably null, just like ch in my cipher.
It only appears at the end of words. But in the word koary, it comes before the supposed unit y. Perhaps in the word koary this is true, while in the rest of the sequence it is superfluous.
It can also be with ch at the end of the line.
A possible cleaned-up version of the line:
koary s eek qo shor ?chapchy? s ear ar oty
Well, that’s not entirely accurate, and I don’t know what to do with the word chapchy. But something like that.
It can be observed that s are located in different places, with the first one having a null ar. This may indicate that the second s is a space between words.

According to this logic, at least the second ch in the word chapchy could also be null. But it’s still unclear how to properly “clean” this word.

By the way, here’s another way to use my mini‑cipher — to compare it with the text. In any case, the meanings of the letters in it roughly correspond to the arrangement of the letters in VMS (for example, the number oiin will be closer to the beginning, but or can appear anywhere in combination with ch).


RE: Voynichese is a numeric cipher? - ololololo - 08-08-2026

What speaks to me most about Voynichese in terms of numbers is the phenomenon of “sequences,” when a symbol or combination, unchanged or with only minor variations, repeats throughout the entire line in the words:
   
In the 17th line, at the end, there are daiin dy. Sorry, but this also somehow resembles the sequences of my cipher and fits into them — XIII VI Smile
The single y at the end of 6th line also seems suspicious to me...


RE: Voynichese is a numeric cipher? - JoJo_Jost - 08-08-2026

@ Olololo that ist normal... u find this in other languages, too


RE: Voynichese is a numeric cipher? - ololololo - 08-08-2026

(08-08-2026, 12:58 PM)JoJo_Jost Wrote: You are not allowed to view links. Register or Login to view.that ist normal... u find this in other languages, too
Which ones?
I’ve sometimes come across examples in languages where one word ends with the same letter that the next one starts with (e.g., “eat toffee”). However, this feature is characteristic of almost the entire Voynich manuscript.
The only similar linguistic phenomenon I know of is tongue twisters. But VMS isn’t a set of tongue‑twisters, right?


RE: Voynichese is a numeric cipher? - ololololo - 08-08-2026

I changed the alphabet (removed j) and made a couple of small changes.

Code:
import random def letter_to_num(letter):     letter = letter.upper()     if letter == 'J':         return None     if letter in ['U', 'V']:         return 20     if 'A' <= letter < 'J':         return ord(letter) - ord('A') + 1     if 'K' <= letter <= 'Z':         return ord(letter) - ord('A')     return None def num_to_roman_tokens(num):     tokens = []     roman_rules = [         (22, 'XXII'), (21, 'XXI'), (20, 'XX'), (19, 'XIX'),         (18, 'XVIII'), (17, 'XVII'), (16, 'XVI'), (15, 'XV'),         (14, 'XIV'), (13, 'XIII'), (12, 'XII'), (11, 'XI'),         (10, 'X'), (9, 'IX'), (8, 'VIII'), (7, 'VII'),         (6, 'VI'), (5, 'V'), (4, 'IV'), (3, 'III'),         (2, 'II'), (1, 'I')     ]     for val, sym in roman_rules:         while num >= val:             tokens.append(sym)             num -= val     return tokens def encrypt_word(word):     numbers = [letter_to_num(l) for l in word if letter_to_num(l) is not None]     if not numbers:         return word     numbers.sort(reverse=True)     raw_tokens = []     for num in numbers:         raw_tokens.extend(num_to_roman_tokens(num))     separate_last_i = False     if len(raw_tokens) >= 2 and raw_tokens[-2] == 'III' and raw_tokens[-1] == 'I':         separate_last_i = True         raw_tokens.pop()     encrypted_tokens = []     is_standalone_xx = len(raw_tokens) == 1 and raw_tokens[0] == 'XX'     i = 0     while i < len(raw_tokens):         token = raw_tokens[i]         if token == 'XV' and i + 1 < len(raw_tokens) and raw_tokens[i+1] == 'XV':             encrypted_tokens.append("che")             i += 2             continue         if token == 'XVI':             if i + 1 < len(raw_tokens):                 next_token = raw_tokens[i+1]                 if next_token.startswith('XV') or next_token.startswith('X') or next_token.startswith('V'):                     if next_token == 'XV':                         encrypted_tokens.append("q")                         i += 2                         continue                     else:                         encrypted_tokens.append("qo")                         i += 1                         continue             encrypted_tokens.append("s")             i += 1             continue         if token == 'XXII': encrypted_tokens.append("chol")         elif token == 'XXI': encrypted_tokens.append("chor")         elif token == 'XIX':             prefix = random.choices(["ch", "yt", "yk"], weights=[60, 20, 20])[0]             encrypted_tokens.append(f"{prefix}eor")         elif token == 'XVIII': encrypted_tokens.append("oiin")         elif token == 'XVII': encrypted_tokens.append("cph")         elif token == 'XX': encrypted_tokens.append("sh" if is_standalone_xx else "ch")         elif token == 'XV': encrypted_tokens.append("o")         elif token == 'XIV': encrypted_tokens.append("oke")         elif token == 'XIII': encrypted_tokens.append("daiin")         elif token == 'XII': encrypted_tokens.append("dan")         elif token == 'XI': encrypted_tokens.append("ey")         elif token == 'IX':             base = random.choices(["or", "ol"], weights=[60, 40])[0]             prefix = random.choices(["ch", "yk", "yt"], weights=[80, 10, 10])[0]             encrypted_tokens.append(f"{prefix}{base}")         elif token == 'VIII': encrypted_tokens.append("aiin")         elif token == 'VII': encrypted_tokens.append("ain")         elif token == 'VI': encrypted_tokens.append("an")         elif token == 'IV': encrypted_tokens.append("ok")         elif token == 'X': encrypted_tokens.append("e")         elif token == 'V': encrypted_tokens.append("a")         elif token == 'III': encrypted_tokens.append("iin")         elif token == 'II': encrypted_tokens.append("in")         elif token == 'I':             current_word_str = "".join(encrypted_tokens)             if current_word_str and current_word_str[-1] in ['a', 'o']:                 encrypted_tokens.append("n")             else:                 encrypted_tokens.append("y")         i += 1     # Объединение ok/ot, a, in/iin в okaiin/otaiin     has_ok_ot = None     ok_ot_idx = -1     for idx, t in enumerate(encrypted_tokens):         if t in ["ok", "oke"]:             has_ok_ot = "ok"             ok_ot_idx = idx             break         elif t == "ot":             has_ok_ot = "ot"             ok_ot_idx = idx             break     a_idx = encrypted_tokens.index("a") if "a" in encrypted_tokens else -1     in_idx = -1     for idx, t in enumerate(encrypted_tokens):         if t in ["in", "iin"]:             in_idx = idx             break     if ok_ot_idx != -1 and a_idx != -1 and in_idx != -1:         combined = f"{has_ok_ot}aiin"         indices = sorted([ok_ot_idx, a_idx, in_idx], reverse=True)         first_idx = indices[-1]         for idx in indices:             encrypted_tokens.pop(idx)         encrypted_tokens.insert(first_idx, combined)     if separate_last_i:         current_word_str = "".join(encrypted_tokens)         last_i_char = "n" if current_word_str and current_word_str[-1] in ['a', 'o'] else "y"         encrypted_tokens.append(last_i_char)     if encrypted_tokens and encrypted_tokens[-1] == "n":         encrypted_tokens[-1] = "y"     if len(encrypted_tokens) >= 2 and encrypted_tokens[-2] == "a" and encrypted_tokens[-1] == "y":         encrypted_tokens[-2] = "d"     if encrypted_tokens:         if encrypted_tokens[-1] == "a":             encrypted_tokens[-1] = "g"         elif encrypted_tokens[-1].endswith("a"):             encrypted_tokens[-1] = encrypted_tokens[-1][:-1] + "g"     encrypted_str = " ".join(encrypted_tokens)     return encrypted_str def encrypt_text(text):     words = text.split()     encrypted_words = [encrypt_word(w) for w in words]     return " /// ".join(encrypted_words) print(encrypt_text("OO")) print(encrypt_text("PE")) print(encrypt_text("PO")) my_text = "YOUR TEXT" print(encrypt_text(my_text))



RE: Voynichese is a numeric cipher? - bi3mw - 08-08-2026

It would be better if you put the code inside the code - tag (formatting).


RE: Voynichese is a numeric cipher? - ololololo - 09-08-2026

(08-08-2026, 10:39 PM)bi3mw Wrote: You are not allowed to view links. Register or Login to view.It would be better if you put the code inside the code - tag (formatting).
I don’t know how to do this, sorry


RE: Voynichese is a numeric cipher? - bi3mw - 09-08-2026

When you write or edit a new post, you'll find a “Code” button in the menu bar. This button inserts a “code start” and “code end” tag. You can paste your code between them.