Es saņēmu čeku no Knuth par 0x3,00 USD

Donalds Knuts ir datorzinātnieks, kuram tik ļoti rÅ«p savu grāmatu precizitāte, ko viņŔ iesaka viens hex dolārs (2,56 ASV dolāri, 0 x 1,00 ASV dolāri) par jebkuru atrasto "kļūdu", kur kļūda tiek definēta kā jebkas, kas ir "tehniski, vēsturiski, tipogrāfiski vai politiski nepareizs". Es ļoti gribēju saņemt čeku no Knuta, tāpēc nolēmu meklēt kļūdas viņa magnum opusā "ProgrammÄ“Å”anas māksla" (TAOCP). Mums izdevās atrast trÄ«s. Uzticoties savam vārdam, Knuts nosÅ«tÄ«ja čeku par 0x3,00 ASV dolāri.

Es saņēmu čeku no Knuth par 0x3,00 USD

Kā redzat, Ŕī nav Ä«sta pārbaude. Knuts agrāk sÅ«tÄ«ja Ä«stus čekus, taču 2008. gadā pārtrauca nikna krāpÅ”ana. Tagad viņŔ izsÅ«ta "personÄ«gos noguldÄ«jumu sertifikātus". Sanserifas banka (BoSS). ViņŔ saka, ka ir gatavs sÅ«tÄ«t reālu naudu, ja nepiecieÅ”ams, taču Ŕķiet, ka tas ir pārāk daudz problēmu.

Atradu divas drukas kļūdas un vienu vēsturisku kļūdu. Es tos uzskaitÄ«Å”u trivialitātes samazināŔanas secÄ«bā.

Drukas kļūda #1

Pirmā drukas kļūda ir treŔā sējuma ā€œÅ Ä·iroÅ”ana un meklÄ“Å”anaā€ 392. lappusē, astotajā rindiņā no apakÅ”as: ā€œPēc neveiksmÄ«gas meklÄ“Å”anas reizēm (reizēm) vēlams tabulā ievadÄ«t jaunu ierakstu, kurā ir K; metodi, kas to dara, sauc par meklÄ“Å”anas un ievietoÅ”anas algoritmu. Kļūda ir tā, ka tā vietā kādreiz vajadzētu bÅ«t dažreiz.

Protams, Ŕāda kļūda nav pārsteidzoÅ”a. Å ajā rakstā vien noteikti ir dažas drukas kļūdas (bez atlÄ«dzÄ«bas par to atraÅ”anu). PatieŔām pārsteidzoÅ”i ir tas, ka tas tik ilgi palika nepamanÄ«ts. 392. lapa nav dziļi aprakta matemātikas sadaļā, tā ir pati pirmā lapa 6.nodaļa "Meklēt"! Iespējams, viena no visvairāk lasÄ«tajām grāmatas sadaļām. Teorētiski drukas kļūdu vajadzētu bÅ«t vismazāk, bet nē.

Starp citu, ja esat kādreiz domājis par TAOCP lasÄ«Å”anu, izmēģiniet to. Daudzi teiks, ka tā ir katalogs, nav paredzēts tieÅ”ai lasÄ«Å”anai, taču tā nav taisnÄ«ba. Autoram ir skaidrs skatÄ«jums un savdabÄ«gs stils. VienÄ«gais, kas traucē lasāmÄ«bai, ir matemātikas sarežģītÄ«ba. Tomēr ir vienkārÅ”s risinājums: lasiet, lÄ«dz nonākat pie matemātikas, ko nesaprotat, izlaidiet to un pārejiet uz nākamo sadaļu, kuru varat saprast. Tā lasot, man pietrÅ«kst vismaz 80% grāmatas, bet pārējie 20% ir lieliski!

Ir arÄ« teikts, ka TAOCP nav nozÄ«mes, ir novecojis vai citādi nav piemērojams "Ä«stai programmÄ“Å”anai". Tā arÄ« nav taisnÄ«ba. Piemēram, pirmajā sadaļā pēc ievada aplÅ«kota elementa atraÅ”ana neŔķirotā masÄ«vā. VienkārŔākais algoritms ir pazÄ«stams visiem programmētājiem. Sāciet rādÄ«tāju masÄ«va sākumā, pēc tam veiciet tālāk norādÄ«tās darbÄ«bas.

  1. Pārbaudiet, vai paÅ”reizējais elements ir vēlamais. Ja tā, mēs to atgriežam; citādi
  2. Pārbaudiet, vai rādītājs atrodas ārpus masīva robežas. Ja tā, atgrieziet kļūdu; citādi
  3. Tuviniet un turpiniet.

