document.write('<link rel="stylesheet" href="http://gist.github.com/stylesheets/gist/embed.css"/>')





document.write('<div id=\"gist-123403\" class=\"gist\">\n  \n  \n    \n            \n\n      <div class=\"gist-file\">\n        <div class=\"gist-data gist-syntax\">\n          \n          \n          \n            <div class=\"gist-highlight\"><pre><div class=\"line\" id=\"LC1\"><span class=\"c1\">--type for the &quot;collapsed&quot; fibonacci matrices<\/span><\/div><div class=\"line\" id=\"LC2\"><span class=\"kr\">type<\/span> <span class=\"kt\">Fiblist<\/span> <span class=\"ow\">=<\/span> <span class=\"p\">(<\/span><span class=\"kt\">Integer<\/span><span class=\"p\">,<\/span> <span class=\"kt\">Integer<\/span><span class=\"p\">,<\/span> <span class=\"kt\">Integer<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC3\">&nbsp;&nbsp;<\/div><div class=\"line\" id=\"LC4\"><span class=\"c1\">-- This data type wraps the double-return value needed by fibSum&#39;<\/span><\/div><div class=\"line\" id=\"LC5\"><span class=\"kr\">data<\/span> <span class=\"kt\">PowerSum<\/span> <span class=\"ow\">=<\/span> <span class=\"kt\">PowerSum<\/span> <span class=\"p\">{<\/span><\/div><div class=\"line\" id=\"LC6\">&nbsp;&nbsp;<span class=\"n\">curr_pow<\/span> <span class=\"ow\">::<\/span> <span class=\"kt\">Fiblist<\/span><span class=\"p\">,<\/span><\/div><div class=\"line\" id=\"LC7\">&nbsp;&nbsp;<span class=\"n\">curr_sum<\/span> <span class=\"ow\">::<\/span> <span class=\"kt\">Fiblist<\/span><\/div><div class=\"line\" id=\"LC8\"><span class=\"p\">}<\/span><\/div><div class=\"line\" id=\"LC9\">&nbsp;<\/div><div class=\"line\" id=\"LC10\"><span class=\"nf\">i<\/span> <span class=\"ow\">=<\/span> <span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC11\"><span class=\"nf\">b<\/span> <span class=\"ow\">=<\/span> <span class=\"p\">(<\/span><span class=\"mi\">8<\/span><span class=\"p\">,<\/span><span class=\"mi\">2<\/span><span class=\"p\">,<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC12\"><span class=\"nf\">m<\/span> <span class=\"ow\">=<\/span> <span class=\"p\">(<\/span><span class=\"mi\">4<\/span><span class=\"p\">,<\/span><span class=\"mi\">1<\/span><span class=\"p\">,<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC13\">&nbsp;<\/div><div class=\"line\" id=\"LC14\"><span class=\"c1\">-- misc helper functions<\/span><\/div><div class=\"line\" id=\"LC15\"><span class=\"nf\">first<\/span> <span class=\"ow\">::<\/span> <span class=\"kt\">Fiblist<\/span> <span class=\"ow\">-&gt;<\/span> <span class=\"kt\">Integer<\/span><\/div><div class=\"line\" id=\"LC16\"><span class=\"nf\">first<\/span> <span class=\"p\">(<\/span><span class=\"n\">a<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"p\">,<\/span> <span class=\"n\">c<\/span><span class=\"p\">)<\/span> <span class=\"ow\">=<\/span> <span class=\"n\">a<\/span><\/div><div class=\"line\" id=\"LC17\">&nbsp;<\/div><div class=\"line\" id=\"LC18\"><span class=\"p\">(<\/span><span class=\"o\">.+<\/span><span class=\"p\">)<\/span> <span class=\"ow\">::<\/span> <span class=\"kt\">Fiblist<\/span> <span class=\"ow\">-&gt;<\/span> <span class=\"kt\">Fiblist<\/span> <span class=\"ow\">-&gt;<\/span> <span class=\"kt\">Fiblist<\/span><\/div><div class=\"line\" id=\"LC19\"><span class=\"p\">(<\/span><span class=\"o\">.+<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"n\">a1<\/span><span class=\"p\">,<\/span> <span class=\"n\">a2<\/span><span class=\"p\">,<\/span> <span class=\"n\">a3<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"n\">b1<\/span><span class=\"p\">,<\/span> <span class=\"n\">b2<\/span><span class=\"p\">,<\/span> <span class=\"n\">b3<\/span><span class=\"p\">)<\/span> <span class=\"ow\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">a1<\/span><span class=\"o\">+<\/span><span class=\"n\">b1<\/span><span class=\"p\">,<\/span> <span class=\"n\">a2<\/span><span class=\"o\">+<\/span><span class=\"n\">b2<\/span><span class=\"p\">,<\/span> <span class=\"n\">a3<\/span><span class=\"o\">+<\/span><span class=\"n\">b3<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC20\">&nbsp;<\/div><div class=\"line\" id=\"LC21\"><span class=\"p\">(<\/span><span class=\"o\">.*<\/span><span class=\"p\">)<\/span> <span class=\"ow\">::<\/span> <span class=\"kt\">Fiblist<\/span> <span class=\"ow\">-&gt;<\/span> <span class=\"kt\">Fiblist<\/span> <span class=\"ow\">-&gt;<\/span> <span class=\"kt\">Fiblist<\/span><\/div><div class=\"line\" id=\"LC22\"><span class=\"p\">(<\/span><span class=\"o\">.*<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"n\">a1<\/span><span class=\"p\">,<\/span> <span class=\"n\">a2<\/span><span class=\"p\">,<\/span> <span class=\"n\">a3<\/span><span class=\"p\">)<\/span> <span class=\"p\">(<\/span><span class=\"n\">b1<\/span><span class=\"p\">,<\/span> <span class=\"n\">b2<\/span><span class=\"p\">,<\/span> <span class=\"n\">b3<\/span><span class=\"p\">)<\/span> <span class=\"ow\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">a1<\/span><span class=\"o\">*<\/span><span class=\"n\">b1<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a2<\/span><span class=\"o\">*<\/span><span class=\"n\">b2<\/span><span class=\"p\">,<\/span> <span class=\"n\">a1<\/span><span class=\"o\">*<\/span><span class=\"n\">b2<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a2<\/span><span class=\"o\">*<\/span><span class=\"n\">b3<\/span><span class=\"p\">,<\/span> <span class=\"n\">a2<\/span><span class=\"o\">*<\/span><span class=\"n\">b2<\/span> <span class=\"o\">+<\/span> <span class=\"n\">a3<\/span><span class=\"o\">*<\/span><span class=\"n\">b3<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC23\">&nbsp;<\/div><div class=\"line\" id=\"LC24\"><span class=\"c1\">-- top-level, bootstrapping function<\/span><\/div><div class=\"line\" id=\"LC25\"><span class=\"nf\">fibSum<\/span> <span class=\"ow\">::<\/span> <span class=\"p\">(<\/span><span class=\"kt\">Integral<\/span> <span class=\"n\">a<\/span><span class=\"p\">)<\/span> <span class=\"ow\">=&gt;<\/span> <span class=\"n\">a<\/span> <span class=\"ow\">-&gt;<\/span> <span class=\"kt\">Integer<\/span><\/div><div class=\"line\" id=\"LC26\"><span class=\"nf\">fibSum<\/span> <span class=\"mi\">0<\/span> <span class=\"ow\">=<\/span> <span class=\"mi\">0<\/span><\/div><div class=\"line\" id=\"LC27\"><span class=\"nf\">fibSum<\/span> <span class=\"mi\">1<\/span> <span class=\"ow\">=<\/span> <span class=\"mi\">2<\/span><\/div><div class=\"line\" id=\"LC28\"><span class=\"nf\">fibSum<\/span> <span class=\"n\">n<\/span> <span class=\"ow\">=<\/span> <span class=\"kr\">let<\/span> <span class=\"n\">sum_list<\/span> <span class=\"ow\">=<\/span> <span class=\"n\">curr_sum<\/span> <span class=\"p\">(<\/span><span class=\"n\">fibSum&#39;<\/span> <span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"o\">-<\/span><span class=\"mi\">2<\/span><span class=\"p\">))<\/span><\/div><div class=\"line\" id=\"LC29\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"kr\">in<\/span> <span class=\"n\">first<\/span> <span class=\"p\">(<\/span><span class=\"n\">b<\/span> <span class=\"o\">.*<\/span> <span class=\"n\">sum_list<\/span><span class=\"p\">)<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">2<\/span><\/div><div class=\"line\" id=\"LC30\">&nbsp;<\/div><div class=\"line\" id=\"LC31\"><span class=\"c1\">--recursive function. Does the heavy lifting<\/span><\/div><div class=\"line\" id=\"LC32\"><span class=\"nf\">fibSum&#39;<\/span> <span class=\"ow\">::<\/span> <span class=\"p\">(<\/span><span class=\"kt\">Integral<\/span> <span class=\"n\">a<\/span><span class=\"p\">)<\/span> <span class=\"ow\">=&gt;<\/span> <span class=\"n\">a<\/span> <span class=\"ow\">-&gt;<\/span> <span class=\"kt\">PowerSum<\/span><\/div><div class=\"line\" id=\"LC33\"><span class=\"nf\">fibSum&#39;<\/span> <span class=\"n\">n<\/span><\/div><div class=\"line\" id=\"LC34\">&nbsp;&nbsp;<span class=\"o\">|<\/span> <span class=\"n\">n<\/span> <span class=\"o\">==<\/span> <span class=\"mi\">0<\/span> <span class=\"ow\">=<\/span> <span class=\"kt\">PowerSum<\/span> <span class=\"n\">i<\/span> <span class=\"n\">i<\/span><\/div><div class=\"line\" id=\"LC35\">&nbsp;&nbsp;<span class=\"o\">|<\/span> <span class=\"n\">odd<\/span> <span class=\"n\">n<\/span> <span class=\"ow\">=<\/span> <span class=\"kr\">let<\/span> <span class=\"n\">ps<\/span> <span class=\"ow\">=<\/span> <span class=\"n\">fibSum&#39;<\/span> <span class=\"p\">(<\/span><span class=\"n\">floor<\/span> <span class=\"p\">(<\/span><span class=\"n\">fromIntegral<\/span> <span class=\"n\">n<\/span><span class=\"o\">/<\/span><span class=\"mi\">2<\/span><span class=\"p\">))<\/span><\/div><div class=\"line\" id=\"LC36\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">s<\/span> <span class=\"ow\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">curr_sum<\/span> <span class=\"n\">ps<\/span><span class=\"p\">)<\/span> <span class=\"c1\">-- sum as of floor(n/2)<\/span><\/div><div class=\"line\" id=\"LC37\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">p<\/span> <span class=\"ow\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">curr_pow<\/span> <span class=\"n\">ps<\/span><span class=\"p\">)<\/span> <span class=\"c1\">-- m ^ floor(n/2)<\/span><\/div><div class=\"line\" id=\"LC38\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">t<\/span> <span class=\"ow\">=<\/span> <span class=\"n\">p<\/span> <span class=\"o\">.*<\/span> <span class=\"n\">m<\/span> <span class=\"c1\">-- m ^ ceil(n/2)<\/span><\/div><div class=\"line\" id=\"LC39\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">m_exp_n<\/span> <span class=\"ow\">=<\/span> <span class=\"n\">t<\/span> <span class=\"o\">.*<\/span> <span class=\"n\">p<\/span> <span class=\"c1\">-- m ^ n<\/span><\/div><div class=\"line\" id=\"LC40\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"kr\">in<\/span> <span class=\"kt\">PowerSum<\/span> <span class=\"n\">m_exp_n<\/span> <span class=\"p\">((<\/span><span class=\"n\">t<\/span> <span class=\"o\">.*<\/span> <span class=\"n\">s<\/span><span class=\"p\">)<\/span> <span class=\"o\">.+<\/span> <span class=\"n\">s<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC41\">&nbsp;&nbsp;<span class=\"o\">|<\/span> <span class=\"n\">even<\/span> <span class=\"n\">n<\/span> <span class=\"ow\">=<\/span> <span class=\"kr\">let<\/span> <span class=\"n\">ps<\/span> <span class=\"ow\">=<\/span> <span class=\"n\">fibSum&#39;<\/span> <span class=\"p\">((<\/span><span class=\"n\">n<\/span> <span class=\"p\">`<\/span><span class=\"n\">div<\/span><span class=\"p\">`<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC42\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">s<\/span> <span class=\"ow\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">curr_sum<\/span> <span class=\"n\">ps<\/span><span class=\"p\">)<\/span> <span class=\"c1\">-- sum as of n/2 - 1<\/span><\/div><div class=\"line\" id=\"LC43\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">p<\/span> <span class=\"ow\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">curr_pow<\/span> <span class=\"n\">ps<\/span><span class=\"p\">)<\/span> <span class=\"c1\">-- m ^ (n/2 - 1)<\/span><\/div><div class=\"line\" id=\"LC44\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">t<\/span> <span class=\"ow\">=<\/span> <span class=\"n\">p<\/span> <span class=\"o\">.*<\/span> <span class=\"n\">m<\/span> <span class=\"c1\">-- m ^ n/2<\/span><\/div><div class=\"line\" id=\"LC45\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">m_exp_n<\/span> <span class=\"ow\">=<\/span> <span class=\"n\">t<\/span> <span class=\"o\">.*<\/span> <span class=\"n\">t<\/span> <span class=\"c1\">-- m ^ n<\/span><\/div><div class=\"line\" id=\"LC46\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"kr\">in<\/span> <span class=\"kt\">PowerSum<\/span> <span class=\"n\">m_exp_n<\/span> <span class=\"p\">((<\/span><span class=\"n\">t<\/span> <span class=\"o\">.*<\/span> <span class=\"n\">s<\/span><span class=\"p\">)<\/span> <span class=\"o\">.+<\/span> <span class=\"n\">s<\/span> <span class=\"o\">.+<\/span> <span class=\"n\">m_exp_n<\/span><span class=\"p\">)<\/span><\/div><\/pre><\/div>\n          \n        <\/div>\n\n        <div class=\"gist-meta\">\n          <a href=\"http://gist.github.com/raw/123403/ff6b06706fed0f6a74c4a1a0d33fa1b7c6d33038/gistfile1.hs\" style=\"float:right;\">view raw<\/a>\n          <a href=\"http://gist.github.com/123403#file_gistfile1.hs\" style=\"float:right;margin-right:10px;color:#666\">gistfile1.hs<\/a>\n          <a href=\"http://gist.github.com/123403\">This Gist<\/a> brought to you by <a href=\"http://github.com\">GitHub<\/a>.\n        <\/div>\n      <\/div>\n    \n  \n<\/div>\n')
