<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Frage zu Laufzeit von algorithmus (GCD)]]></title><description><![CDATA[<p>Hallo, ich wollte für meine Zahlenklasse einen Greatest Common Divisor Algorithmus implementieren. Auf Wikipedia habe ich diesen Code gefunden (etwas abgeändert):</p>
<pre><code class="language-cpp">void binary_gcd(T u, T v, T&amp; res)
{
	if (u == 0 || v == 0)
	{
		res = u | v;
		return;
	}

	unsigned int shift = 0;

	for (; ((u | v) &amp; 1) == 0; ++shift)
	{
		u &gt;&gt;= 1;
		v &gt;&gt;= 1;
	}

	while ((u &amp; 1) == 0)
		u &gt;&gt;= 1;

	T tmp;
	do
	{
		while ((v &amp; 1) == 0)
			v &gt;&gt;= 1;

		if (u &lt; v)
			v -= u;
		else
		{
			tmp = u - v;
			u = v;
			v = tmp;
		}

		v &gt;&gt;= 1;
	} while (v);

	res = u &lt;&lt; shift;
}
</code></pre>
<p>Dabei ist T meine Zahlenklasse.<br />
In der Boost Doku habe ich diesen Algorithmus gefunden:</p>
<pre><code class="language-cpp">void binary_gcd(T n, T m, T&amp; res)
{  

	if( n == 0 || m == 0)
	{
		res = n | m;
		return;
	}

	nrs mOdds = 0;
	nrs nOdds = 0;

	for( ; (m &amp; 1) == 0 ; m &gt;&gt;= 1, mOdds++ );
	for( ; (n &amp; 1) == 0 ; n &gt;&gt;= 1, nOdds++ );

	for( ; n != m ; )
	{
		if( n &lt; m )
		{
			for( m -= n, m &gt;&gt;= 1; (m &amp; 1) == 0 ; m &gt;&gt;= 1 );
		}
		else
		{
			for( n -= m, n &gt;&gt;= 1; (n &amp; 1) == 0 ; n &gt;&gt;= 1 );
		}
	}

	res = m &lt;&lt; min( mOdds, nOdds );
}
</code></pre>
<p>Der zweite Algorithmus läuft bei mir ungefähr doppelt so schnell, wie der erste. Der einzige Unterschied, der mir auffällt, ist, dass ich im Ersten eine zusätzliche temporäre Variable brauche. Allerdings kann ich mir nicht vorstellen, dass das viel an der Geschwindigkeit ändert (es ist ein statisches array, das mit memcpy gefüllt wird).<br />
Kann sich jemand von euch vorstellen, warum die zweite Variante doppelt so schnell ist wie die Erste?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269110/frage-zu-laufzeit-von-algorithmus-gcd</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 11:05:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269110.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Jun 2010 00:13:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Laufzeit von algorithmus (GCD) on Sat, 19 Jun 2010 00:13:43 GMT]]></title><description><![CDATA[<p>Hallo, ich wollte für meine Zahlenklasse einen Greatest Common Divisor Algorithmus implementieren. Auf Wikipedia habe ich diesen Code gefunden (etwas abgeändert):</p>
<pre><code class="language-cpp">void binary_gcd(T u, T v, T&amp; res)
{
	if (u == 0 || v == 0)
	{
		res = u | v;
		return;
	}

	unsigned int shift = 0;

	for (; ((u | v) &amp; 1) == 0; ++shift)
	{
		u &gt;&gt;= 1;
		v &gt;&gt;= 1;
	}

	while ((u &amp; 1) == 0)
		u &gt;&gt;= 1;

	T tmp;
	do
	{
		while ((v &amp; 1) == 0)
			v &gt;&gt;= 1;

		if (u &lt; v)
			v -= u;
		else
		{
			tmp = u - v;
			u = v;
			v = tmp;
		}

		v &gt;&gt;= 1;
	} while (v);

	res = u &lt;&lt; shift;
}
</code></pre>
<p>Dabei ist T meine Zahlenklasse.<br />
In der Boost Doku habe ich diesen Algorithmus gefunden:</p>
<pre><code class="language-cpp">void binary_gcd(T n, T m, T&amp; res)
{  

	if( n == 0 || m == 0)
	{
		res = n | m;
		return;
	}

	nrs mOdds = 0;
	nrs nOdds = 0;

	for( ; (m &amp; 1) == 0 ; m &gt;&gt;= 1, mOdds++ );
	for( ; (n &amp; 1) == 0 ; n &gt;&gt;= 1, nOdds++ );

	for( ; n != m ; )
	{
		if( n &lt; m )
		{
			for( m -= n, m &gt;&gt;= 1; (m &amp; 1) == 0 ; m &gt;&gt;= 1 );
		}
		else
		{
			for( n -= m, n &gt;&gt;= 1; (n &amp; 1) == 0 ; n &gt;&gt;= 1 );
		}
	}

	res = m &lt;&lt; min( mOdds, nOdds );
}
</code></pre>
<p>Der zweite Algorithmus läuft bei mir ungefähr doppelt so schnell, wie der erste. Der einzige Unterschied, der mir auffällt, ist, dass ich im Ersten eine zusätzliche temporäre Variable brauche. Allerdings kann ich mir nicht vorstellen, dass das viel an der Geschwindigkeit ändert (es ist ein statisches array, das mit memcpy gefüllt wird).<br />
Kann sich jemand von euch vorstellen, warum die zweite Variante doppelt so schnell ist wie die Erste?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914611</guid><dc:creator><![CDATA[BigO?]]></dc:creator><pubDate>Sat, 19 Jun 2010 00:13:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Laufzeit von algorithmus (GCD) on Sat, 19 Jun 2010 00:14:42 GMT]]></title><description><![CDATA[<p>edit: mOdds und nOdds sind vom typ unsigned int !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914612</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914612</guid><dc:creator><![CDATA[BigO?]]></dc:creator><pubDate>Sat, 19 Jun 2010 00:14:42 GMT</pubDate></item></channel></rss>