Tagad apsveriet: cik robežpārbaudes vidēji prasa Å”is algoritms? Sliktākajā gadÄ«jumā, ja masÄ«vā nav elementa, katram saraksta elementam bÅ«s nepiecieÅ”ama viena pārbaude, un vidēji tas bÅ«s kaut kas lÄ«dzÄ«gs Es saņēmu čeku no Knuth par 0x3,00 USD. Gudrāks meklÄ“Å”anas algoritms varētu izvairÄ«ties tikai ar vienu robežu pārbaudi. Pievienojiet vajadzÄ«go elementu masÄ«va beigām, pēc tam sāciet rādÄ«tāju masÄ«va sākumā un veiciet tālāk norādÄ«tās darbÄ«bas.

  1. Pārbaudiet, vai paÅ”reizējais elements ir vēlamais. Ja tā, mēs atgriežam atbildi, ja rādÄ«tājs atrodas masÄ«vā, vai kļūdu, ja tā nav. Citādi
  2. Tuviniet un turpiniet.

Tā vai citādi elements tiek atrasts, un robežu pārbaude tiek veikta tikai vienu reizi, kad tas notiek. Å Ä« ir dziļa ideja, taču tā ir pietiekami vienkārÅ”a pat iesācējam programmētājam. Laikam nevaru runāt par darba atbilstÄ«bu citiem, taču Å”o gudrÄ«bu uzreiz varēju pielietot gan personÄ«gajā, gan profesionālajā kodeksā. TAOCP grāmata ir pilna ar Ŕādiem dārgakmeņiem (taisnÄ«bas labad jāsaka, ka tur ir arÄ« daudz dÄ«vainu lietu, piemēram, burbuļu kārtoÅ”ana).

"Meklēt, meklēt
Tik ilgi
Meklē, meklē
Es tikai gribēju dejot"

ā€” Luters Vandross, "MeklÄ“Å”ana" (1980)

Drukas kļūda #2

Otrā drukas kļūda ir 4.A sējumā, Kombinatoriālie algoritmi, 1. daļa. 60. lappusē ir aprakstÄ«ta problēma, kas saistÄ«ta ar komiÄ·u uzstāŔanās plānoÅ”anu dažādos kazino. Kā piemēri tiek minēti vairāki reālās dzÄ«ves komiÄ·i, tostarp Lilija Tomlina, DÄ«vainais Als Jankovičs un Robins Viljamss, kurÅ” grāmatas iznākÅ”anas brÄ«dÄ« vēl bija dzÄ«vs. Knuts indeksā vienmēr norāda pilnus vārdus, tāpēc Viljamss 882. lappusē ir norādÄ«ts kā "Viljamss, Robins Maklorims". Bet viņa otrais vārds beidzas ar ā€œnā€, nevis ar ā€œmā€, tas ir, McLaurin.

McLaurin bija viņa mātes pirmslaulÄ«bas uzvārds. Viņa bija Misisipi 34. gubernatora Anselma Džozefa Maklarina mazmazmeita. Viņa valdÄ«Å”anas laiks, acÄ«mredzot, netika atcerēts ar neko labu. No grāmatas "Misisipi: vēsture":

ā€œSvarÄ«gākais notikums Maklarina administrācijas laikā bija Amerikas Savienoto Valstu kara pieteikÅ”ana Spānijai 1898. gada pavasarÄ«... Diemžēl karÅ”, iespējams, deva dažām valdÄ«bas amatpersonām iespēju iesaistÄ«ties kukuļoÅ”anā. Maklorins tika apsÅ«dzēts dažādās apÅ”aubāmās praksēs, tostarp nepotismā un pārmērÄ«gā apžēloÅ”anas pilnvaru izmantoÅ”anā. AtturÄ«bas kustÄ«bas laikā kritiÄ·i apsÅ«dzēja gubernatoru par dzērāju, ko viņŔ publiski atzina.

Vēsturiska kļūda

Apsvērt tradicionālais reizināŔanas algoritms no skolas mācÄ«bu programmas. Cik viencipara reizinājumus tas prasa? Pieņemsim, ka jÅ«s reizinat Es saņēmu čeku no Knuth par 0x3,00 USD-ciparu skaitlis Es saņēmu čeku no Knuth par 0x3,00 USD par Es saņēmu čeku no Knuth par 0x3,00 USD- mazliet Es saņēmu čeku no Knuth par 0x3,00 USD. Vispirms reiziniet pirmo ciparu Es saņēmu čeku no Knuth par 0x3,00 USD katram ciparam Es saņēmu čeku no Knuth par 0x3,00 USD vienu pēc otra. Pēc tam reiziniet otro ciparu Es saņēmu čeku no Knuth par 0x3,00 USD katram ciparam Es saņēmu čeku no Knuth par 0x3,00 USD pa vienam un tā tālāk, lÄ«dz iziet cauri visiem numuriem Es saņēmu čeku no Knuth par 0x3,00 USD. Tādējādi ir nepiecieÅ”ama tradicionālā reizināŔana Es saņēmu čeku no Knuth par 0x3,00 USD primitÄ«vie reizinājumi. Jo Ä«paÅ”i, reizinot divus skaitļus ar Es saņēmu čeku no Knuth par 0x3,00 USD vajadzÄ«gas pakāpes Es saņēmu čeku no Knuth par 0x3,00 USD viencipara reizinājumus.

