Nadat ze tientallen ongevraagde emails hadden ontvangen om hun onderzoeksresultaten te publiceren in het tijdschrift International Journal of Advanced Computer Technology1 (IJACT), dienden wetenschappers David Mazières en Eddie Kohler in 2014 uiteindelijk een manuscript in met de titel "Get me off Your Fucking Mailing List2".
Ze vielen letterlijk van hun stoel3 toen ze het bericht ontvingen dat het manuscript aanvaard was voor publicatie. Dit bevestigde immers hun stelling dat IJACT een roofzuchtig tijdschrift is, dat enkel uit is op het aanrekenen van publicatiekosten ten koste van strenge kwaliteitscontrole op hun wetenschappelijke publicaties. Mazières zei hierover:
Ze vroegen ons enkel om nog wat recentere referenties toe te voegen en de opmaak van de tekst hier en daar een beetje te herschikken. Maar verder zeiden ze dat het manuscript uitstekend geschikt was voor publicatie in het tijdschrift.
De auteurs weigerden om verder te gaan met het publicatieproces. Tot op heden kregen ze ook nog altijd geen bevestiging dat ze van de mailinglijst van het tijdschrift gehaald zijn.
Een essentiële stap in het bitflip-geheimschrift bestaat uit het omzetten van berichten die bestaan uit een reeks symbolen (letters, cijfers, leestekens en spaties) naar bitstrings die enkel bestaan uit een reeks bits: nul (0) of één (1). Hiervoor wordt gebruikgemaakt van een sleutel die aangeeft welke bitstring correspondeert met elk symbool. De sleutel wordt gegeven als een tekstbestand waarvan elke regel bestaat uit een symbool, gevolgd door een tab en de corresponderende bitstring. Met deze sleutel (sleutel.01.txt4)
R 010
C 1100
A 10
B 00
D 1101
kan bijvoorbeeld het bericht ABRACADABRA omgezet worden naar de bitstring
A B R A C A D A B R A
1000010101100101101100001010
Om deze lange bitstring terug om te zetten naar het corresponderende bericht, lijken we aan te lopen tegen het probleem dat de bitstrings voor de symbolen niet allemaal even lang zijn. Daardoor weten we niet hoe de langere bitstring moet opgedeeld worden in kortere bitstrings die met symbolen corresponderen. De sleutel is echter zo samengesteld dat geen enkele bitstring voor een symbool een prefix is van een bitstring voor één van de andere symbolen.
Een string $$s$$ is een prefix van een andere string $$t$$ als string $$t$$ begint met string $$s$$.
Een gevolg daarvan is dat de lange bitstring juist één prefix heeft die een bitstring is voor een symbool. In het voorbeeld is dat de prefix 10 die correspondeert met symbool A. Als we nu die prefix van de lange string weghalen, dan kunnen we het proces herhalen met de overblijvende bitstring, totdat die bitstring volledig verwerkt is. Dit is hoe we de lange bitstring stap voor stap kunnen omzetten naar de symbolen van het bericht ABRACADABRA:
lange bitstring | prefix | symbool |
---|---|---|
1000010101100101101100001010 | 10 | A |
00010101100101101100001010 | 00 | B |
010101100101101100001010 | 010 | R |
101100101101100001010 | 10 | A |
1100101101100001010 | 1100 | C |
101101100001010 | 10 | A |
1101100001010 | 1101 | D |
100001010 | 10 | A |
0001010 | 00 | B |
01010 | 010 | R |
10 | 10 | A |
Het bitflip-geheimschrift zelf werd vernoemd naar een bewerking op bitstrings: een bitflip zet een bitstring om naar een nieuwe bitstring door alle nullen (0) te vervangen door enen (1), en alle enen (1) door nullen (0). Zo wordt de bitstring 010110 door een bitflip omgezet in de bitstring 101001.
Het bitflip-geheimschrift werkt enkel met symmetrische sleutels: sleutels waarbij voor elke bitstring die correspondeert met een symbool ook de bitflip van die bitstring correspondeert met een symbool. De sleutel die we hierboven als voorbeeld gebruikt hebben, is echter asymmetrisch: bitstring 10 correspondeert met symbool A, maar de bitflip-bitstring 01 correspondeert niet met een symbool. We gebruiken daarom deze symmetrische sleutel (sleutel.02.txt5)
a 011011111
T 0110111101
s 100100000
g 10011
n 01100
e 110
010
f 001
o 1000
m 111
y 0110110
k 10010001
c 01101110
r 1001001
l 011010
. 1001000010
G 100101
t 000
i 101
u 0111
om uit te leggen hoe het bericht
Get me off your fucking mailing list.
gecodeerd wordt met het bitflip-geheimschrift. Eerst gebruiken we de sleutel om dit bericht om te zetten naar de corresponderende bitstring:
1001011100000101111100101000001001010011011010000111100100101000101110110111010010001101011001001101011101101111110101101010101100100110100110101011001000000001001000010
Daarna voeren we een bitflip uit op deze bitstring:
0110100011111010000011010111110110101100100101111000011011010111010001001000101101110010100110110010100010010000001010010101010011011001011001010100110111111110110111101
Ten slotte gebruiken we de sleutel om de bitstring terug om te zetten naar een bericht van symbolen:
lfmitfiueeiruoyieokc gnits G gniG amT
Dit is een stap die niet noodzakelijk zal lukken met een asymmetrische sleutel, maar wel met een symmetrische sleutel. Het bericht dat we op die manier bekomen is de gecodeerde versie van het originele bericht. Het gecodeerde bericht terug decoderen tot het originele bericht is heel eenvoudig: decoderen werkt op exact dezelfde manier als coderen.
Gevraagd wordt:
Schrijf een functie lees_sleutel waaraan de locatie (str) moet doorgegeven worden van een tekstbestand met de beschrijving van een sleutel $$\mathcal{S}$$. De functie moet de dictionaryvoorstelling van sleutel $$\mathcal{S}$$ teruggeven: een dictionary (dict) die elk symbool (str) van de sleutel afbeeldt op de correspondende bitstring (str).
Schrijf een functie symbolen2bits waaraan twee argumenten moeten doorgegeven worden: i) een bericht $$s$$ (str) dat bestaat uit een reeks symbolen en ii) de dictionaryvoorstelling (dict) van een sleutel $$\mathcal{S}$$. De functie mag ervan uitgaan dat alle symbolen van bericht $$s$$ voorkomen in sleutel $$\mathcal{S}$$, zonder dat dit expliciet moet gecontroleerd worden. De functie moet de bitstring $$b$$ (str) teruggeven die volgens sleutel $$\mathcal{S}$$ correspondeert met bericht $$s$$.
Schrijf een functie bits2symbolen waaraan twee argumenten moeten doorgegeven worden: i) een bitstring $$b$$ (str) en ii) de dictionaryvoorstelling (dict) van een sleutel $$\mathcal{S}$$. De functie mag ervan uitgaan dat bitstring $$b$$ volgens sleutel $$\mathcal{S}$$ correspondeert met een bericht $$s$$, zonder dat dit expliciet moet gecontroleerd worden. De functie moet bericht $$s$$ (str) teruggeven.
Schrijf een functie flip waaraan een bitstring $$b$$ (str) moet doorgegeven worden. De functie moet de bitstring (str) teruggeven die verkregen wordt door een bitflip uit te voeren op bitstring $$b$$.
Schrijf een functie issymmetrisch waaraan de dictionaryvoorstelling (dict) van een sleutel $$\mathcal{S}$$ moet doorgegeven worden. De functie moet een Booleaanse waarde (bool) teruggeven die aangeeft of $$\mathcal{S}$$ een symmetrische sleutel is.
Schrijf een functie codeer waaraan twee argumenten moeten doorgegeven worden: i) een bericht $$s$$ (str) dat bestaat uit een reeks symbolen en ii) de dictionaryvoorstelling (dict) van een sleutel $$\mathcal{S}$$. De functie mag ervan uitgaan dat alle symbolen van bericht $$s$$ voorkomen in sleutel $$\mathcal{S}$$, zonder dat dit expliciet moet gecontroleerd worden. Als $$\mathcal{S}$$ geen symmetrische sleutel is, dan moet een AssertionError opgeworpen worden met de boodschap asymmetrische sleutel. Anders moet de functie het bericht (str) teruggeven dat men bekomt door bericht $$s$$ te coderen volgens het bitflip-geheimschrift met sleutel $$\mathcal{S}$$.
Schrijf een functie decodeer waaraan twee argumenten moeten doorgegeven worden: i) een bericht $$s$$ (str) dat bestaat uit een reeks symbolen en ii) de dictionaryvoorstelling (dict) van een sleutel $$\mathcal{S}$$. De functie mag ervan uitgaan dat alle symbolen van bericht $$s$$ voorkomen in sleutel $$\mathcal{S}$$, zonder dat dit expliciet moet gecontroleerd worden. Als $$\mathcal{S}$$ geen symmetrische sleutel is, dan moet een AssertionError opgeworpen worden met de boodschap asymmetrische sleutel. Anders moet de functie het bericht (str) teruggeven dat men bekomt door bericht $$s$$ te decoderen volgens het bitflip-geheimschrift met sleutel $$\mathcal{S}$$.
In deze interactieve sessie gaan we ervan uit dat de tekstbestanden sleutel.01.txt6 en sleutel.02.txt7 zich in de huidige directory bevinden. Het zijn de twee sleutels die we ook in de beschrijving van deze opgave gebruikt hebben.
>>> sleutel = lees_sleutel('sleutel.01.txt8')
>>> sleutel['A']
'10'
>>> sleutel['R']
'010'
>>> sleutel['C']
'1100'
>>> symbolen2bits('ABRACADABRA', sleutel)
'1000010101100101101100001010'
>>> bits2symbolen('1000010101100101101100001010', sleutel)
'ABRACADABRA'
>>> flip('1000010101100101101100001010')
'0111101010011010010011110101'
>>> issymmetrisch(sleutel)
False
>>> codeer('ABRACADABRA', sleutel)
Traceback (most recent call last):
AssertionError: asymmetrische sleutel
>>> sleutel = lees_sleutel('sleutel.02.txt9')
>>> sleutel['G']
'100101'
>>> sleutel['e']
'110'
>>> sleutel[' ']
'010'
>>> sleutel['.']
'1001000010'
>>> symbolen2bits('Get me off your fucking mailing list.', sleutel)
'1001011100000101111100101000001001010011011010000111100100101000101110110111010010001101011001001101011101101111110101101010101100100110100110101011001000000001001000010'
>>> bits2symbolen('1001011100000101111100101000001001010011011010000111100100101000101110110111010010001101011001001101011101101111110101101010101100100110100110101011001000000001001000010', sleutel)
'Get me off your fucking mailing list.'
>>> flip('1001011100000101111100101000001001010011011010000111100100101000101110110111010010001101011001001101011101101111110101101010101100100110100110101011001000000001001000010')
'0110100011111010000011010111110110101100100101111000011011010111010001001000101101110010100110110010100010010000001010010101010011011001011001010100110111111110110111101'
>>> issymmetrisch(sleutel)
True
>>> codeer('Get me off your fucking mailing list.', sleutel)
'lfmitfiueeiruoyieokc gnits G gniG amT'
>>> decodeer('lfmitfiueeiruoyieokc gnits G gniG amT', sleutel)
'Get me off your fucking mailing list.'
In 2011 publiceerde het tijdschrift Journal of Physics A: Mathematical and Theoretical10 een artikel van M.V. Berry en zijn collega's met als titel "Can apparent superluminal neutrino speeds be explained as a quantum weak measurement?11". Dit is de abstract van het artikel:
Probably not.
In 1978 publiceerde J.C. Doyle "Guaranteed margins for LQG regulators12" in IEEE Transactions on Automatic Control13. De abstract van het artikel leest als:
There are none.
In 1962 publiceerde botanicus R. Moran een aantekening in het tijdschrift Madroño14 over een bepaalde struik die hij gevonden had op een bergtop in Baja California15 (Mexico). De titel was "Cneoridium dumosum (Nuttall) Hooker f. Collected March 26, 1960, at an Elevation of About 1450 Meters on Cerro Quemazón, 15 Miles South of Bahía de Los Angeles, Baja California, México, Apparently for a Southeastward Range Extension of Some 140 Miles16" en de volledige tekst van het artikel is
I got it there and then.
Dit wordt gevolgd door een dankwoord van 28 regels waarin Moran de persoon bedankt die de tekst heeft beoordeeld, zijn universiteitsprofessoren en de persoon die het manuscript heeft opgestuurd naar het tijdschrift.
Het loont zeker ook de moeite om de volledige tekst door te nemen van "The Unsuccessful Self-Treatment of a Case of 'Writer's Block'17", een artikel dat D. Upper in 1974 publiceerde in Journal of Applied Behavior Analysis18.
In 1962 ontvingen de botanische tuinen van Kew19, in het zuidwesten van Londen, een verbrande golfbal. Het hoofd van de afdeling mycologie, R.W.G. Dennis, moet vermoedelijk eens goed met zijn ogen gerold hebben: het lab had 10 jaar eerder een andere verbrande golfbal ontvangen, waarvan de afzender beweerd had dat het om een "zeldzame schimmelsoort" ging. Het personeel probeerde toen in eerste instantie sporen te verzamelen, voordat ze doorhadden dat het een grap was.
Twee keer uit zijn kot gelokt, reageerde Dennis met evenveel humor. Hij publiceerde een artikel met de titel "A Remarkable New Genus of Phalloid in Lancashire and East Africa20", waarin hij de golfballen formeel benoemde als een nieuwe schimmelsoort, Golfballia ambusta21, en waarin hij de exemplaren beschreef als
kleine, harde maar elastische ballen die gebruikt worden bij bepaalde stamrituelen van de Caledoniërs, die het hele seizoen plaatsvinden in omheinde paddocks met gedeeltelijk gemaaid gras
Toen in 1971 een derde verbrande golfbal arriveerde, werd deze ook in de collectie opgenomen, die nu de drie de ballen herbergt.
Dat creëert een soort dadaïstisch dilemma in de mycologie. Door de exemplaren te accepteren en een beschrijving te publiceren, had Dennis ze aantoonbaar geofficialiseerd als een echte soort. De precieze definitie van een schimmel is in de loop der tijden enigszins veranderd, maar door zijn artikel te publiceren, heeft Dennis misschien op satirische wijze vraagtekens gezet bij criteria die een niet-levende golfbal als soort accepteren. Maar wat is de oplossing? Sommige specialisten hebben aangevoerd dat schimmels gedefinieerd moeten worden als "micro-organismen die bestudeerd worden door mycologen". Maar in dat geval, zegt mycoloog Nathan Smith22, is de echte vraag die we ons moeten stellen: "Wat is een mycoloog?"