Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル

アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル

関数型まつり2026 の発表資料です #fp_matsuri

Avatar for Naoya Ito

Naoya Ito

July 12, 2026

More Decks by Naoya Ito

Other Decks in Programming

Transcript

  1. )BTLFMMͷ GPMEΛૢ࡞తʹಡΉ͔ɺҙຯతʹಡΉ͔ let x = foldl' (+) 0 [1 ..

    10] • ૢ࡞త – ΞΩϡϜϨʔλ͖ͭ࠶ؼ – ࠨ͔Βॱʹɺ࠶ؼతʹ Λద༻͍ͯ͘͠ɻ଍͍ͯ͘͠ • ҙຯత – <>ͱ͍͏ࣗ༝ͳྻશମΛɺʮ࿨ʯͱ͍͏Ұ఺ͷҙຯ΁௵͍ͯ͠Δ
  2. Ϧετͱ͍͏ʮࣗ༝ͳߏ଄ʯ͔Βʮ࿨ʯͱ͍͏Ұ఺ʹ௵͢ ѹॖ͢Δ a₀ a₁ a₂ a₃ a₄ a₅ (+), 0

    x Ϧετʹ͸ॱং͕͋Γɺ֤ཁૉ͕ͦͷ··࢒͍ͬͯͯɺࣗ༝ʹ ࿈݁Ͱ͖Δɻ৘ใྔ͕େ͖͍ɻ ࣗ༝ߏ଄ ͦΕΛ ͰҰͭͷ஋ʹ௵͢ɻ௵ͨ͜͠ͱͰॱং΍֤ཁૉ͸ࣺ ͯΒΕΔɻ͜ͷͱ͖ʮ࿨ʯͱ͍͏จ຺Ͱ͸ɺݩͷϦετͷҙຯ ͸յ͍ͯ͠ͳ͍ɻอଘ͍ͯ͠Δɻ ௵͞Εͨ஋Λʮ࿨ʹΑΔཁ໿ ҙຯѹॖ ʯͱଊ͑Δ͜ͱ͸Ͱ͖ ͳ͍͔
  3. ྦྷੵ࿨ 3 1 4 5 9 2 6  

         A = • A2 ŋŋŋ A5 ͳͲʮ࿈ଓ͢Δ෦෼࿨ ۠ؒ࿨ ʯΛٻΊ͍ͨͱ͢Δɻ • φΠʔϒʹࠨ͔Βݟ͍ͯ͘ͱO(n) ͔͔Δ
  4. )BTLFMMͰͷྦྷੵ࿨ŋŋŋTDBOMͰදݱͰ͖Δ let s = scanl' (+) 0 [3, 1, 4,

    5, 9, 2, 6] -- [0, 3, 4, 8, 13, 22, 24, 30] • ϦετΛݩʹͯ͠ɺ࠶ؼతʹؔ਺Λద༻͠ɺ৽͍͠ϦετΛߏங͢Δ • scanl ͷ݁Ռ͸foldl ͷ࠶ؼܭࢉͷي੻ ৞ΈࠐΈͷաఔ Λ࢒ͨ͠΋ͷͱಉ౳ʹͳΔ – foldl' (+) 0 [3, 1, 4, 5, 9, 2, 6] ͸ 30 ͱ͍͏୯Ұͷ஋͕ฦΔ
  5. GPMEͷʮཁ໿ ҙຯѹॖʯͷจ຺ͱ౷߹͢Δ • foldl (+) 0 ΛʮϦετͱ͍͏ࣗ༝ͳߏ଄ʹର͢Δ ࿨ͱ͍͏จ຺Ͱͷ Ұ఺΁ͷཁ໿ʯͱҙຯղऍͨ͠ •

    GPMEMͱTDBOMͷܭࢉߏ଄͸ಉ͡ɻ࠷ऴ݁ՌͷΈΛฦ͢ͷ͕GPMEͰɺي੻Λฦ͢ͷ͕TDBO • TDBOMͷي੻ɺҰཁૉ΋ಉ༷ʹʮཁ໿ʯͱղऍ͢Δ͜ͱ͕Ͱ͖ͦ͏ 0 3 4 8 13 22 24        S = 30 
  6. ࠨྦྷੵ࿨ͷҰ఺͸ʮࠨ۠ؒͷ࿨ʹΑΔҰ఺΁ͷཁ໿ ҙຯѹॖʯ • foldl ͸ೖྗͷϦετશମΛҰ఺ʹѹॖͨ͠ • scanl ͷҰ఺͸ɺͦͷ్தܦաɻͭ·Γ Sl ͸ɺͦΕΑΓࠨͷ۠ؒ

    < M ΛҰ఺ʹѹॖ͍ͯ͠Δ • ͜ͷͱ͖ʮ࿨ʯͱ͍͏จ຺Ͱ͸ɺѹॖͯ͠΋ [0, l) ۠ؒͷҙຯΛյͯ͠ͳ͍ɻѹॖޙͷ஋Ͱ΋ҙຯ͕อଘ ͞Ε͍ͯΔ • ʮҐஔ4ΑΓࠨͷ࿨͸?ʯʮ13ʯ 3 1 4 5 9 2 6 A = 13 S = (+)
  7. ཁ໿ҙຯѹॖͷੈք΁ʮ্࣋ͪ͛ͯʯɺཁ໿ಉ࢜Λ߹੒͍ͯ͠Δ • TDBOMͱ͍͏ؔ਺Λద༻ͯ͠ɺཁ໿ ҙຯѹॖͷੈքʹ্࣋ͪ͛Δ • ཁ໿͢Δɺ্࣋ͪ͛ΔͨΊͷจ຺͸(+) 0 ɺͭ·Γ࿨ • ཁ໿ͱཁ໿ͷ߹੒Ͱ۠ؒ࿨ΛදݱͰ͖Δ

    ŋŋŋ ཁ໿ɺ͢ͳΘͪѹॖදݱͰ߹੒͍ͯ͠Δ͔Βܭࢉྔ͕Լ͕Δɻ ཁ໿ͯ͠΋࿨ͱ͍͏จ຺Ͱ͸ҙຯ͸อଘ͞Ε͍ͯΔ͔Βɺ্࣋ͪ͛ͨੈքʹดͯ͡ܭࢉͯ͠΋ݩͷࣗ༝ߏ଄ Ͱܭࢉͯ͠΋ಉ͡ҙຯʹͳΔ 3 1 4 5 9 2 6 A = 0 3 4 8 13 22 24 S = 30 (+) 0 Sl Sr ࣗ༝ߏ଄ ཁ໿ͷੈք
  8. จࣈྻΛɺ࿈݁Λอଘ͢Δϋογϡ஋΁ѹॖ͢Δ • ཁ໿͸ɺݩͷจࣈྻͷʮ࿈݁ ʯͱ͍͏ߏ଄Λอଘ͍ͯ͠Δ – จࣈྻͷ࿈݁Λɺϋογϡ஋ಉ࢜ͷܭࢉͱͯ͠࠶ݱͰ͖Δੑ࣭Λ࣋ͭϋογϡؔ਺Λ࢖͏ – H(x)=(hash(x),∣x∣) ͱ͢ΔͱH(x ++

    y) = H(x) combine H(y) • ཁ໿ೋ఺ͷ߹੒ ŋŋŋ෦෼จࣈྻͷϋογϡ – ͜ͷϋογϡΛʮ෦෼จࣈྻҰக൑ఆʯͱҙຯղऍͰ͖Δ – ཁ໿Ͱൺֱ͢Δ͔Βɺܭࢉྔ͕Լ͕Δ O(1) a b r a c a d s = a combine, e H0 H1 H2 H3 H4 H5 H6 H7 H8
  9. SBOHF'PME M S • ૢ࡞తʹଊ͑Δͱྦྷੵ࿨ʹΑΔ۠ؒ࿨͸s ! r - s !

    l • ͜͜·Ͱݟ͖ͯͨΑ͏ʹҙຯతʹ͸۠ؒ [l, r) ͷཁ໿ s ! r - s ! l rangeFold (l, r) s ʮ۠ؒ<M S Λ GPMEͨ͠ΒɺͲΜͳҙຯʹͳΔ͔ʯͱ͍͏ "1*ʹ౷߹Ͱ͖Δ
  10. let s = fromListPT @VU.Vector (1, n) $ map Sum

    xs x = rangeFoldPT (l, r) s ྦྷੵ࿨ 1SFGJY5BCMF let rh = fromStringRH (1, n) s h = rangeFoldRH (l, r) rh ϩʔϦϯάϋογϡ seg <- newListSeg @VUM.MVector (1, n) $ map Min xs x <- rangeFoldSeg seg (l, r) ηάϝϯτ໦
  11. let s = fromListSP @VU.Vector (1, n) $ map Max

    xs x = rangeFoldSP (l, r) s 4QBSTF5BCMF gen <- newStdGen let t = newTableZHMS gen xs z = fromListZHMS (1, n) t xs x = rangeFoldZHMS (l, r) z ;PCSJTU)BTI SBOHF'PME͸ʮ۠ؒΛɺͦͷ୅਺ͷҙຯͰཁ໿͢ΔʯΠϯλʔϑΣʔε
  12. B ѹॖ୅਺ ԿΛҙຯͱͯ͠࢒͔͢ ཁ໿஋΁ࣸؔ͢਺ɺཁ໿ಉ࢜Λ߹੒͢Δԋࢉ ݁߹ଇɺ୯ҐݩɺٯݩɺՄ׵ੑɺႈ౳ੑ ŋŋŋ C ධՁث ͦͷҙຯΛͲ͏औΓग़͔͢ ධՁثɺσʔλߏ଄

    ධՁث͝ͱʹඞཁͳ୅਺๏ଇ͕ҟͳΔ ۠ؒ <M S Ͳͷҙຯ΁ GPME͢Δ͔ NBY NJO ʜ ཁ໿஋ N ධՁث1SFGJY5BCMF#*54FHNFOU5SFF4QBSTF5BCMF3PMMJOH)BTIʜ B ཁ໿ͷจ຺  C ධՁͷํ๏ ࣸ૾ͱ߹੒ԋࢉ͕ɺཁ໿ͷҙຯΛܾΊΔɻ߹੒ԋࢉ͕ຬͨ͢୅਺๏ଇ͕ɺͦͷཁ໿Λѻ͑ΔධՁثΛܾΊΔ ҙຯͱධՁΛ෼཭͢ΔɻҙຯΛܾΊΔͷ͕ѹॖ୅਺ɺܭࢉํ๏ΛܾΊΔͷ͕ධՁث
  13. ධՁث ѹॖઌͷ୅਺ ར༻͢Δ๏ଇ ͦͷ๏ଇͰͰ͖Δ͜ͱ 1SFGJY5BCMFྦྷੵ࿨ ܈ ٯݩ ۠ؒ࿨ #JOBSZ*OEFYFE5SFF Մ׵܈

    Մ׵ੑɾٯݩ Ұ఺Ճࢉɾ۠ؒ࿨ 4FHNFOU5SFF ϞϊΠυ ݁߹ଇɾ୯Ґݩ Ұ఺ߋ৽ɾ۠ؒΫΤϦ 4QBSTF5BCMF ႈ౳൒܈ ݁߹ଇɾႈ౳཯ ੩తɾ۠ؒΫΤϦ 3PMMJOH)BTI ࿈݁Λอଘ͢Δ४ಉܕ ࿈݁Λอͭԋࢉ ෦෼จࣈྻͷҰக൑ఆ ;PCSJTU)BTI Մ׵ͳԋࢉ΁ͷ֬཰త४ಉܕ 903ɾՃࢉͷՄٯੑɺٯݩ ܰྔͳಉҰੑ൑ఆ ۠ؒΛཁ໿ SBOHF'PME ͢ΔʮධՁثʯ ಉ͡ʮ۠ؒΛGPMEͨ͠ҙຯΛฦ͢ʯͰ΋ɺཁ໿ ѹॖ஋ ʹ࢒ͨ͠୅਺๏ଇ ͢ͳΘͪจ຺ ʹΑͬͯͰ͖Δ͜ͱ͕มΘΔ
  14. 14 • ֤ QSFGJY͸Ұ఺ͷ஋·Ͱ௵͞ΕΔ • ۠ؒ͸ೋ఺ࠩͰ෮ݩ͢Δ • ͦͷ୅ΘΓɺٯݩ͕ඞཁʹͳΔ ѹॖ཰͸ߴ͍ɻͨͩ͠ٯԋࢉ —

    ͕ඞཁʹͳΔ ѹॖ୅਺ʹɺڧ͍ߏ଄͕ඞཁͱ͞ΕΔ 列 prefix 点列 Sᵣ − Sₗ = 区間 [l, r) の要約 ѹॖ཰ŋŋŋྦྷੵ࿨͸௵͠੾Δ
  15. 15 • શମΛҰ఺ʹ͠ͳ͍ • ෦෼۠ؒ͝ͱͷѹॖ஋Λ໦ʹอ࣋͢Δ • ೚ҙ۠ؒΛ 0 MPHO ݸͷޓ͍ʹૉͳ۠ؒʹ෼ղ͠

    ͯ߹੒ • ͦͷ୅ΘΓɺٯݩ͸͍Βͳ͍ɻϞϊΠυͰΑ͍ • ۠ؒNJO΍۠ؒ NBYͳͲٯݩ͕ͳ͍۠ؒ˓˓ Λ࣮ݱͰ͖Δ ෦෼۠ؒͷѹॖΛ໦ʹཹอ ˠඞཁͳ͚۠ؒͩ߹੒ ѹॖ཰ŋŋŋηάϝϯτ໦͸ѹॖΛཹอ͢Δ ௵͠੾Βͳ͍͜ͱͰɺٯݩͷͳ͍ੈքͰ΋ܭࢉΛଓ͚Δ͜ͱ͕Ͱ͖Δ ΑΓऑ͍ߏ଄Ͱཁ໿͕Մೳɻͨͩ͠ɺۭؒ ϝϞϦ ͱ࣌ؒ ܭࢉྔ Λ࢖͏
  16. • ѹॖ୅਺ʹΑͬͯɺҰݟແؔ܎ʹΈ͑ͨΞϧΰϦζϜ΍σʔλߏ଄ʹҰͭͷڞ௨ͨ͠ϝϯλ ϧϞσϧΛద༻Ͱ͖Δ • ʮࣸ૾ͱ߹੒ԋࢉʹΑΔཁ໿ʯͷۭؒʹ্࣋ͪ͛ͯɺͦ͜Ͱܭࢉ͢Δ • rangeFold (l, r) ͷΑ͏ʹɺͦͷ౷߹͞Εͨ֓೦Ͱ"1*Λ౷Ұ͠)BTLFMMͷϥΠϒϥϦ

    ܈ΛΑΓ࢖͍΍͘͢ɺೝ஌ෛՙͷ௿͍΋ͷʹൃలͤ͞Δ͜ͱ͕Ͱ͖ͨ • ࣌ؒͷ౎߹্঺հͰ͖ͳ͍͕ɺ۠ؒཁ໿Ҏ֎ͷΞϧΰϦζϜ΍σʔλߏ଄΋ಉ༷ͷ࿮૊ΈͰ ղऍɺ࣮૷Λ࠶ߏ੒͢Δ͜ͱ͕Ͱ͖Δ – ͨͱ͑͹%1ͷ%1දɺ#'4ͷঢ়ଶͳͲ΋୅਺తߏ଄Λ΋ͬͨཁ໿ͩͱଊ͑ͯӠʑ IUUQTOBPZBEFWXJLJѹॖ୅਺ ࢲ͸͜ΕͰ ੨৭ίʔμʔʹͳΕ·ͨ͠ ѹॖ୅਺Ͱݟ͑Δܠ৭
  17. ʮܭࢉʯͱ͸ɺೖྗΛঢ়ଶ΁ཁ໿ѹॖ͢Δ͜ͱ • ѹॖ୅਺ͷཁ͸GPMEͷܭࢉߏ଄ ŋŋŋ ΞΩϡϜϨʔλ͖ͭ࠶ؼʹ͋ͬͨ • ΞΩϡϜϨʔλBDD͸ɺʮ͜͜·ͰʹಡΜͩೖྗͷཁ໿ʯʹͳ͍ͬͯΔ • ͱ͜ΖͰɺೖྗΛड͚औΓΞΩϡϜϨʔλʹ݁ՌΛੵΈͳ͕Βܭࢉ͍ͯ͘͠ɺͱ͍͏ͷ͸ঢ়ଶػց΍ε τϦʔϜॲཧʹ΋දΕΔܭࢉͷܗͰ͸ͳ͍͔

    • ͳΒ͹ܭࢉػ΋ɺࣗ༝ೖྗΛ಺෦ঢ়ଶ΁ҙຯѹॖ͠ଓ͚Δ૷ஔͱݟΒΕͳ͍͔ • ͦΕ͸ܭࢉػಛ༗ͷ͜ͱ "*ֶ͕शͯ͠ɺίϯςΩετʹѹॖͯ͠ɺਪ࿦ͯ͠Δͷ͸ ਓؒͷ 🧠 ͸  let s = foldl' (¥acc x -> acc <> x) mempty xs ʮΞϧΰϦζϜ͸ԿΛѹॖ͍ͯ͠Δͷ͔ʯͱ͍͏໰͍͸ɺ ΍͕ͯʮܭࢉͱ͸Կ͔ʯʮ஌ੑͱ͸Կ͔ʯͱ͍͏໰͍ʹͭͳ͕Δ
  18. ؍఺ ྦྷੵ࿨ ηάϝϯτ໦ ѹॖͷ࢓ํ QSFGJYΛ఺΁௵͢ ෦෼۠ؒͷѹॖΛ໦ʹཹอ͢Δ ۠ؒऔಘ ೋ఺ࠩ 0 MPHO

    ݸͷ۠ؒ߹੒ ཁٻ ٯݩ ݁߹཯ͱ୯Ґݩ ϞϊΠυ ߋ৽ ۤख ಘҙ ѹॖ཰ ߴ͍ தఔ౓ τϨʔυΦϑ ڧ͍ߏ଄͕ඞཁ ۭؒͱ࣌ؒΛ࢖͏
  19. foldMap f (xs ++ ys) == foldMap f xs <>

    foldMap f ys • ࣗ༝ϞϊΠυଆͷ࿈݁ ͕ɺҙຯଆͷ߹੒  ʹࣸΔ • ߏ଄ͷԋࢉΛอͭࣸ૾ ŠŠ ϞϊΠυ४ಉܕ GPME.BQͱϞϊΠυ४ಉܕ