Tas ir slikti, taču procesu ir iespējams optimizēt, izmantojot padomju matemātiÄ·a Anatolija Aleksejeviča Karatsubas izstrādāto metodi. Izliksimies tā Es saņēmu čeku no Knuth par 0x3,00 USD Šø Es saņēmu čeku no Knuth par 0x3,00 USD - divciparu decimālskaitļi; tas ir, ir skaitļi Es saņēmu čeku no Knuth par 0x3,00 USD, Es saņēmu čeku no Knuth par 0x3,00 USD, Es saņēmu čeku no Knuth par 0x3,00 USD, Es saņēmu čeku no Knuth par 0x3,00 USD tāds, ka Es saņēmu čeku no Knuth par 0x3,00 USD Šø Es saņēmu čeku no Knuth par 0x3,00 USD (vispārinot Å”o algoritmu uz lielākiem skaitļiem, ir vajadzÄ«gas dažas manipulācijas; lai gan tas nav pārāk grÅ«ti, lai nekļūdÄ«tos detaļās, labāk palikÅ”u pie vienkārÅ”a piemēra). Tad Es saņēmu čeku no Knuth par 0x3,00 USD, Es saņēmu čeku no Knuth par 0x3,00 USD, Es saņēmu čeku no Knuth par 0x3,00 USD. Binomiālu reizinot iegÅ«st Es saņēmu čeku no Knuth par 0x3,00 USD. Å obrÄ«d mums vēl ir Es saņēmu čeku no Knuth par 0x3,00 USD viencipara reizināŔana: Es saņēmu čeku no Knuth par 0x3,00 USD, Es saņēmu čeku no Knuth par 0x3,00 USD, Es saņēmu čeku no Knuth par 0x3,00 USD, Es saņēmu čeku no Knuth par 0x3,00 USD. Tagad saskaitÄ«sim un atņemsim Es saņēmu čeku no Knuth par 0x3,00 USD. Pēc dažām pārkārtoÅ”anām, kuras atstāŔu lasÄ«tājam kā vingrinājumu, izrādās Es saņēmu čeku no Knuth par 0x3,00 USD - tikai trÄ«s viencipara reizinājumi! (Ir daži nemainÄ«gi koeficienti, bet tos var aprēķināt, tikai saskaitot un pārbÄ«dot ciparus).

Neprasi pierādÄ«jumus, bet Karatsuba algoritms (rekursÄ«vi vispārināts no iepriekÅ” minētā piemēra) uzlabo tradicionālo reizināŔanas metodi ar Es saņēmu čeku no Knuth par 0x3,00 USD operācijas iepriekÅ” Es saņēmu čeku no Knuth par 0x3,00 USD. LÅ«dzu, ņemiet vērā, ka tas ir reāls algoritma uzlabojums, nevis optimizācija prāta aprēķiniem. PatieŔām, algoritms nav piemērots prāta aritmētikai, jo tas prasa lielas pieskaitāmās izmaksas rekursÄ«vām darbÄ«bām. Turklāt efekts pilnÄ«bā neizpaudÄ«sies, kamēr skaitļi kļūs pietiekami lieli (par laimi, Karatsubas algoritms ir aizstāts ar vēl ātrākām metodēm: 2019. gada martā tika publicēts algoritms, kas prasa tikai n log n reizinājumi; paātrinājums attiecas tikai uz neiedomājami lieliem skaitļiem).

Å is algoritms ir aprakstÄ«ts 295. sējuma Daļēji skaitļu algoritmi XNUMX. lpp. Tur Knuts raksta: ā€œZiņkārÄ«gi, ka Ŕī ideja tika atklāta tikai gadā 1962 gadāā€, kad tika publicēts raksts, kurā aprakstÄ«ts Karatsubas algoritms. Bet! 1995. gadā Karatsuba publicēja rakstu par ā€œComputational Complexityā€, kurā teikts vairākas lietas: 1) Ap 1956. gadu Kolmogorovs ierosināja, ka reizināŔanu nevar veikt Ä«sākā laikā Es saņēmu čeku no Knuth par 0x3,00 USD pakāpieni; 2) iekŔā 1960 gadā Karatsuba apmeklēja semināru, kurā Kolmogorovs prezentēja savu hipotēzi nĀ². 3) ā€œTieÅ”i vienas nedēļas laikāā€ Karatsuba izstrādāja ā€œskaldi un valdiā€ algoritmu; 4) 1962. gadā Kolmogorovs uzrakstÄ«ja un publicēja rakstu Karatsuba vārdā ar algoritma aprakstu. "Es uzzināju par Å”o rakstu tikai pēc tā pārpublicÄ“Å”anas."

