Project Plan

The Tudor Rose

This website initially launched on January 22, 2023, the birthday of Sir Francis Bacon, and in this year which marks the 400th anniversary of his masterpiece, The Advancement of Learning, one of the foundational documents of Anglo-American Civilization.

This project will perform and present, using advanced technology, a series of Experiments which will analyze the 1623 First Folio of William Shakespeare in a way not previously attempted. It will expose some of the secret messages that Sir Francis concealed for us in another of the most important documents in the history of the English Language, The First Folio of William Shakespeare. These two ultra-classic works were published only 30 days apart from each other in 1623. A coincidence? What a month for Anglo-American Civilization!

The Advancement of Learning (1623)
First Folio of William Shakespeare (1623)

The name of Sir Francis is cryptically embedded within The First Folio, as co-author, in literally hundreds of places. This website will provide visualizations of some of these instances, which have previously been identified by others. More importantly, it will expose some of his hidden, encrypted messages in a way not seen before.

The Experiments will be performed using the entry-level tier of facilities available, for free, from Google’s Colaboratory (Colab) online service. Cloud-based Colab makes available vast computing resources to researches for free. Colab executes programs packaged as Jupyter Notebooks, which perform Data Science experiments, and, with reformatting, archive the results in a way which can be viewed as pages on a website such as this (ordinary HTML documents).

Illustrated below are the Jupyter Notebooks of the first two Experiments, in their initial forms. Final forms might still be months in the future, but these will provide an idea of how real this project’s progress is. They are coded in the Python programming language.


Decoding the ‘Prologue to Troilus and Cressida’

In [66]:
notebook_filename = 'T & C Message Decode 1623_v33.ipynb' 
from google.colab import drive
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
In [67]:
import os
import csv
import pandas as pd
import shutil
import datetime
In [68]:
# Project Purpose:
# Decoding the message secretly embedded in the text of the Shakespearen play,
#'Trolious and Cressida'
# by Sir Francis Bacon, using his Biliteral Cipher (Binary Code) as described 
# in his 1623 book, The Advancement of Learning.
project_name = 'T & C Prologue Decode 1623'
# Derive input and output directories:
# Root Directory for project content on Google Drive:
content_dir = '/content/drive/MyDrive'
project_dir = content_dir + '/' + project_name 
data_upload_dir = project_dir + '/text data to upload - tsv/upload/'
In [69]:
#Input File path (1 total):
input_filename = 'v21.tsv'
data_upload_file = os.path.join(data_upload_dir, input_filename)
In [70]:
#Output File Directory paths (5 total):
original_text_dir = project_dir + '/original text - csv/' 
biliterals_dir = project_dir + '/biliterals - csv/' 
output_data_table_dir = project_dir + '/output data table - csv/' 
decoded_message_dir = project_dir + '/decoded message - csv/'
notebook_dir = project_dir + '/notebook - ipynb/'
archive_dir = project_dir + '/archive - zip/'
In [71]:
if os.path.isfile(data_upload_file):
if os.path.isdir(original_text_dir):
if os.path.isdir(biliterals_dir):
if os.path.isdir(output_data_table_dir):
if os.path.isdir(decoded_message_dir):
if os.path.isdir(notebook_dir):
if os.path.isdir(archive_dir):
/content/drive/MyDrive/T & C Prologue Decode 1623/text data to upload - tsv/upload/v21.tsv
/content/drive/MyDrive/T & C Prologue Decode 1623/original text - csv/
/content/drive/MyDrive/T & C Prologue Decode 1623/biliterals - csv/
/content/drive/MyDrive/T & C Prologue Decode 1623/output data table - csv/
/content/drive/MyDrive/T & C Prologue Decode 1623/decoded message - csv/
/content/drive/MyDrive/T & C Prologue Decode 1623/notebook - ipynb/
/content/drive/MyDrive/T & C Prologue Decode 1623/archive - zip/
In [72]:
import datetime
now =
output_filename = now.strftime("%Y-%m-%d_%H-%M-%S")
#print (output_filename)
In [73]:
# Decode a five bit binary word into an English Alphabet letter.
# There were 22 letters in the Elizabethan English Alphabet:
#   'I' = 'J'
#   'U' = 'V'
# therefore 5 binary digits are more than enough, 2 (exp) 5 = 32
def decode_biliteral(which):
  decode = {
  'aaaaa': 'a',
  'aaaab': 'b',
  'aaaba': 'c',
  'aaabb': 'd',
  'aabaa': 'e',
  'aabab': 'f',
  'aabba': 'g',
  'aabbb': 'h',
  'abaaa': 'i',
  'abaab': 'k',
  'ababa': 'l',
  'ababb': 'm',
  'abbaa': 'n',
  'abbab': 'o',
  'abbba': 'p',
  'abbbb': 'q',
  'baaaa': 'r',
  'baaab': 's',
  'baaba': 't',
  'baabb': 'v',
  'babaa': 'w',
  'babab': 'x',
  'babba': 'y',
  'babbb': 'z'
  which_letter = decode[which]
  return which_letter
In [74]:
# Read the input text data from the .tsv file:
input_data_table = pd.read_csv(data_upload_file, sep='\t', header=None)
/content/drive/MyDrive/T & C Prologue Decode 1623/text data to upload - tsv/upload/v21.tsv
In [75]:
# De-interlace the original text from the book page text, and store it separately:
original_text = input_data_table.iloc[0::3, :]
ot_path = original_text_dir + output_filename + '.csv'
original_text.to_csv (ot_path, index = None, header=True) 
In [76]:
# De-interlace the biliterals (an 'a' or 'b' quintet) from the book page text, and store it separately:
biliterals = input_data_table.iloc[1::3, :]
blt_path = biliterals_dir + output_filename + '.csv'
biliterals.to_csv (blt_path, index = None, header=True) 
In [77]:
# Make a copy of the input data frame, and write rows of decoded biliterals into it:
output_encoded_dataframe = input_data_table.copy(deep=True)
encoded_text_size = 0
original_text_letters = ''
for row in range(2,45,3):
  for column in range(14):
    letter = output_encoded_dataframe.loc[row - 2,column] 
    biliteral = output_encoded_dataframe.loc[row - 1,column] 
    which_letter = decode_biliteral(biliteral)
    output_encoded_dataframe.loc[row,column] = which_letter
    encoded_text_size += 5
    original_text_letters += letter
odt_path = output_data_table_dir + output_filename + '.csv'
output_encoded_dataframe.to_csv (odt_path, index = None, header=True) 
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 ThePr olugu eINTr oyThe relye sthes ceneF romIl esofG reece ThePr inces Orgil loust
1 aabab baaaa aaaaa abbaa aaaba abaaa baaab baaab baaba aaaaa ababa aaaab aaaaa abbaa
2 f r a n c i s s t a l b a n
3 heirh ighbl oodch afdHa uetot hepor tofAt henss entth eirsh ippes Fraug htwit hthem
4 aaabb aabaa baaab aaaba aabaa abbaa aaabb aabaa aaabb aabab baaaa abbab ababb baaba
5 d e s c e n d e d f r o m t
6 inist ersan dinst rumen tsOfe ruell Warre Sixty andni netha twore Their Crown etsRe
7 aabbb aabaa ababb abaaa aabba aabbb baaba babba aabbb aabaa baaaa abbab aabaa baaab
8 h e m i g h t y h e r o e s
9 galif romth Athen ianba yPutf ortht oward Phyrg inand their vowis madeT orans ackeT
10 abbab aabab baaba baaaa abbab babba ababa abbab baabb abaaa abbaa aabba aaaaa abbaa
11 o f t r o y l o v i n g a n
12 roywi thinw hoses trong emure sTher auish dHele nmene lausQ ueene Withw anton Paris
13 aaabb baaaa aabaa baabb aabaa baaaa abaaa abbaa aabba baaba aabbb aabaa baaab aabaa
14 d r e v e r i n g t h e s e
15 sleep esand thats theQu arrel lToTe nedos theye omeAn dthed eeped rawin gBark edoth
16 abbaa abbab aaaab ababa aabaa aaaaa abbaa aaaba aabaa baaab baaba abbab baaaa baaab
17 n o b l e a n c e s t o r s
18 eredi sgorg eThei rwarl ikefr autag enowo nDard anPla inesT hefre shand yetva bruis
19 aabbb abaaa aaabb abaaa abbaa aabbb abaaa baaab babaa baaaa abaaa baaba abaaa abbaa
20 h i d i n h i s w r i t i n
21 edGre ekesd opite hThei rbrau ePaui llion sPria mssix gated CityD ardan AndTi mbria
22 aabba baaab aabbb abbab ababb aabaa baaaa baaab abaaa ababa ababa abaaa aaaaa aaabb
23 g s h o m e r s i l l i a d
24 Helia sChet asTro ienAn dAnte nonid nswit hmass ieSta plesA ndcor respo nsine andfu
25 baaab aaaaa abbaa aaabb abbab aaabb babba baaab baaab aabaa babba abaaa abbaa aaaba
26 s a n d o d y s s e y i n c
27 lfill imgBo ltsSt irrev ptheS ohnes ofTro yNowE xpect ation tickl ingsk ittis hspir
28 abaaa abbba aabbb aabaa baaaa babaa abaaa baaba aabbb baaba aabbb aabaa aaaaa aabaa
29 i p h e r w i t h t h e a e
30 itsOa onean dothe rside Troia nandG reeke Setsa Honh azard Andhi thera mJeom eAPro
31 abbaa aabaa abaaa aaabb abbab aabab baaba aabbb aabaa abbaa abbab aaaab ababa aabaa
32 n e i d o f t h e n o b l e
33 logue armdb utnot incon fiden eeOfA uthor speno rAeto rsvoy eebut suite dJuli keeon
34 baabb abaaa baaaa aabba abaaa ababa abbba baaaa abaaa abbaa aaaba aabaa abbab aabab
35 v i r g i l p r i n c e o f
36 ditio nsaso urArg ument Totel lyouf aireB ehold ersth atour PlayL eapes preth evann
37 ababa aaaaa baaba abaaa abbaa abbba abbab aabaa baaba baaab abaaa abbaa baaab aaaba
38 l a t i n p o e t s i n s c
39 tandf irstl ingso fthos ebroy lesBe ginni ngint hemid dlest artin ghten eeawa yTowh
40 baaaa abaaa aaaab abaaa abbaa aabba baaba aabbb aabaa ababa aabaa baaba baaba aabaa
41 r i b i n g t h e l e t t e
42 atmay bedig ested inaPl ayLik corfi ndefa ultdo asyon rplea sures areNo wgood orbad
43 baaaa baaab baaba abbab aabaa ababa abaaa babbb aaaaa aaaab aabaa baaba aabbb baaaa
44 r s t o e l i z a b e t h r
45 tisbu tthee hance ofWar NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
46 aabab baaab baaba aaaaa NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
In [78]:
decoded_message = ''
biliteral_values = ''
with open(decoded_message_dir + '.csv', 'w') as new_f:
  for row in range(0,15,1):
    for column in range(14):
      biliteral = biliterals.iloc[row, column]
      which_letter = decode_biliteral(biliteral)
      decoded_message += which_letter
      biliteral_values += biliteral 
print('Encoded Text Size: ' + str(encoded_text_size))
print('Biliterals Text Size: ' + str (len(biliteral_values)))
print('Decoded Text Size: ' + str(len(decoded_message)))
print('Raw Decoded Message: ' + decoded_message)
Encoded Text Size: 1050
Biliterals Text Size: 1050
Decoded Text Size: 210
Raw Decoded Message: francisstalbandescendedfromthemightyheroesoftroylovingandreveringthesenobleancestorshidinhiswritingshomersilliadsandodysseyincipherwiththeaeneidofthenoblevirgilprinceoflatinpoetsinscribingtheletterstoelizabethr

Dividing the raw decoded text string into Words using spaces:

francis st alban descended from the mighty heroes of troy loving and revering these noble ancestors hid in his writings homers illiads and odyssey in cipher with the aeneid of the noble virgil prince of latin poets inscribing the letters to elizabeth r

Providing basic styling to the message text:

Francis St. Alban,
Descended from the mighty heroes of Troy,
Loving and revering these noble ancestors,
hid in his writings
Homer’s Illiads and Odyssey, in cipher,
with the Aeneid of the noble Virgil,
Prince of Latin poets,
Inscribing the letters to:
Elizabeth, R

In [79]:
!jupyter nbconvert --to html '/content/drive/MyDrive/Colab Notebooks/T_&_C_Message_Decode_1623_v33.ipynb'
[NbConvertApp] Converting notebook /content/drive/MyDrive/Colab Notebooks/T_&_C_Message_Decode_1623_v33.ipynb to html
[NbConvertApp] Writing 318822 bytes to /content/drive/MyDrive/Colab Notebooks/T_&_C_Message_Decode_1623_v33.html
Scroll to Top
Scroll to Top