Donald Knuth â en forskare inom datavetenskap som bryr sig sĂ„ mycket om korrektheten i sina böcker att han erbjuder en hex dollar ($2,56, 0x$1,00) för varje "fel" som hittas, dĂ€r ett fel betraktas som allt som Ă€r "tekniskt, historiskt, typografiskt eller politiskt felaktigt". Jag ville verkligen fĂ„ en check frĂ„n Knuth, sĂ„ jag bestĂ€mde mig för att leta efter fel i hans framstĂ„ende verk "Programmeringens konst" (TAOCP). Jag lyckades hitta tre. Trots allt, Knuth skickade en check pĂ„ 0x$3,00.

Som ni ser, Àr detta ingen riktig check. Tidigare skickade Knuth verkliga checkar, men han slutade med det Är 2008 pÄ grund av . Nu skickar han ut "personliga insÀttningscertifikat" frÄn (BoSS). Han sÀger att han Àr beredd att skicka verkliga pengar om det behövs, men det verkar vara för besvÀrligt.
Jag hittade tvÄ typografiska fel och ett historiskt fel. Jag listar dem i ordning av minskande trivialitet.
Typografiskt fel #1
Det första typografiska felet â pĂ„ sidan 392 av den tredje volymen "Sortering och sökning", den Ă„ttonde raden frĂ„n botten: "Efter en misslyckad sökning Ă€r det ibland (sometime) önskvĂ€rt att infoga en ny post i tabellen, som innehĂ„ller K; metoden som gör detta kallas för sök- och infogningsalgoritmen. Felet Ă€r att istĂ€llet för sometime bör vara sometimes.
SjÀlvklart Àr det inget förvÄnande med ett sÄdant fel. Det finns sÀkert flera skrivfel i denna artikel (inga belöningar för att hitta dem). Det som verkligen Àr förvÄnande Àr att det har tagit sÄ lÄng tid att upptÀckas. Sida 392 Àr inte djupt begravd i matematikkapitlet, det Àr den allra första sidan i det sjÀtte kapitlet "Sökning"! Kanske en av de mest lÀsta delarna av boken. Teoretiskt sett borde det finnas minst fel dÀr, men nej.
Förresten, om du nÄgonsin har övervÀgt att lÀsa TAOCP, gör det. MÄnga sÀger att det Àr en referensbok, inte avsedd för direkt lÀsning, men det Àr inte sant. Författaren har en tydlig Äsikt och en unik stil. Det enda som hindrar lÀsbarheten Àr komplexiteten i matematik. Men det finns en enkel lösning: lÀs tills du nÄr matematiken som du inte förstÄr, hoppa över den och gÄ till nÀsta avsnitt som du kan förstÄ. Genom att lÀsa pÄ det sÀttet hoppar jag över minst 80% av boken, men de resterande 20% Àr fantastiska!
Det sÀgs ocksÄ att TAOCP Àr irrelevant, förÄldrad eller pÄ annat sÀtt oanvÀndbar för "verklig programmering". Det Àr ocksÄ falskt. Till exempel, i första avsnittet efter introduktionen diskuteras sökningen av ett element i en osorterad array. Den enklaste algoritmen Àr bekant för alla programmerare. Starta pekaren i början av arrayen och utför sedan följande steg i en loop:
- Kontrollera om det nuvarande elementet Àr det önskade. Om sÄ Àr fallet, returnera det; annars
- Kontrollera om pekaren Àr utanför arrayen. Om sÄ Àr fallet, returnera ett fel; annars
- Ăka pekaren och fortsĂ€tt.
Nu, lÄt oss övervÀga: hur mÄnga grÀnskontroller krÀver denna algoritm, i genomsnitt? I vÀrsta fall, nÀr arrayen inte innehÄller elementet, krÀvs en kontroll för varje element i listan, och i genomsnitt kommer det att se ut som
. En smartare sökalgoritm kan klara sig med bara en grÀnskontroll. FÀst det önskade elementet i slutet av arrayen, starta sedan pekaren i början av arrayen och utför följande steg i en loop:
- Kontrollera om det nuvarande elementet Àr det önskade. Om sÄ Àr fallet, returnera svaret om pekaren Àr inom arrayens grÀnser, eller ett fel om den inte Àr det. Annars
- Ăka pekaren och fortsĂ€tt.
SÄ eller sÄ, kommer elementet att hittas, och grÀnskontrollen utförs endast en gÄng nÀr det intrÀffar. Det Àr en djup idé, men den Àr tillrÀckligt enkel Àven för en nybörjarprogrammerare. Kanske kan jag inte tala om relevansen av arbetet för andra, men jag lyckades omedelbart anvÀnda denna visdom i bÄde personlig och professionell kod. Boken TAOCP Àr full av sÄdana pÀrlor (för att vara rÀttvis, dÀr finns ocksÄ mycket konstiga saker, som ).
"Sök, sök
SÄ lÀnge
Sök, sök
Jag ville bara dansa"
- Luther Vandross, "Sök" (1980)
Stavfel #2
Den andra tryckfelet finns i volym 4A, "Kombinatoriska algoritmer", del 1. PÄ sidan 60 beskrivs en uppgift som handlar om planering av komikers upptrÀdanden pÄ olika kasinon. Som exempel nÀmns flera verkliga komiker, inklusive Lily Tomlin, 'Weird Al' Yankovic och Robin Williams, som fortfarande levde nÀr boken gavs ut. Knuth skriver alltid ut fullstÀndiga namn i sitt register, sÄ Williams nÀmns pÄ sidan 882 som "Williams, Robin McLaurin". Men hans andra namn slutar pÄ "n", inte "m", det vill sÀga McLaurin.
McLaurin Àr hans mors flicknamn. Hon var barnbarnsbarn till Anselm Joseph McLaurin, den 34:e guvernören i Mississippi. Hans mandat verkar inte ha blivit ihÄgkommet för nÄgot bra. FrÄn boken :
"Den viktigaste hÀndelsen under McLaurins administration var att Förenta staterna förklarade krig mot Spanien vÄren 1898... TyvÀrr kan kriget ha gett vissa offentliga tjÀnstemÀn möjlighet att utöva mutor. McLaurin anklagades för olika tvivelaktiga aktiviteter, inklusive nepotism och ett överdrivet anvÀndande av benÄdningsmakten. Under nykterhetsrörelsen anklagade kritiker guvernören för alkoholism, nÄgot han offentligt erkÀnde."
Historiskt fel
LÄt oss titta pÄ traditionell multiplikationsalgoritm frÄn skolprogrammet. Hur mÄnga enhetsoperationer för multiplikation krÀver den? Anta att du multiplicerar
-siffrigt tal
till
-siffrigt
. Först multiplicerar du den första siffra
med varje siffra
i tur och ordning. Sedan multiplicerar du den andra siffran
med varje siffra
i tur och ordning och sÄ vidare, tills du har gÄtt igenom alla siffror
. DÀrmed krÀver traditionell multiplikation
primitiva multiplikationer. Specifikt krÀver multiplikationen av tvÄ tal med
siffror enheter av multiplikation.
Detta Àr dÄligt, men man kan optimera processen med hjÀlp av en metod utvecklad av den sovjetiska matematikern Anatolij Alexejevitj Karatsuba. Anta att
-Àr tvÄsiffriga decimaler; det vill sÀga det finns tal
och
 sÄdana att