Tātad kļūda ir tā, ka tā vietā 1962 jāprecizē 1960 gadā. Tas ir viss.

Analīze

Kļūdu atraŔana neprasīja īpaŔas prasmes.

  1. Pirmā kļūda bija maksimāli triviāla un atradās samērā labi redzamā vietā (nodaļas sākums). JebkurÅ” idiots to bÅ«tu atradis; Es vienkārÅ”i izrādÄ«jos tas idiots.
  2. Otrās drukas kļūdas atraÅ”ana prasÄ«ja veiksmi un centÄ«bu, bet ne prasmes. "Viljamsa" rādÄ«tājs ir sējuma priekÅ”pēdējā lappusē, kas ir diezgan ievērojama grāmatas daļa. Es tikko Ŕķiroju indeksu (tas nav tik nožēlojami, kā izklausās, jo Knuta rādÄ«tājos ir paslēptas Lieldienu olas. Piemēram, ir ieraksti arābu un ebreju valodā, abi norāda uz 66. lpp. Bet tajā lapā nav minēts vai nu valodās; tā vietā tas attiecas uz ā€œvalodām, kuras lasa no labās uz kreiso pusiā€). Un otrais vārds piesaistÄ«ja manu uzmanÄ«bu. Tā kā es parasti lasu Vikipēdiju, es pārbaudÄ«ju Robinu Viljamsu un pamanÄ«ju neatbilstÄ«bu.
  3. Es vēlos, lai varētu teikt, ka veicu nopietnu izpēti, lai atrastu vēsturisku kļūdu, bet patiesÄ«bā es tikai paskatÄ«jos Vikipēdijas lapa par Karatsubas algoritmu. PaŔās pirmajās rindās teikts: ā€œKaratsuba algoritms ir ātrs reizināŔanas algoritms. 1960. gadā atklāja Anatolijs Karatsuba un publicēja 1962. gadā. Pēc tam atlika tikai pievienot divus un divus.

Nākotnē es vēlētos atrast kādu bÅ«tiskāku kļūdu, Ä«paÅ”i Knutha kodā. Es arÄ« vēlētos atrast kļūdu pirmajā Fundamental Algorithms sējumā. VarbÅ«t es bÅ«tu atradis, bet nez kāpēc vietējā bibliotēkā ir tikai 2., 3. un 4A sējums.

FinanŔu fakti:

  • Kopumā mans ieguldÄ«jums TAOCP sastāv tikai no trim rakstzÄ«mēm: viens papildinājums s, nomaiņa m par n Šø 2 par 0. Par USD 2,56 Å”ie ir daži diezgan ienesÄ«gi simboli; Ja jums maksātu Ŕādu naudu, par 1000 vārdu rakstu (vidēji četras rakstzÄ«mes) jÅ«s nopelnÄ«tu desmit grantus.
  • Ar trim heksadecimālajiem dolāriem es kopā ar 29 citiem pilsoņiem ieņemu 69. vietu San Serriff Bank bagātāko noguldÄ«tāju sarakstā (no 1. gada 2019. maija).

Citas diskusijas par čekiem no Knuta

  • Kā saņemt čeku no Knuta

    VispārÄ«gi ieteikumi kļūdu atraÅ”anai Knuta grāmatās. Pārsvarā tie attiecas uz tehniskām kļūdām, kuru man nav. Tur ir viens ieteikums, ko es uztvēru nopietni:

    Vislabāk ir pagaidÄ«t, lÄ«dz esat apkopojis kļūdu kopu, lai iesniegtu. Apvienojot vairākas reālas, bet ne pārāk vērtÄ«gas kļūdas, jÅ«s palielināsiet iespējamÄ«bu, ka viena no tām patieŔām tiks uzskatÄ«ta par kļūdu vai padomu. Ja kļūdas iesniedzat pa vienai, katra no tām var tikt noraidÄ«ta atseviŔķi.

    Es negribēju sÅ«tÄ«t tikai muļķīgas drukas kļūdas, bet ņēmu vērā padomu un nosÅ«tÄ«ju vēstuli tikai tad, kad atradu vēsturisku kļūdu, kas Ŕķita pietiekami nopietna.

  • AŔūta Mehras čeki

    Ashutosh Mehra ir treÅ”ais bagātākais investors Sanserifā, kura neto vērtÄ«ba BoSS ir 0x207,f0.

  • Pārbaudiet dažas nefunkcionālas kļūdas reālajā TeX kodā
  • Dažādi: #1 #2 #3 #4 #5 #6

Avots: www.habr.com

Pievieno komentāru