Jag fick en check frÄn Knut pÄ 0x$3,00

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.

Jag fick en check frÄn Knut 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 oupphörligt bedrÀgeri. Nu skickar han ut "personliga insÀttningscertifikat" frÄn banken San Seriff (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:

  1. Kontrollera om det nuvarande elementet Àr det önskade. Om sÄ Àr fallet, returnera det; annars
  2. Kontrollera om pekaren Àr utanför arrayen. Om sÄ Àr fallet, returnera ett fel; annars
  3. Ö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 Jag fick en check frÄn Knut pÄ 0x$3,00. 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:

  1. 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
  2. Ö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 bubbel-sortering).

"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 "Mississippi: historia":

"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 Jag fick en check frÄn Knut pÄ 0x$3,00-siffrigt tal Jag fick en check frÄn Knut pÄ 0x$3,00 till Jag fick en check frÄn Knut pÄ 0x$3,00-siffrigt Jag fick en check frÄn Knut pÄ 0x$3,00. Först multiplicerar du den första siffra Jag fick en check frÄn Knut pÄ 0x$3,00 med varje siffra Jag fick en check frÄn Knut pÄ 0x$3,00 i tur och ordning. Sedan multiplicerar du den andra siffran Jag fick en check frÄn Knut pÄ 0x$3,00 med varje siffra Jag fick en check frÄn Knut pÄ 0x$3,00 i tur och ordning och sÄ vidare, tills du har gÄtt igenom alla siffror Jag fick en check frÄn Knut pÄ 0x$3,00. DÀrmed krÀver traditionell multiplikation Jag fick en check frÄn Knut pÄ 0x$3,00 primitiva multiplikationer. Specifikt krÀver multiplikationen av tvÄ tal med Jag fick en check frÄn Knut pÄ 0x$3,00 siffror enheter av multiplikation. Jag fick en check frÄn Knut pÄ 0x$3,00 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 Jag fick en check frĂ„n Knut pĂ„ 0x$3,00 och Jag fick en check frĂ„n Knut pĂ„ 0x$3,00 sĂ„dana att Jag fick en check frĂ„n Knut pĂ„ 0x$3,00, Jag fick en check frĂ„n Knut pĂ„ 0x$3,00, Jag fick en check frĂ„n Knut pĂ„ 0x$3,00, Jag fick en check frĂ„n Knut pĂ„ 0x$3,00 ([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Ă„ Jag fick en check frĂ„n Knut pĂ„ 0x$3,00 och Jag fick en check frĂ„n Knut pĂ„ 0x$3,00 . Multiplikation av tvĂ„ termer ger Jag fick en check frĂ„n Knut pĂ„ 0x$3,00, Jag fick en check frĂ„n Knut pĂ„ 0x$3,00, Jag fick en check frĂ„n Knut pĂ„ 0x$3,00. Just nu har vi fortfarande Jag fick en check frĂ„n Knut pĂ„ 0x$3,00enhetsmultiplikation: Jag fick en check frĂ„n Knut pĂ„ 0x$3,00 . Nu lĂ€gger vi ihop och subtraherar Jag fick en check frĂ„n Knut pĂ„ 0x$3,00, Jag fick en check frĂ„n Knut pĂ„ 0x$3,00, Jag fick en check frĂ„n Knut pĂ„ 0x$3,00, Jag fick en check frĂ„n Knut pĂ„ 0x$3,00. Jag fick en check frĂ„n Knut pĂ„ 0x$3,00. Efter flera omflyttningar, som jag lĂ€mnar som en övning för lĂ€saren, fĂ„r vi Jag fick en check frĂ„n Knut pĂ„ 0x$3,00 — 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 Jag fick en check frÄn Knut pÄ 0x$3,00 operationer till Jag fick en check frÄn Knut pÄ 0x$3,00. 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 n log n 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 Jag fick en check frĂ„n Knut pĂ„ 0x$3,00 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.

  1. 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.
  2. 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.
  3. 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Ä Wikipedia-sidan om Karatsubas algoritm. 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

  • Hur man fĂ„r en check frĂ„n Knuth

    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.

  • Kvitton frĂ„n Ashutosh Mehra

    Ashutosh Mehra Àr den tredje rikaste investeraren i San-Serriff med ett enormt förmögenhet pÄ 0x$207,f0 i BoSS.

  • Kvitto för vissa icke-funktionella fel i den verkliga koden TeX
  • Olika: #1 #2 #3 #4 #5 #6

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster