<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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>Коментарі до Лекція Двадцять Третя (Сезон Другий)</title>
	<atom:link href="http://mycollege.org.ua/2011/04/lektsiya-dvadtsyat-tretya-sezon-druhyj/feed/" rel="self" type="application/rss+xml" />
	<link>http://mycollege.org.ua/2011/04/lektsiya-dvadtsyat-tretya-sezon-druhyj/</link>
	<description></description>
	<lastBuildDate>Fri, 21 Oct 2016 09:25:14 +0300</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>Від: PostScriptum</title>
		<link>http://mycollege.org.ua/2011/04/lektsiya-dvadtsyat-tretya-sezon-druhyj/comment-page-1/#comment-382</link>
		<dc:creator>PostScriptum</dc:creator>
		<pubDate>Thu, 12 May 2011 19:54:37 +0000</pubDate>
		<guid isPermaLink="false">http://mycollege.org.ua/?p=356#comment-382</guid>
		<description>Ще одна невлада спроба =). Дубль 3, тепер вже точно все поескейпив =))) :
for (i=0; i&lt;a.l; i++)
	{
		for (j=0; j&lt;b.l; j++)
		{
			x = a.v[i]*(long long)b.v[j] + c.v[i+j];
			c.v[i+j]=x%mod;
			z = x/mod;

			for(k=i+j+1; z&gt;0; k++)
			{
				y = c.v[k]+z;
				c.v[k]=y%mod;
				z = y/mod;
			}
		}
	}</description>
		<content:encoded><![CDATA[<p>Ще одна невлада спроба =). Дубль 3, тепер вже точно все поескейпив =))) :<br />
for (i=0; i&lt;a.l; i++)<br />
	{<br />
		for (j=0; j&lt;b.l; j++)<br />
		{<br />
			x = a.v[i]*(long long)b.v[j] + c.v[i+j];<br />
			c.v[i+j]=x%mod;<br />
			z = x/mod;</p>
<p>			for(k=i+j+1; z&gt;0; k++)<br />
			{<br />
				y = c.v[k]+z;<br />
				c.v[k]=y%mod;<br />
				z = y/mod;<br />
			}<br />
		}<br />
	}</p>
]]></content:encoded>
	</item>
	<item>
		<title>Від: PostScriptum</title>
		<link>http://mycollege.org.ua/2011/04/lektsiya-dvadtsyat-tretya-sezon-druhyj/comment-page-1/#comment-381</link>
		<dc:creator>PostScriptum</dc:creator>
		<pubDate>Thu, 12 May 2011 19:50:47 +0000</pubDate>
		<guid isPermaLink="false">http://mycollege.org.ua/?p=356#comment-381</guid>
		<description>Ось основний цикл, надіюсь, тепер буде без ескейпів (раніше &quot;менше b&quot; вважалось початком HTML-тегу) =)
for (i=0; i &lt; a.l; i++)
	{
		for (j=0; j &lt;b&gt;0; k++)
			{
				y = c.v[k]+z;
				c.v[k]=y%mod;
				z = y/mod;
			}
		}
	}</description>
		<content:encoded><![CDATA[<p>Ось основний цикл, надіюсь, тепер буде без ескейпів (раніше &#8220;менше b&#8221; вважалось початком HTML-тегу) =)<br />
for (i=0; i &lt; a.l; i++)<br />
	{<br />
		for (j=0; j <b>0; k++)<br />
			{<br />
				y = c.v[k]+z;<br />
				c.v[k]=y%mod;<br />
				z = y/mod;<br />
			}<br />
		}<br />
	}</b></p>
]]></content:encoded>
	</item>
	<item>
		<title>Від: admin</title>
		<link>http://mycollege.org.ua/2011/04/lektsiya-dvadtsyat-tretya-sezon-druhyj/comment-page-1/#comment-380</link>
		<dc:creator>admin</dc:creator>
		<pubDate>Thu, 05 May 2011 22:11:16 +0000</pubDate>
		<guid isPermaLink="false">http://mycollege.org.ua/?p=356#comment-380</guid>
		<description>Напиши, що мало бути на місці цього рядка і я поправлю
for (j=0; j0; k++, carr++)</description>
		<content:encoded><![CDATA[<p>Напиши, що мало бути на місці цього рядка і я поправлю<br />
for (j=0; j0; k++, carr++)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Від: PostScriptum</title>
		<link>http://mycollege.org.ua/2011/04/lektsiya-dvadtsyat-tretya-sezon-druhyj/comment-page-1/#comment-379</link>
		<dc:creator>PostScriptum</dc:creator>
		<pubDate>Thu, 05 May 2011 19:00:58 +0000</pubDate>
		<guid isPermaLink="false">http://mycollege.org.ua/?p=356#comment-379</guid>
		<description>В коді вище мабуть єж якась послідовність символів, що замість коменту зробила його жирним =). Тому перший жирний рядок, що не буде компілитись, варто закоментувати =)).</description>
		<content:encoded><![CDATA[<p>В коді вище мабуть єж якась послідовність символів, що замість коменту зробила його жирним =). Тому перший жирний рядок, що не буде компілитись, варто закоментувати =)).</p>
]]></content:encoded>
	</item>
	<item>
		<title>Від: PostScriptum</title>
		<link>http://mycollege.org.ua/2011/04/lektsiya-dvadtsyat-tretya-sezon-druhyj/comment-page-1/#comment-378</link>
		<dc:creator>PostScriptum</dc:creator>
		<pubDate>Thu, 05 May 2011 18:57:24 +0000</pubDate>
		<guid isPermaLink="false">http://mycollege.org.ua/?p=356#comment-378</guid>
		<description>Якщо комусь цікаво, то я потестив рішення &quot;N^3&quot;, що було запропоноване на лекції для множення довгого на довге. Як я і передбачав, там зовсім не N^3, а N^2 навіть для найгіршого випадку (думаю, що ним є 999...999 * 999...999). Отже, множення двох таких чисел довжинами N в системі числення 1000 000 000 займало:
N=1000:  0.087 c
N=2000:  0.36 c
N=5000:  2.2 c
N=10000: 8.8 c
N=20000: 35.6 c
Максимальна кількість ітерацій внутрішнього циклу при i=1, j=0 складає N, але середня кількість ітерацій для всього множення - 1.999 - ніби прямує до 2 =).

Отже, маємо чистий N^2 і без всяких проблем з відкладанням і накопиченням оверфловів.

PS: Якщо хтось не в курсі (а таких ніби більшість), то мова йде про наступну реалізацію:
#include 
#include 

const int L = 50000;
const int mod = 1000000000;

struct LVal
{
	int v[L];
	int l;
};

LVal a,b;

int max(int a, int b)
{
	return a&gt;b?a:b;
}

LVal LMul(LVal &amp;a, LVal &amp;b)
{
	LVal c;
	
	long long x;
	int y;
	int z;
	int i,j,k;
	int carr;
	int cs = 0;

	for(i=0; i&lt;L; i++)
	{
		c.v[i]=0;
	}

	clock_t begin=clock();

	int maxcarry = 0;

	for (i=0; i&lt;a.l; i++)
	{
		for (j=0; j&lt;b&gt;0; k++, carr++)
			for(k=i+j+1; z&gt;0; k++)
			{
				y = c.v[k]+z;
				c.v[k]=y%mod;
				z = y/mod;
			}
			//cs+=carr;
			//maxcarry = max(maxcarry, carr);
		}
	}
	clock_t end=clock();

	//printf(&quot;MaxCarry: %d\n&quot;, maxcarry);
	//printf(&quot;AvgCarry: %lf\n&quot;, cs/(double)(a.l*b.l));
	printf(&quot;Mult time: %lf ms\n&quot;, (double)(end-begin)/CLOCKS_PER_SEC);
	c.l = a.l+b.l-1 + (c.v[a.l+b.l-1]&gt;0 ? 1 : 0);
	return c;
}

void LPrint(LVal a)
{
	printf(&quot;%d&quot;, a.v[a.l-1]);
	for (int i=a.l-2; i&gt;=0; i--)
	{
		printf(&quot;%09d&quot;, a.v[i]);
	}
}

int main()
{
	int testLen = 20000;
	for (int i=0; i&lt;testLen; i++)
	{
		a.v[i]=999999999;
		b.v[i]=999999999;
	}
	a.l=testLen;
	b.l=testLen;
	printf(&quot;%d&quot;, LMul(a, b).l);

	return 0;
}</description>
		<content:encoded><![CDATA[<p>Якщо комусь цікаво, то я потестив рішення &#8220;N^3&#8243;, що було запропоноване на лекції для множення довгого на довге. Як я і передбачав, там зовсім не N^3, а N^2 навіть для найгіршого випадку (думаю, що ним є 999&#8230;999 * 999&#8230;999). Отже, множення двох таких чисел довжинами N в системі числення 1000 000 000 займало:<br />
N=1000:  0.087 c<br />
N=2000:  0.36 c<br />
N=5000:  2.2 c<br />
N=10000: 8.8 c<br />
N=20000: 35.6 c<br />
Максимальна кількість ітерацій внутрішнього циклу при i=1, j=0 складає N, але середня кількість ітерацій для всього множення &#8211; 1.999 &#8211; ніби прямує до 2 =).</p>
<p>Отже, маємо чистий N^2 і без всяких проблем з відкладанням і накопиченням оверфловів.</p>
<p>PS: Якщо хтось не в курсі (а таких ніби більшість), то мова йде про наступну реалізацію:<br />
#include<br />
#include </p>
<p>const int L = 50000;<br />
const int mod = 1000000000;</p>
<p>struct LVal<br />
{<br />
	int v[L];<br />
	int l;<br />
};</p>
<p>LVal a,b;</p>
<p>int max(int a, int b)<br />
{<br />
	return a&gt;b?a:b;<br />
}</p>
<p>LVal LMul(LVal &amp;a, LVal &amp;b)<br />
{<br />
	LVal c;</p>
<p>	long long x;<br />
	int y;<br />
	int z;<br />
	int i,j,k;<br />
	int carr;<br />
	int cs = 0;</p>
<p>	for(i=0; i&lt;L; i++)<br />
	{<br />
		c.v[i]=0;<br />
	}</p>
<p>	clock_t begin=clock();</p>
<p>	int maxcarry = 0;</p>
<p>	for (i=0; i&lt;a.l; i++)<br />
	{<br />
		for (j=0; j<b>0; k++, carr++)<br />
			for(k=i+j+1; z&gt;0; k++)<br />
			{<br />
				y = c.v[k]+z;<br />
				c.v[k]=y%mod;<br />
				z = y/mod;<br />
			}<br />
			//cs+=carr;<br />
			//maxcarry = max(maxcarry, carr);<br />
		}<br />
	}<br />
	clock_t end=clock();</p>
<p>	//printf(&#8221;MaxCarry: %d\n&#8221;, maxcarry);<br />
	//printf(&#8221;AvgCarry: %lf\n&#8221;, cs/(double)(a.l*b.l));<br />
	printf(&#8221;Mult time: %lf ms\n&#8221;, (double)(end-begin)/CLOCKS_PER_SEC);<br />
	c.l = a.l+b.l-1 + (c.v[a.l+b.l-1]&gt;0 ? 1 : 0);<br />
	return c;<br />
}</p>
<p>void LPrint(LVal a)<br />
{<br />
	printf(&#8221;%d&#8221;, a.v[a.l-1]);<br />
	for (int i=a.l-2; i&gt;=0; i&#8211;)<br />
	{<br />
		printf(&#8221;%09d&#8221;, a.v[i]);<br />
	}<br />
}</p>
<p>int main()<br />
{<br />
	int testLen = 20000;<br />
	for (int i=0; i&lt;testLen; i++)<br />
	{<br />
		a.v[i]=999999999;<br />
		b.v[i]=999999999;<br />
	}<br />
	a.l=testLen;<br />
	b.l=testLen;<br />
	printf(&quot;%d&quot;, LMul(a, b).l);</p>
<p>	return 0;<br />
}</b></p>
]]></content:encoded>
	</item>
</channel>
</rss>