,
,
,
([generalizeringen av denna algoritm till större siffror krÀver vissa manipulationer; Àven om det inte Àr alltför komplicerat, för att inte göra misstag i detaljerna, föredrar jag att hÄlla mig till ett enkelt exempel). DÄ
och
. Multiplikation av tvÄ termer ger
,
,
. Just nu har vi fortfarande
enhetsmultiplikation:
. Nu lÀgger vi ihop och subtraherar
,
,
,
.
. Efter flera omflyttningar, som jag lÀmnar som en övning för lÀsaren, fÄr vi
 â totalt tre enskilda multiplikationer! (Det finns vissa fasta koefficienter, men de kan bara berĂ€knas genom addition och skiftning av siffror).
Be inte om bevis, men Karatsubas algoritm (rekursivt generaliserad frÄn det ovanstÄende exemplet) förbÀttrar den traditionella multiplikationsmetoden med
operationer till
. Observera att detta Àr en verklig förbÀttring av algoritmen, inte en optimering för mentala berÀkningar. Faktum Àr att algoritmen inte lÀmpar sig för mentala berÀkningar, eftersom den krÀver stora overheadkostnader för rekursiva operationer. Dessutom kommer effekten inte att manifestera sig helt förrÀn siffrorna blir tillrÀckligt stora (lyckligtvis, istÀllet för Karatsubas algoritm kom Ànnu snabbare metoder: i mars 2019 publicerades en algoritm som endast krÀver multiplikationer; accelerationen Àr tillÀmplig endast pÄ ofattbart stora tal).
Denna algoritm beskrivs pĂ„ sidan 295 i den andra volymen av "BerĂ€kningsalgoritmer". DĂ€r skriver Knuth: "Det Ă€r intressant att denna idĂ© först upptĂ€cktes Ă„r 1962 ", nĂ€r artikeln som beskriver Karatsubas algoritm publicerades. Men! Ă
r 1995 publicerade Karatsuba artikeln "BerÀkningskomplexitet", dÀr han nÀmner flera saker: 1) omkring 1956 antydde Kolmogorov att multiplikation inte kan utföras pÄ mindre Àn
steg; 2) Ă„r 1960 deltog Karatsuba i ett seminarium dĂ€r Kolmogorov presenterade sin hypotes nÂČ. 3) "Exakt en vecka" senare utvecklade Karatsuba algoritmen "dela och hĂ€rska"; 4) 1962 skrev och publicerade Kolmogorov en artikel Ă„ Karatsubas vĂ€gnar som beskriver algoritmen. "Jag fick veta om denna artikel först efter att den trycktes om".
SÄledes ligger felet i att istÀllet för 1962 bör det anges 1960 Är. Det Àr allt.
Analys
Felletande krÀvde inte sÀrskild skicklighet.
- Det första felet var sÄ banalt som möjligt och befann sig pÄ ett relativt synligt stÀlle (i början av kapitlet). Vilken idiot som helst skulle ha funnit det; jag rÄkade bara vara den idioten.
- Att hitta det andra typoskrivet krÀvde tur och flit, men inte mycket skicklighet. Indexet för "Williams" finns pÄ nÀst sista sidan av volymen, en ganska framtrÀdande del av boken. Jag blÀddrade just igenom indexet (det Àr inte sÄ synd om det som det verkar, eftersom Knuths index döljer pÄskÀgg. Till exempel finns det poster pÄ arabiska och hebreiska, och bÄda pekar pÄ sida 66. Men pÄ denna sida nÀmns inget av sprÄken; istÀllet nÀmns "sprÄk som lÀses frÄn höger till vÀnster"). Och min uppmÀrksamhet drogs till det andra namnet. Eftersom jag brukar lÀsa Wikipedia, kollade jag Robin Williams och mÀrkte en avvikelse.
- Jag önskar jag kunde sÀga att jag gjorde en seriös forskning för att hitta det historiska felet, men i sjÀlva verket tittade jag bara pÄ . I första raden stÄr det: "Karatsubas algoritm Àr en algoritm för snabb multiplikation. UpptÀckte av Anatolij Karatsuba 1960 och publicerades 1962." Efter detta var det bara att lÀgga ihop tvÄ gÄnger tvÄ.
I framtiden skulle jag vilja hitta ett mer betydande fel, sÀrskilt i Knuths kod. Jag skulle ocksÄ vilja hitta en bugg i första volymen av "Fundamentala algoritmer". Kanske skulle jag hitta en, men pÄ det lokala biblioteket finns det av nÄgon anledning bara volymerna 2, 3 och 4A.
Finansiella fakta:
- Totalt bestÄr mitt bidrag till TAOCP av endast tre tecken: en tillÀgg s, en ersÀttning m till n och 2 till 0. För $2,56 Àr det ganska lönsamma tecken; om du fick betalt sÄ hÀr skulle en artikel pÄ 1000 ord (i genomsnitt fyra tecken) ge dig tio stycken.
- Med tre hexadecimala dollar delar jag, tillsammans med 29 andra medborgare, 69:e plats pÄ listan över de rikaste insÀttarna i San-Seriff-banken (per den 1 maj 2019).
Andra diskussioner om Knuths checkar
AllmÀnna rekommendationer för att hitta fel i Knuths böcker. Handlar huvudsakligen om tekniska fel, som jag inte har. Det finns ett pÄstÄende som jag tog pÄ allvar:
BÀttre att vÀnta tills du har samlat ett felset att skicka. Genom att sammanfoga nÄgra verkliga men inte sÀrskilt vÀrdefulla fel, ökar du chansen att en av dem verkligen uppfattas som ett fel eller rÄd. Om man skickar fel ett i taget kan varje av dem avvisas.
Jag ville inte bara skicka meningslösa skrivfel, utan följde rÄdet och skickade brevet först nÀr jag hade funnit ett historiskt fel som verkade tillrÀckligt allvarligt.
Ashutosh Mehra Àr den tredje rikaste investeraren i San-Serriff med ett enormt förmögenhet pÄ 0x$207,f0 i BoSS.
- Olika:
KĂ€lla: habr.com
