<?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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mad Python &#187; programming</title>
	<atom:link href="http://blog.madpython.com/tag/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.madpython.com</link>
	<description>Watch out.. he's angry</description>
	<lastBuildDate>Thu, 04 Nov 2010 14:19:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Fuzzy Mathematics with FuzzPy (Part 1)</title>
		<link>http://blog.madpython.com/2010/10/17/fuzzy-mathematics-with-fuzzpy-part-1/</link>
		<comments>http://blog.madpython.com/2010/10/17/fuzzy-mathematics-with-fuzzpy-part-1/#comments</comments>
		<pubDate>Sun, 17 Oct 2010 22:43:15 +0000</pubDate>
		<dc:creator>Xavier</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[CS]]></category>
		<category><![CDATA[engineering]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://blog.madpython.com/?p=165</guid>
		<description><![CDATA[FuzzPy is a python library that exposes specialized datatypes to deal with a wide range of fuzzy number types, fuzzy sets, and fuzzy graphs. Binary operations against each type, such as set unions and intersections, can be performed using some &#8230; <a href="http://blog.madpython.com/2010/10/17/fuzzy-mathematics-with-fuzzpy-part-1/">Continue reading <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://blog.madpython.com/2010/11/03/fuzzy-mathematics-with-fuzzpy-part-2/' rel='bookmark' title='Fuzzy Mathematics with FuzzPy (Part 2)'>Fuzzy Mathematics with FuzzPy (Part 2)</a></li>
<li><a href='http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/' rel='bookmark' title='Algorithms in Python: Binary exponentiation'>Algorithms in Python: Binary exponentiation</a></li>
<li><a href='http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/' rel='bookmark' title='Algorithms in Python: Binary Operations'>Algorithms in Python: Binary Operations</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://github.com/ezod/fuzzpy" onclick="return TrackClick('http%3A%2F%2Fgithub.com%2Fezod%2Ffuzzpy','FuzzPy')">FuzzPy</a> is a python library that exposes specialized datatypes to deal with a wide range of fuzzy number types, fuzzy sets, and fuzzy graphs. Binary operations against each type, such as set unions and intersections, can be performed using some of python&#8217;s native binary operators (<code>|</code>, <code>&#038;</code>, <code>==</code>), or specialized methods if you wish to deviate from the default functions for these computations. </p>
<p>FuzzPy also provides several helper methods such as kernel and neighbors isolation, alpha-cuts, cardinality testing, shortest-path computation, and minimum spanning trees. A powerful visualization framework also allows you to quickly create and save visualizations for your data.</p>
<p>In this post, we will examine fuzzy sets and fuzzy graphs, and see how one can use FuzzPy to work with these types, providing examples for each. In the next post of this series, we will examine the different types of fuzzy numbers, generate visualizations, and explore advanced concepts such as automatic fuzzification, and importing graph data from fuzzy adjacency matrices.</p>
<h2>Fuzzy Sets</h2>
<p>A fuzzy set is simply a set in which each element has an associated degree of membership into the set. This membership value is called <img src='http://s0.wp.com/latex.php?latex=%5Cmu&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;mu' title='&#92;mu' class='latex' />-value of the element. A <img src='http://s0.wp.com/latex.php?latex=%5Cmu&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;mu' title='&#92;mu' class='latex' />-value of zero indicates that the element does not belong to the set, while any value between zero (exclusive) and one (inclusive), indicates that the element is, to a certain degree, a set member.</p>
<p>Creating a fuzzy set with FuzzPy is just a matter of creating a new <code>FuzzySet</code> object, then either calling the <code>add(FuzzyElement(value, mu))</code> method for each element to import, or using the <code>update(elements)</code> method, providing it with a list of <code>FuzzyElement(value, <img src='http://s0.wp.com/latex.php?latex=%5Cmu&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;mu' title='&#92;mu' class='latex' />-value)</code> tuples for bulk import.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> fuzz <span style="color: #ff7700;font-weight:bold;">import</span> FuzzySet, FuzzyElement
&nbsp;
<span style="color: #808080; font-style: italic;"># Create two lists of FuzzyElements</span>
elements_a = <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">0.3</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">0.5</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">0.7</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">0.9</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
elements_b = <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">0.8</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">0.6</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">0.4</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">0.2</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
&nbsp;
elements_a = <span style="color: black;">&#91;</span>FuzzyElement<span style="color: black;">&#40;</span>x<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, x<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> elements_a<span style="color: black;">&#93;</span>
elements_b = <span style="color: black;">&#91;</span>FuzzyElement<span style="color: black;">&#40;</span>x<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, x<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> elements_b<span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Create two fuzzy sets</span>
set_a = FuzzySet<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
set_b = FuzzySet<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
set_a.<span style="color: black;">update</span><span style="color: black;">&#40;</span>elements_a<span style="color: black;">&#41;</span>
set_b.<span style="color: black;">update</span><span style="color: black;">&#40;</span>elements_b<span style="color: black;">&#41;</span></pre></div></div>

<p>We&#8217;ve just created a couple fuzzy sets with four elements each. Notice that two of the elements are common to both <code>set_a</code> and <code>set_b</code> (albeit with different <img src='http://s0.wp.com/latex.php?latex=%5Cmu&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;mu' title='&#92;mu' class='latex' />-values). We can now perform several operations against these sample sets. Save the code above in a file called <code>example.py</code> and fire up the python interpreter to test fuzzy set functionality against our sets:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> example <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #808080; font-style: italic;"># Set Difference</span>
...
<span style="color: #66cc66;">&gt;&gt;&gt;</span> set_a - set_b
FuzzySet<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">0.500000</span><span style="color: black;">&#41;</span>, FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">0.900000</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> set_b - set_a
FuzzySet<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">0.200000</span><span style="color: black;">&#41;</span>, FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">0.600000</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># Set Union</span>
...
<span style="color: #66cc66;">&gt;&gt;&gt;</span> set_a | set_b
FuzzySet<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">0.400000</span><span style="color: black;">&#41;</span>, FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">0.500000</span><span style="color: black;">&#41;</span>, FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">0.800000</span><span style="color: black;">&#41;</span>, FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">0.900000</span><span style="color: black;">&#41;</span>, FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">0.600000</span><span style="color: black;">&#41;</span>, FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">0.200000</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># Set Intersection</span>
...
<span style="color: #66cc66;">&gt;&gt;&gt;</span> set_a <span style="color: #66cc66;">&amp;</span> set_b
FuzzySet<span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">0.300000</span><span style="color: black;">&#41;</span>, FuzzyElement<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">0.700000</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></pre></div></div>

<h2>Fuzzy graphs</h2>
<p>In a fuzzy graph or digraph, each vertice and each edge can be associated with a <img src='http://s0.wp.com/latex.php?latex=%5Cmu&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;mu' title='&#92;mu' class='latex' />-value. The <img src='http://s0.wp.com/latex.php?latex=%5Cmu&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;mu' title='&#92;mu' class='latex' />-value of a vertice indicates the vertice&#8217;s degree of membership into the graph, while an edge or arc&#8217;s <img src='http://s0.wp.com/latex.php?latex=%5Cmu&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;mu' title='&#92;mu' class='latex' />-value indicates the degree of connectivity between the head and tail vertices. </p>
<p>The creation of fuzzy graphs is also pretty straightforward: create a set or fuzzy set (see above), then feed that set to the fuzz.Graph constructor, along with the <code>directed</code> boolean value to specify whether you&#8217;d like to create a graph or a digraph. You can then use the <code>fuzz.Graph.connect(head, tail, mu)</code> method to add edges to the graph:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> fuzz
&nbsp;
<span style="color: #808080; font-style: italic;"># Create two sets of vertices</span>
set_a = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">5</span>, <span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">9</span>, <span style="color: #ff4500;">10</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
set_b = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">11</span>, <span style="color: #ff4500;">12</span>, <span style="color: #ff4500;">13</span>, <span style="color: #ff4500;">14</span>, <span style="color: #ff4500;">15</span>, <span style="color: #ff4500;">16</span>, <span style="color: #ff4500;">17</span>, <span style="color: #ff4500;">18</span>, <span style="color: #ff4500;">19</span>, <span style="color: #ff4500;">20</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Create our graph objects</span>
graph_a = fuzz.<span style="color: black;">FuzzyGraph</span><span style="color: black;">&#40;</span>viter=set_a, directed=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
graph_b = fuzz.<span style="color: black;">FuzzyGraph</span><span style="color: black;">&#40;</span>viter=set_b, directed=<span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Create some arcs in graph_a</span>
graph_a.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">0.5</span><span style="color: black;">&#41;</span>
graph_a.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">0.06</span><span style="color: black;">&#41;</span>
graph_a.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">0.2</span><span style="color: black;">&#41;</span>
graph_a.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">0.9</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># And some in graph_b</span>
graph_b.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">11</span>, <span style="color: #ff4500;">19</span>, <span style="color: #ff4500;">0.9</span><span style="color: black;">&#41;</span>
graph_b.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">14</span>, <span style="color: #ff4500;">12</span>, <span style="color: #ff4500;">0.3</span><span style="color: black;">&#41;</span>
graph_b.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">15</span>, <span style="color: #ff4500;">14</span>, <span style="color: #ff4500;">0.5</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Save the code above in a file named <code>graphs.py</code> and fire up your python interpreter so we can experiment with graph operations:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">from</span> graphs <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #808080; font-style: italic;"># Retrieve the mu value of the edge between 1 and 3</span>
... 
<span style="color: #66cc66;">&gt;&gt;&gt;</span> graph_a.<span style="color: black;">mu</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #ff4500;">0.5</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #808080; font-style: italic;"># Retrieve an alpha-cut of graph_b against mu-value of 0.5</span>
... 
<span style="color: #66cc66;">&gt;&gt;&gt;</span> graph_b.<span style="color: black;">alpha</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0.5</span><span style="color: black;">&#41;</span>
Graph<span style="color: black;">&#40;</span>viter = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">11</span>, <span style="color: #ff4500;">12</span>, <span style="color: #ff4500;">13</span>, <span style="color: #ff4500;">14</span>, <span style="color: #ff4500;">15</span>, <span style="color: #ff4500;">16</span>, <span style="color: #ff4500;">17</span>, <span style="color: #ff4500;">18</span>, <span style="color: #ff4500;">19</span>, <span style="color: #ff4500;">20</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>, eiter = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">15</span>, <span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">11</span>, <span style="color: #ff4500;">19</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>, directed = <span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #808080; font-style: italic;"># Is graph_a a subgraph of graph_b? (no)</span>
... <span style="color: black;">graph_a</span>.<span style="color: black;">issubgraph</span><span style="color: black;">&#40;</span>graph_b<span style="color: black;">&#41;</span>
<span style="color: #008000;">False</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #808080; font-style: italic;"># Detect adjacent (connected) vertices</span>
...
<span style="color: #66cc66;">&gt;&gt;&gt;</span> graph_a.<span style="color: black;">adjacent</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">False</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> graph_a.<span style="color: black;">adjacent</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">True</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #808080; font-style: italic;"># Find all the neighbours of the vertex with value 3</span>
... 
<span style="color: #66cc66;">&gt;&gt;&gt;</span> graph_a.<span style="color: black;">neighbors</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
<span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">6</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #808080; font-style: italic;"># Find the shortest path to all vertices using 6 as origin</span>
... 
<span style="color: #66cc66;">&gt;&gt;&gt;</span> graph_a.<span style="color: black;">dijkstra</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span>
<span style="color: black;">&#123;</span><span style="color: #ff4500;">1</span>: <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">2</span>: <span style="color: #008000;">None</span>, <span style="color: #ff4500;">3</span>: <span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">4</span>: <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">5</span>: <span style="color: #008000;">None</span>, <span style="color: #ff4500;">6</span>: <span style="color: #008000;">None</span>, <span style="color: #ff4500;">7</span>: <span style="color: #008000;">None</span>, <span style="color: #ff4500;">8</span>: <span style="color: #008000;">None</span>, <span style="color: #ff4500;">9</span>: <span style="color: #008000;">None</span>, <span style="color: #ff4500;">10</span>: <span style="color: #008000;">None</span><span style="color: black;">&#125;</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #808080; font-style: italic;"># Find the minimum spanning tree of graph_a</span>
... 
<span style="color: #66cc66;">&gt;&gt;&gt;</span> graph_a.<span style="color: black;">minimum_spanning_tree</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
Graph<span style="color: black;">&#40;</span>viter = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">5</span>, <span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">8</span>, <span style="color: #ff4500;">9</span>, <span style="color: #ff4500;">10</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>, eiter = <span style="color: #008000;">set</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>, directed = <span style="color: #008000;">False</span><span style="color: black;">&#41;</span></pre></div></div>

<p>There are a few more operations available for both crisp and fuzzy graphs/digraphs. You should consult the <a href="http://packages.python.org/fuzzpy/" onclick="return TrackClick('http%3A%2F%2Fpackages.python.org%2Ffuzzpy%2F','API+doc')">API doc</a> for a comprehensive list.</p>
<p>You should also consult the <a href="http://github.com/ezod/fuzzpy/tree/master/examples/" onclick="return TrackClick('http%3A%2F%2Fgithub.com%2Fezod%2Ffuzzpy%2Ftree%2Fmaster%2Fexamples%2F','examples')">examples</a> provided as part of the module on GitHub to see FuzzPy in action.</p>
<p><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F10%2F17%2Ffuzzy-mathematics-with-fuzzpy-part-1%2F&amp;linkname=Fuzzy%20Mathematics%20with%20FuzzPy%20%28Part%201%29" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F10%2F17%2Ffuzzy-mathematics-with-fuzzpy-part-1%2F&amp;linkname=Fuzzy%20Mathematics%20with%20FuzzPy%20%28Part%201%29" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_bookmarks" href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F10%2F17%2Ffuzzy-mathematics-with-fuzzpy-part-1%2F&amp;linkname=Fuzzy%20Mathematics%20with%20FuzzPy%20%28Part%201%29" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F10%2F17%2Ffuzzy-mathematics-with-fuzzpy-part-1%2F&amp;linkname=Fuzzy%20Mathematics%20with%20FuzzPy%20%28Part%201%29" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F10%2F17%2Ffuzzy-mathematics-with-fuzzpy-part-1%2F&amp;linkname=Fuzzy%20Mathematics%20with%20FuzzPy%20%28Part%201%29" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F10%2F17%2Ffuzzy-mathematics-with-fuzzpy-part-1%2F&amp;linkname=Fuzzy%20Mathematics%20with%20FuzzPy%20%28Part%201%29" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F10%2F17%2Ffuzzy-mathematics-with-fuzzpy-part-1%2F&amp;linkname=Fuzzy%20Mathematics%20with%20FuzzPy%20%28Part%201%29" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.madpython.com%2F2010%2F10%2F17%2Ffuzzy-mathematics-with-fuzzpy-part-1%2F&amp;title=Fuzzy%20Mathematics%20with%20FuzzPy%20%28Part%201%29" id="wpa2a_2">Share</a></p><p>Related posts:<ol>
<li><a href='http://blog.madpython.com/2010/11/03/fuzzy-mathematics-with-fuzzpy-part-2/' rel='bookmark' title='Fuzzy Mathematics with FuzzPy (Part 2)'>Fuzzy Mathematics with FuzzPy (Part 2)</a></li>
<li><a href='http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/' rel='bookmark' title='Algorithms in Python: Binary exponentiation'>Algorithms in Python: Binary exponentiation</a></li>
<li><a href='http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/' rel='bookmark' title='Algorithms in Python: Binary Operations'>Algorithms in Python: Binary Operations</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.madpython.com/2010/10/17/fuzzy-mathematics-with-fuzzpy-part-1/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Algorithms in Python: Binary exponentiation</title>
		<link>http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/</link>
		<comments>http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 03:10:01 +0000</pubDate>
		<dc:creator>Xavier</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[CS]]></category>
		<category><![CDATA[engineering]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://blog.madpython.com/?p=142</guid>
		<description><![CDATA[The typical approach to exponentiation of a base b by an exponent n is to repeatedly multiply the base by itself, as such: This is easy to compute for small values but quickly chokes with very large values. A faster &#8230; <a href="http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/">Continue reading <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/' rel='bookmark' title='Algorithms in Python: Binary Operations'>Algorithms in Python: Binary Operations</a></li>
<li><a href='http://blog.madpython.com/2010/07/10/algorithms-in-python-base-expansion/' rel='bookmark' title='Algorithms in Python: Base Expansion'>Algorithms in Python: Base Expansion</a></li>
<li><a href='http://blog.madpython.com/2010/10/17/fuzzy-mathematics-with-fuzzpy-part-1/' rel='bookmark' title='Fuzzy Mathematics with FuzzPy (Part 1)'>Fuzzy Mathematics with FuzzPy (Part 1)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>The typical approach to exponentiation of a base <em>b</em> by an exponent <em>n</em> is to repeatedly multiply the base by itself, as such: <img src='http://s0.wp.com/latex.php?latex=b%5En+%3D+%5Cprod_%7Bi%3D1%7D%5E%7Bn%7D+b&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='b^n = &#92;prod_{i=1}^{n} b' title='b^n = &#92;prod_{i=1}^{n} b' class='latex' /></p>
<p>This is easy to compute for small values but quickly chokes with very large values.</p>
<p>A faster approach involves converting the exponent into base 2, then multiplying the running total and squaring the base each time a 1-bit is encountered. The python implementation looks like this:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> binary_exponent<span style="color: black;">&#40;</span>base, exponent<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;<span style="color: #000099; font-weight: bold;">\</span>
    Binary Exponentiation
&nbsp;
    Instead of computing the exponentiation in the traditional way,
    convert the exponent to its reverse binary representation.
&nbsp;
    Each time a 1-bit is encountered, we multiply the running total by
    the base, then square the base.
    &quot;&quot;&quot;</span>
    <span style="color: #808080; font-style: italic;"># Convert n to base 2, then reverse it.</span>
    exponent = bin<span style="color: black;">&#40;</span>exponent<span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>:<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>::-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
&nbsp;
    result = <span style="color: #ff4500;">1</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>exponent<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> exponent<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'1'</span>:
            result <span style="color: #66cc66;">*</span>= base
        base <span style="color: #66cc66;">*</span>= base
    <span style="color: #ff7700;font-weight:bold;">return</span> result</pre></div></div>

<p>Similarly, the same approach can be taken to perform modular exponentiation against very large exponents:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> modular_exponent<span style="color: black;">&#40;</span>base, exponent, mod<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;<span style="color: #000099; font-weight: bold;">\</span>
    Modular exponentiation through binary decomposition.
&nbsp;
    We use the same technique as for the binary exponentiation above in
    order to find the modulo of our very large exponent and an arbitrary
    integer mod.
    &quot;&quot;&quot;</span>
    exponent = bin<span style="color: black;">&#40;</span>exponent<span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>:<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>::-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
&nbsp;
    x = <span style="color: #ff4500;">1</span>
    power = base <span style="color: #66cc66;">%</span> mod
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>exponent<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> exponent<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'1'</span>:
            x = <span style="color: black;">&#40;</span>x <span style="color: #66cc66;">*</span> power<span style="color: black;">&#41;</span> <span style="color: #66cc66;">%</span> mod
        power = <span style="color: black;">&#40;</span>power <span style="color: #66cc66;">**</span> <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">%</span> mod
    <span style="color: #ff7700;font-weight:bold;">return</span> x</pre></div></div>

<p>The optimization is especially visible for the modulo operation, since we are working on smaller numbers with each iteration, whereas for simple exponentiation, the CPython interpreter can already optimize the operation.<br />
The speedup for modular exponentiation on my system was in the order of 72x the speed of a simple <img src='http://s0.wp.com/latex.php?latex=%28a%5En%29+%5Cmod%7Bm%7D&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='(a^n) &#92;mod{m}' title='(a^n) &#92;mod{m}' class='latex' /> whereas the the computation of the exponentiation took about the same time in both cases.</p>
<p><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F08%2F07%2Falgorithms-in-python-binary-exponentiation%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20exponentiation" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F08%2F07%2Falgorithms-in-python-binary-exponentiation%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20exponentiation" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_bookmarks" href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F08%2F07%2Falgorithms-in-python-binary-exponentiation%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20exponentiation" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F08%2F07%2Falgorithms-in-python-binary-exponentiation%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20exponentiation" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F08%2F07%2Falgorithms-in-python-binary-exponentiation%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20exponentiation" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F08%2F07%2Falgorithms-in-python-binary-exponentiation%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20exponentiation" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F08%2F07%2Falgorithms-in-python-binary-exponentiation%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20exponentiation" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.madpython.com%2F2010%2F08%2F07%2Falgorithms-in-python-binary-exponentiation%2F&amp;title=Algorithms%20in%20Python%3A%20Binary%20exponentiation" id="wpa2a_4">Share</a></p><p>Related posts:<ol>
<li><a href='http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/' rel='bookmark' title='Algorithms in Python: Binary Operations'>Algorithms in Python: Binary Operations</a></li>
<li><a href='http://blog.madpython.com/2010/07/10/algorithms-in-python-base-expansion/' rel='bookmark' title='Algorithms in Python: Base Expansion'>Algorithms in Python: Base Expansion</a></li>
<li><a href='http://blog.madpython.com/2010/10/17/fuzzy-mathematics-with-fuzzpy-part-1/' rel='bookmark' title='Fuzzy Mathematics with FuzzPy (Part 1)'>Fuzzy Mathematics with FuzzPy (Part 1)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Algorithms in Python: Binary Operations</title>
		<link>http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/</link>
		<comments>http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/#comments</comments>
		<pubDate>Sat, 17 Jul 2010 19:08:22 +0000</pubDate>
		<dc:creator>Xavier</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[CS]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.madpython.com/?p=131</guid>
		<description><![CDATA[Today I&#8217;d like to demonstrate a simple implementation of Kenneth Rosen&#8216;s binary addition and multiplication algorithms as outlined in &#34;Discrete Mathematics and its Applications&#34;. Both algorithms are very simple and work the same way we&#8217;ve all learned to do decimal &#8230; <a href="http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/">Continue reading <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/' rel='bookmark' title='Algorithms in Python: Binary exponentiation'>Algorithms in Python: Binary exponentiation</a></li>
<li><a href='http://blog.madpython.com/2010/07/10/algorithms-in-python-base-expansion/' rel='bookmark' title='Algorithms in Python: Base Expansion'>Algorithms in Python: Base Expansion</a></li>
<li><a href='http://blog.madpython.com/2010/10/17/fuzzy-mathematics-with-fuzzpy-part-1/' rel='bookmark' title='Fuzzy Mathematics with FuzzPy (Part 1)'>Fuzzy Mathematics with FuzzPy (Part 1)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Today I&#8217;d like to demonstrate a simple implementation of <a href="http://highered.mcgraw-hill.com/sites/0072880082/information_center_view0/about_the_author.html" onclick="return TrackClick('http%3A%2F%2Fhighered.mcgraw-hill.com%2Fsites%2F0072880082%2Finformation_center_view0%2Fabout_the_author.html','Kenneth+Rosen')" target="_blank">Kenneth Rosen</a>&#8216;s binary addition and multiplication algorithms as outlined in &quot;<a href="http://www.amazon.com/Discrete-Mathematics-Applications-Kenneth-Rosen/dp/0071244743/ref=sr_1_2?ie=UTF8&#038;s=books&#038;qid=1279392073&#038;sr=8-2" onclick="return TrackClick('http%3A%2F%2Fwww.amazon.com%2FDiscrete-Mathematics-Applications-Kenneth-Rosen%2Fdp%2F0071244743%2Fref%3Dsr_1_2%3Fie%3DUTF8%26s%3Dbooks%26qid%3D1279392073%26sr%3D8-2','Discrete+Mathematics+and+its+Applications')" target="_blank">Discrete Mathematics and its Applications</a>&quot;. Both algorithms are very simple and work the same way we&#8217;ve all learned to do decimal additions and multiplications by hand in grade-school.</p>
<p>As usual, I&#8217;ve also provided a unit-test suite for each algorithm.</p>
<p><strong>Please note:</strong> This is only intended to demonstrate the algorithms. If you are actually trying to do some real work with binary numbers in Python, note that the language itself provides a highly optimized implementation of binary numbers and related operations. Here are a few examples:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># Decimal to binary conversion:</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> bin<span style="color: black;">&#40;</span><span style="color: #ff4500;">15</span><span style="color: black;">&#41;</span>
<span style="color: #483d8b;">'0b1111'</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Binary to decimal conversion:</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>0b1111<span style="color: black;">&#41;</span>
<span style="color: #483d8b;">'15'</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Binary addition:</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> bin<span style="color: black;">&#40;</span>0b1111 + 0b10011<span style="color: black;">&#41;</span>
<span style="color: #483d8b;">'0b100010'</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Binary multiplication:</span>
<span style="color: #66cc66;">&gt;&gt;&gt;</span> bin<span style="color: black;">&#40;</span>0b1111 <span style="color: #66cc66;">*</span> 0b10011<span style="color: black;">&#41;</span>
<span style="color: #483d8b;">'0b100011101'</span></pre></div></div>

<h2>Binary Addition</h2>
<p>We will use strings in this example to represent sequences of bits. The algorithm operates right-to-left, maintaining a carry each time it adds two 1-valued bits.</p>
<h3>Code:</h3>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #483d8b;">&quot;&quot;&quot;Simple binary operation algorithm.&quot;&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">math</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># a and b should be string representation of the binary components</span>
<span style="color: #808080; font-style: italic;"># You could easily extend this to overload the + operator for binaries,</span>
<span style="color: #808080; font-style: italic;"># but this is already built into python.</span>
<span style="color: #ff7700;font-weight:bold;">def</span> binary_addition<span style="color: black;">&#40;</span>bin_a, bin_b<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Performs a binary addition against two provided binary numbers&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Pad the components so they are of equal length</span>
    max_length = <span style="color: #008000;">max</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>bin_a<span style="color: black;">&#41;</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>bin_b<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    bin_a, bin_b = bin_a.<span style="color: black;">zfill</span><span style="color: black;">&#40;</span>max_length<span style="color: black;">&#41;</span>, bin_b.<span style="color: black;">zfill</span><span style="color: black;">&#40;</span>max_length<span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    carry = <span style="color: #ff4500;">0</span>
    result = <span style="color: #483d8b;">''</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Note that we work from right to left</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, max_length<span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>::-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>:
        tmp = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">math</span>.<span style="color: black;">floor</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>bin_a<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>bin_b<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + carry<span style="color: black;">&#41;</span>/<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        res = <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>bin_a<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>bin_b<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + carry - <span style="color: #ff4500;">2</span><span style="color: #66cc66;">*</span>tmp<span style="color: black;">&#41;</span>
        result += res
        carry = tmp
&nbsp;
    result = <span style="color: black;">&#40;</span>result + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>carry<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>::-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: black;">&#91;</span>result.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1'</span><span style="color: black;">&#41;</span>:<span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">ValueError</span>, ex:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'0'</span></pre></div></div>

<h3>Unit Test:</h3>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #483d8b;">&quot;&quot;&quot;Unit test for binary_addition.py&quot;&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">unittest</span>
<span style="color: #ff7700;font-weight:bold;">from</span> binary_addition <span style="color: #ff7700;font-weight:bold;">import</span> binary_addition
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TestBinaryAddition<span style="color: black;">&#40;</span><span style="color: #dc143c;">unittest</span>.<span style="color: black;">TestCase</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #483d8b;">&quot;&quot;&quot;Comparing python binary addition against our own&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> test_add_same_length<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #483d8b;">&quot;&quot;&quot;Adding 2 binary numbers of the same length&quot;&quot;&quot;</span>
&nbsp;
        bin_a = <span style="color: #483d8b;">'001001101'</span>
        bin_b = <span style="color: #483d8b;">'011011010'</span>
&nbsp;
        <span style="color: #008000;">self</span>._compare_additions<span style="color: black;">&#40;</span>bin_a, bin_b<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> test_add_b_larger<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #483d8b;">&quot;&quot;&quot; B has more digits than A &quot;&quot;&quot;</span>
&nbsp;
        bin_a = <span style="color: #483d8b;">'01000101'</span>
        bin_b = <span style="color: #483d8b;">'1110010110101011101101011101000101'</span>
&nbsp;
        <span style="color: #008000;">self</span>._compare_additions<span style="color: black;">&#40;</span>bin_a, bin_b<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> test_add_b_smaller<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #483d8b;">&quot;&quot;&quot;B has less digits than A&quot;&quot;&quot;</span>
&nbsp;
&nbsp;
        bin_a = <span style="color: #483d8b;">'1110001001001001001101101011000101'</span>
        bin_b = <span style="color: #483d8b;">'0110010'</span>
&nbsp;
        <span style="color: #008000;">self</span>._compare_additions<span style="color: black;">&#40;</span>bin_a, bin_b<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _compare_additions<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, bin_a, bin_b<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #483d8b;">&quot;&quot;&quot;Compares the python implementation against ours&quot;&quot;&quot;</span>
&nbsp;
        bin_add = binary_addition<span style="color: black;">&#40;</span>bin_a, bin_b<span style="color: black;">&#41;</span>
        py_add = bin<span style="color: black;">&#40;</span><span style="color: #008000;">eval</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;0b%s&quot;</span> <span style="color: #66cc66;">%</span> bin_a<span style="color: black;">&#41;</span> + <span style="color: #008000;">eval</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;0b%s&quot;</span> <span style="color: #66cc66;">%</span> bin_b<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        algo_res = bin_add<span style="color: black;">&#91;</span>bin_add.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1'</span><span style="color: black;">&#41;</span>:<span style="color: black;">&#93;</span>
        py_res = py_add<span style="color: black;">&#91;</span>py_add.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1'</span><span style="color: black;">&#41;</span>:<span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEqual</span><span style="color: black;">&#40;</span>py_res, algo_res<span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #483d8b;">'__main__'</span> == __name__:
    <span style="color: #dc143c;">unittest</span>.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<h2>Binary Multiplication</h2>
<p>We are still using strings to represent bit sequences. We are still working from right to left, shifting to the left every number from the first number that needs to be multiplied by 1 in the second number. We then append the result to a list that we sum at the end, using the previous algorithm.</p>
<h3>Code:</h3>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #483d8b;">&quot;&quot;&quot;Simple Binary multiplication algorithm&quot;&quot;&quot;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> binary_addition <span style="color: #ff7700;font-weight:bold;">import</span> binary_addition
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> binary_multiplication<span style="color: black;">&#40;</span>bin_a, bin_b<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Multiplies two binary numbers by using python lists to
    easily shift digits around&quot;&quot;&quot;</span>
&nbsp;
    temp_result = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    result = <span style="color: #483d8b;">&quot;0&quot;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Remove any unnecessary padding</span>
    bin_a = bin_a<span style="color: black;">&#91;</span>bin_a.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1'</span><span style="color: black;">&#41;</span>:<span style="color: black;">&#93;</span>
    bin_b = bin_b<span style="color: black;">&#91;</span>bin_b.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1'</span><span style="color: black;">&#41;</span>:<span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>bin_b<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>::-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> bin_b<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'1'</span>:
            temp_result.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s%s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>bin_a, <span style="color: #483d8b;">&quot;0&quot;</span> <span style="color: #66cc66;">*</span> <span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>bin_b<span style="color: black;">&#41;</span>-i-<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            temp_result.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;0&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> val <span style="color: #ff7700;font-weight:bold;">in</span> temp_result:
        result = binary_addition<span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span>result<span style="color: black;">&#41;</span>, <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>val<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> result</pre></div></div>

<h3>Unit Test:</h3>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #483d8b;">&quot;&quot;&quot;Unit test for binary_addition.py&quot;&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">unittest</span>
<span style="color: #ff7700;font-weight:bold;">from</span> binary_multiplication <span style="color: #ff7700;font-weight:bold;">import</span> binary_multiplication
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TestBinaryAddition<span style="color: black;">&#40;</span><span style="color: #dc143c;">unittest</span>.<span style="color: black;">TestCase</span><span style="color: black;">&#41;</span>:
&nbsp;
    <span style="color: #483d8b;">&quot;&quot;&quot;Comparing python binary multiplication against our own&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> test_add_same_length<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #483d8b;">&quot;&quot;&quot;Multiplying 2 binary numbers of the same length&quot;&quot;&quot;</span>
&nbsp;
        bin_a = <span style="color: #483d8b;">'001001101'</span>
        bin_b = <span style="color: #483d8b;">'011011010'</span>
&nbsp;
        <span style="color: #008000;">self</span>._compare_multiplications<span style="color: black;">&#40;</span>bin_a, bin_b<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> test_simple<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #483d8b;">&quot;&quot;&quot;Multiplying 2 simple binary numbers&quot;&quot;&quot;</span>
        bin_a = <span style="color: #483d8b;">'110'</span>
        bin_b = <span style="color: #483d8b;">'101'</span>
&nbsp;
        <span style="color: #008000;">self</span>._compare_multiplications<span style="color: black;">&#40;</span>bin_a, bin_b<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> test_add_b_larger<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #483d8b;">&quot;&quot;&quot;B has more digits than A&quot;&quot;&quot;</span>
&nbsp;
        bin_a = <span style="color: #483d8b;">'010'</span>
        bin_b = <span style="color: #483d8b;">'111001011000101'</span>
&nbsp;
        <span style="color: #008000;">self</span>._compare_multiplications<span style="color: black;">&#40;</span>bin_a, bin_b<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> test_add_b_smaller<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #483d8b;">&quot;&quot;&quot; B has less digits than A &quot;&quot;&quot;</span>
&nbsp;
        bin_a = <span style="color: #483d8b;">'111001011000101'</span>
        bin_b = <span style="color: #483d8b;">'010'</span>
&nbsp;
        <span style="color: #008000;">self</span>._compare_multiplications<span style="color: black;">&#40;</span>bin_a, bin_b<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> _compare_multiplications<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, bin_a, bin_b<span style="color: black;">&#41;</span>:
&nbsp;
        <span style="color: #483d8b;">&quot;&quot;&quot;Compares the python implementation against ours&quot;&quot;&quot;</span>
&nbsp;
        bin_mult = binary_multiplication<span style="color: black;">&#40;</span>bin_a, bin_b<span style="color: black;">&#41;</span>
        py_mult = bin<span style="color: black;">&#40;</span><span style="color: #008000;">eval</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;0b%s&quot;</span> <span style="color: #66cc66;">%</span> bin_a<span style="color: black;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #008000;">eval</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;0b%s&quot;</span> <span style="color: #66cc66;">%</span> bin_b<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        algo_res = bin_mult<span style="color: black;">&#91;</span>bin_mult.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1'</span><span style="color: black;">&#41;</span>:<span style="color: black;">&#93;</span>
        py_res = py_mult<span style="color: black;">&#91;</span>py_mult.<span style="color: black;">index</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1'</span><span style="color: black;">&#41;</span>:<span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">assertEqual</span><span style="color: black;">&#40;</span>py_res, algo_res<span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #483d8b;">'__main__'</span> == __name__:
    <span style="color: #dc143c;">unittest</span>.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F17%2Falgorithms-in-python-binary-operations%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20Operations" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F17%2Falgorithms-in-python-binary-operations%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20Operations" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_bookmarks" href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F17%2Falgorithms-in-python-binary-operations%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20Operations" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F17%2Falgorithms-in-python-binary-operations%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20Operations" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F17%2Falgorithms-in-python-binary-operations%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20Operations" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F17%2Falgorithms-in-python-binary-operations%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20Operations" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F17%2Falgorithms-in-python-binary-operations%2F&amp;linkname=Algorithms%20in%20Python%3A%20Binary%20Operations" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F17%2Falgorithms-in-python-binary-operations%2F&amp;title=Algorithms%20in%20Python%3A%20Binary%20Operations" id="wpa2a_6">Share</a></p><p>Related posts:<ol>
<li><a href='http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/' rel='bookmark' title='Algorithms in Python: Binary exponentiation'>Algorithms in Python: Binary exponentiation</a></li>
<li><a href='http://blog.madpython.com/2010/07/10/algorithms-in-python-base-expansion/' rel='bookmark' title='Algorithms in Python: Base Expansion'>Algorithms in Python: Base Expansion</a></li>
<li><a href='http://blog.madpython.com/2010/10/17/fuzzy-mathematics-with-fuzzpy-part-1/' rel='bookmark' title='Fuzzy Mathematics with FuzzPy (Part 1)'>Fuzzy Mathematics with FuzzPy (Part 1)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Algorithms in Python: Base Expansion</title>
		<link>http://blog.madpython.com/2010/07/10/algorithms-in-python-base-expansion/</link>
		<comments>http://blog.madpython.com/2010/07/10/algorithms-in-python-base-expansion/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 00:53:49 +0000</pubDate>
		<dc:creator>Xavier</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[CS]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.madpython.com/?p=111</guid>
		<description><![CDATA[I felt it would be helpful to folks interested in Python and studying algorithms, to review some commonly studied algorithms in Computer Science by providing a small description and a Python implementation of each algorithm. This week, we&#8217;ll cover an &#8230; <a href="http://blog.madpython.com/2010/07/10/algorithms-in-python-base-expansion/">Continue reading <span class="meta-nav">&#8594;</span></a>
Related posts:<ol>
<li><a href='http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/' rel='bookmark' title='Algorithms in Python: Binary exponentiation'>Algorithms in Python: Binary exponentiation</a></li>
<li><a href='http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/' rel='bookmark' title='Algorithms in Python: Binary Operations'>Algorithms in Python: Binary Operations</a></li>
<li><a href='http://blog.madpython.com/2010/10/17/fuzzy-mathematics-with-fuzzpy-part-1/' rel='bookmark' title='Fuzzy Mathematics with FuzzPy (Part 1)'>Fuzzy Mathematics with FuzzPy (Part 1)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I felt it would be helpful to folks interested in Python and studying algorithms, to review some commonly studied algorithms in Computer Science by providing a small description and a Python implementation of each algorithm.</p>
<p>This week, we&#8217;ll cover an introductory algorithm for converting from one numeral base to another. Here is the python code:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #483d8b;">&quot;&quot;&quot;Simple implementation of a base expansion algorithm&quot;&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">math</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> base_expand<span style="color: black;">&#40;</span>base, val<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;This simple function performs a base-expansion from decimal
    using moduli and a translation table. The translation table is
    a clear limitation here, in that it implies the maximum base
    is 36.&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>base <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: black;">&#40;</span>base <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">36</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">raise</span> BaseOutOfBoundsError<span style="color: black;">&#40;</span>base<span style="color: black;">&#41;</span>
&nbsp;
    trans_table = <span style="color: #483d8b;">'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'</span>
    res = <span style="color: #483d8b;">''</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">while</span> val <span style="color: #66cc66;">!</span>= <span style="color: #ff4500;">0</span>:
        res += trans_table<span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>val <span style="color: #66cc66;">%</span> base<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
        val = <span style="color: #dc143c;">math</span>.<span style="color: black;">floor</span><span style="color: black;">&#40;</span>val / base<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> res<span style="color: black;">&#91;</span>::-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> BaseOutOfBoundsError<span style="color: black;">&#40;</span><span style="color: #008000;">Exception</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Base must be between 2 and 36&quot;&quot;&quot;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, val<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">val</span> = val
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__str__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Invalid base: %s. Base must be (x | x &gt; 1; x &lt; 37)&quot;</span> <span style="color: #66cc66;">%</span> \
            <span style="color: #008000;">self</span>.<span style="color: black;">val</span></pre></div></div>

<p>Here is a unit-test for base_expand.py:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #483d8b;">&quot;&quot;&quot;Unit tests for base_expansion.py&quot;&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">unittest</span>
<span style="color: #ff7700;font-weight:bold;">from</span> base_expansion <span style="color: #ff7700;font-weight:bold;">import</span> base_expand, BaseOutOfBoundsError
&nbsp;
<span style="color: #808080; font-style: italic;"># Unit tests for base_expansion.py</span>
<span style="color: #ff7700;font-weight:bold;">class</span> TestVals<span style="color: black;">&#40;</span><span style="color: #dc143c;">unittest</span>.<span style="color: black;">TestCase</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;Test suite&quot;&quot;&quot;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> test_known_values<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot;Testing against known values&quot;&quot;&quot;</span>
&nbsp;
        vals = <span style="color: black;">&#91;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'val'</span>: <span style="color: #ff4500;">8</span>, <span style="color: #483d8b;">'base'</span>: <span style="color: #ff4500;">2</span>, <span style="color: #483d8b;">'expect'</span>: <span style="color: #483d8b;">'1000'</span><span style="color: black;">&#125;</span>,
            <span style="color: black;">&#123;</span><span style="color: #483d8b;">'val'</span>: <span style="color: #ff4500;">915652</span>, <span style="color: #483d8b;">'base'</span>: <span style="color: #ff4500;">16</span>, <span style="color: #483d8b;">'expect'</span>: <span style="color: #483d8b;">'DF8C4'</span><span style="color: black;">&#125;</span>,
            <span style="color: black;">&#123;</span><span style="color: #483d8b;">'val'</span>: <span style="color: #ff4500;">256</span>, <span style="color: #483d8b;">'base'</span>: <span style="color: #ff4500;">10</span>, <span style="color: #483d8b;">'expect'</span>: <span style="color: #483d8b;">'256'</span><span style="color: black;">&#125;</span>,
            <span style="color: black;">&#123;</span><span style="color: #483d8b;">'val'</span>: <span style="color: #ff4500;">88189</span>, <span style="color: #483d8b;">'base'</span>: <span style="color: #ff4500;">8</span>, <span style="color: #483d8b;">'expect'</span>: <span style="color: #483d8b;">'254175'</span><span style="color: black;">&#125;</span><span style="color: black;">&#93;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> val <span style="color: #ff7700;font-weight:bold;">in</span> vals:
            <span style="color: #008000;">self</span>.<span style="color: black;">assertEqual</span><span style="color: black;">&#40;</span>val<span style="color: black;">&#91;</span><span style="color: #483d8b;">'expect'</span><span style="color: black;">&#93;</span>, \
                base_expand<span style="color: black;">&#40;</span>val<span style="color: black;">&#91;</span><span style="color: #483d8b;">'base'</span><span style="color: black;">&#93;</span>, val<span style="color: black;">&#91;</span><span style="color: #483d8b;">'val'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> test_invalid_base<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;&quot; Testing invalid bases &quot;&quot;&quot;</span>
&nbsp;
        bases = <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">37</span>, <span style="color: #ff4500;">50</span>, <span style="color: #ff4500;">100</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> base <span style="color: #ff7700;font-weight:bold;">in</span> bases:
            <span style="color: #008000;">self</span>.<span style="color: black;">assertRaises</span><span style="color: black;">&#40;</span>BaseOutOfBoundsError, base_expand, \
                base, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #483d8b;">'__main__'</span> == __name__:
    <span style="color: #dc143c;">unittest</span>.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p><a class="a2a_button_reddit" href="http://www.addtoany.com/add_to/reddit?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F10%2Falgorithms-in-python-base-expansion%2F&amp;linkname=Algorithms%20in%20Python%3A%20Base%20Expansion" title="Reddit" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/reddit.png" width="16" height="16" alt="Reddit"/></a><a class="a2a_button_delicious" href="http://www.addtoany.com/add_to/delicious?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F10%2Falgorithms-in-python-base-expansion%2F&amp;linkname=Algorithms%20in%20Python%3A%20Base%20Expansion" title="Delicious" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/delicious.png" width="16" height="16" alt="Delicious"/></a><a class="a2a_button_google_bookmarks" href="http://www.addtoany.com/add_to/google_bookmarks?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F10%2Falgorithms-in-python-base-expansion%2F&amp;linkname=Algorithms%20in%20Python%3A%20Base%20Expansion" title="Google Bookmarks" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/google.png" width="16" height="16" alt="Google Bookmarks"/></a><a class="a2a_button_facebook" href="http://www.addtoany.com/add_to/facebook?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F10%2Falgorithms-in-python-base-expansion%2F&amp;linkname=Algorithms%20in%20Python%3A%20Base%20Expansion" title="Facebook" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/facebook.png" width="16" height="16" alt="Facebook"/></a><a class="a2a_button_stumbleupon" href="http://www.addtoany.com/add_to/stumbleupon?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F10%2Falgorithms-in-python-base-expansion%2F&amp;linkname=Algorithms%20in%20Python%3A%20Base%20Expansion" title="StumbleUpon" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/stumbleupon.png" width="16" height="16" alt="StumbleUpon"/></a><a class="a2a_button_linkedin" href="http://www.addtoany.com/add_to/linkedin?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F10%2Falgorithms-in-python-base-expansion%2F&amp;linkname=Algorithms%20in%20Python%3A%20Base%20Expansion" title="LinkedIn" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/linkedin.png" width="16" height="16" alt="LinkedIn"/></a><a class="a2a_button_twitter" href="http://www.addtoany.com/add_to/twitter?linkurl=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F10%2Falgorithms-in-python-base-expansion%2F&amp;linkname=Algorithms%20in%20Python%3A%20Base%20Expansion" title="Twitter" rel="nofollow" target="_blank"><img src="http://blog.madpython.com/wp-content/plugins/add-to-any/icons/twitter.png" width="16" height="16" alt="Twitter"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.madpython.com%2F2010%2F07%2F10%2Falgorithms-in-python-base-expansion%2F&amp;title=Algorithms%20in%20Python%3A%20Base%20Expansion" id="wpa2a_8">Share</a></p><p>Related posts:<ol>
<li><a href='http://blog.madpython.com/2010/08/07/algorithms-in-python-binary-exponentiation/' rel='bookmark' title='Algorithms in Python: Binary exponentiation'>Algorithms in Python: Binary exponentiation</a></li>
<li><a href='http://blog.madpython.com/2010/07/17/algorithms-in-python-binary-operations/' rel='bookmark' title='Algorithms in Python: Binary Operations'>Algorithms in Python: Binary Operations</a></li>
<li><a href='http://blog.madpython.com/2010/10/17/fuzzy-mathematics-with-fuzzpy-part-1/' rel='bookmark' title='Fuzzy Mathematics with FuzzPy (Part 1)'>Fuzzy Mathematics with FuzzPy (Part 1)</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.madpython.com/2010/07/10/algorithms-in-python-base-expansion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

