<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://72.14.177.54/skins/common/feed.css?207"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>Diagram G script - Revision history</title>
		<link>http://72.14.177.54/geb/?title=Diagram_G_script&amp;action=history</link>
		<description>Revision history for this page on the wiki</description>
		<language>en</language>
		<generator>MediaWiki 1.15.1</generator>
		<lastBuildDate>Mon, 15 Jun 2026 01:10:07 GMT</lastBuildDate>
		<item>
			<title>203.171.122.38:&amp;#32;Linked to the output</title>
			<link>http://72.14.177.54/geb/?title=Diagram_G_script&amp;diff=1311&amp;oldid=prev</link>
			<description>&lt;p&gt;Linked to the output&lt;/p&gt;

		&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
		&lt;col class='diff-marker' /&gt;
		&lt;col class='diff-content' /&gt;
		&lt;col class='diff-marker' /&gt;
		&lt;col class='diff-content' /&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;←Older revision&lt;/td&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 14:28, 21 March 2006&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 275:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 275:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp; 	#print child.content, ' ',&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp; 	#print child.content, ' ',&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;  #print ' '&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;  #print ' '&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;See the [[Diagram G script output]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff generator: internal 2026-06-15 01:10:07 --&gt;
&lt;/table&gt;</description>
			<pubDate>Tue, 21 Mar 2006 14:28:15 GMT</pubDate>			<dc:creator>203.171.122.38</dc:creator>			<comments>http://72.14.177.54/geb/Talk:Diagram_G_script</comments>		</item>
		<item>
			<title>203.171.122.38:&amp;#32;The script for drawing ASCII art trees for help with Diagram G and related problems</title>
			<link>http://72.14.177.54/geb/?title=Diagram_G_script&amp;diff=1310&amp;oldid=prev</link>
			<description>&lt;p&gt;The script for drawing ASCII art trees for help with Diagram G and related problems&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt; #18:30 Tuesday 21 March 2006&lt;br /&gt;
 #By Evgeni Sergeev&lt;br /&gt;
 #First, construct a tree. Then call propagateSubtreeWidths() on the root.&lt;br /&gt;
 #Then call printTree() on the root.&lt;br /&gt;
 &lt;br /&gt;
 import sys&lt;br /&gt;
 &lt;br /&gt;
 class Node:&lt;br /&gt;
     &amp;quot;&amp;quot;&amp;quot;Represents a node in the tree. &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
     def __init__(self, content):&lt;br /&gt;
 	self.children = []&lt;br /&gt;
 	self.content = content&lt;br /&gt;
 	self.subtree_width = 1&lt;br /&gt;
 	self.root_offset = 0&lt;br /&gt;
 &lt;br /&gt;
     def addChild(self, child):&lt;br /&gt;
 	self.children.append(child)&lt;br /&gt;
 &lt;br /&gt;
     def propagateSubtreeWidths(self):&lt;br /&gt;
 	for child in self.children:&lt;br /&gt;
 	    child.propagateSubtreeWidths()&lt;br /&gt;
 	    &lt;br /&gt;
 	if len(self.children) == 1:&lt;br /&gt;
 	    self.subtree_width = self.children[0].subtree_width&lt;br /&gt;
 	    self.root_offset = self.children[0].root_offset&lt;br /&gt;
 	elif len(self.children) == 0:&lt;br /&gt;
 	    self.subtree_width = len(str(self.content)) + 1&lt;br /&gt;
 	    self.root_offset = 0&lt;br /&gt;
 	else:&lt;br /&gt;
 	    n = 0&lt;br /&gt;
 	    for child in self.children:&lt;br /&gt;
 		n = n + child.subtree_width&lt;br /&gt;
 	    self.subtree_width = n&lt;br /&gt;
 &lt;br /&gt;
 	    right_child_relative_offset = self.subtree_width - \\&lt;br /&gt;
 	    (self.children[len(self.children)-1].subtree_width - \\&lt;br /&gt;
 	    self.children[len(self.children)-1].root_offset)&lt;br /&gt;
 	    &lt;br /&gt;
 	    self.root_offset = (self.children[0].root_offset + \\&lt;br /&gt;
 	    right_child_relative_offset) / 2&lt;br /&gt;
 &lt;br /&gt;
     def printLineTwo(self):&lt;br /&gt;
 	n = self.root_offset - len(str(self.content))/2&lt;br /&gt;
 	if n &amp;lt; 0: n = 0&lt;br /&gt;
 	sys.stdout.write(' '*n)&lt;br /&gt;
 	sys.stdout.write(str(self.content))&lt;br /&gt;
 	sys.stdout.write(' '*(self.subtree_width - n - len(str(self.content))))&lt;br /&gt;
 &lt;br /&gt;
     def printLineOne(self):&lt;br /&gt;
 	n = self.root_offset&lt;br /&gt;
 	sys.stdout.write(' '*n)&lt;br /&gt;
 	sys.stdout.write('|')&lt;br /&gt;
 	sys.stdout.write(' '*(self.subtree_width - n - 1))&lt;br /&gt;
 &lt;br /&gt;
     def printLineThree(self, horizontal_char = '_'):&lt;br /&gt;
 	if len(self.children) &amp;gt; 0:&lt;br /&gt;
 	    if len(self.children) == 1:&lt;br /&gt;
 		self.printLineOne()&lt;br /&gt;
 	    elif len(self.children) == 0:&lt;br /&gt;
 		sys.stdout.write(' '*self.subtree_width)&lt;br /&gt;
 	    else:&lt;br /&gt;
 		left_child_offset = self.children[0].root_offset&lt;br /&gt;
 		&lt;br /&gt;
 		right_child_offset = self.subtree_width - \\&lt;br /&gt;
 		(self.children[len(self.children)-1].subtree_width - \\&lt;br /&gt;
 		self.children[len(self.children)-1].root_offset)&lt;br /&gt;
 		&lt;br /&gt;
 		left_dashes = self.root_offset - left_child_offset - 1&lt;br /&gt;
 		right_dashes = right_child_offset - self.root_offset - 1&lt;br /&gt;
 		&lt;br /&gt;
 		left_spaces = self.root_offset - left_dashes&lt;br /&gt;
 		right_spaces = self.subtree_width - left_spaces - left_dashes \\&lt;br /&gt;
 		- 1 - right_dashes&lt;br /&gt;
 &lt;br /&gt;
 		sys.stdout.write(' '*left_spaces)&lt;br /&gt;
 		sys.stdout.write(horizontal_char*left_dashes)&lt;br /&gt;
 		sys.stdout.write('|')&lt;br /&gt;
 		sys.stdout.write(horizontal_char*right_dashes)&lt;br /&gt;
 		sys.stdout.write(' '*right_spaces)&lt;br /&gt;
 &lt;br /&gt;
     def addChildren(self, queue, levels, parent_level):&lt;br /&gt;
 	queue.extend(self.children)&lt;br /&gt;
 	new_levels = []&lt;br /&gt;
 	for child in self.children:&lt;br /&gt;
 	    new_levels.append(parent_level + 1)&lt;br /&gt;
 	levels.extend(new_levels)&lt;br /&gt;
 &lt;br /&gt;
     def printTree(self, upside_down = 0):&lt;br /&gt;
 	queue = [self]&lt;br /&gt;
 	levels = [0]&lt;br /&gt;
 	n = 0&lt;br /&gt;
 	#Breadth queue&lt;br /&gt;
 	while n &amp;lt; len(queue):&lt;br /&gt;
 	    queue[n].addChildren(queue, levels, levels[n])&lt;br /&gt;
 	    n = n + 1&lt;br /&gt;
 	#levels[n] contains the level of n&lt;br /&gt;
 &lt;br /&gt;
 	if not upside_down:&lt;br /&gt;
 	    i = 0&lt;br /&gt;
 	    while i &amp;lt; n:&lt;br /&gt;
 		start_of_level = i&lt;br /&gt;
 		end_of_level = i&lt;br /&gt;
 		while end_of_level &amp;lt; n and \\&lt;br /&gt;
 		levels[end_of_level] == levels[start_of_level]:&lt;br /&gt;
 		    end_of_level = end_of_level + 1&lt;br /&gt;
 		end_of_level = end_of_level - 1&lt;br /&gt;
 		&lt;br /&gt;
 		for item in range(start_of_level,end_of_level+1):&lt;br /&gt;
 		    queue[item].printLineOne()&lt;br /&gt;
 		print ' '&lt;br /&gt;
 		&lt;br /&gt;
 		for item in range(start_of_level,end_of_level+1):&lt;br /&gt;
 		    queue[item].printLineTwo()&lt;br /&gt;
 		print ' '&lt;br /&gt;
 		&lt;br /&gt;
 		for item in range(start_of_level,end_of_level+1):&lt;br /&gt;
 		    queue[item].printLineThree()&lt;br /&gt;
 		print ' '&lt;br /&gt;
 &lt;br /&gt;
 		i = end_of_level + 1&lt;br /&gt;
 &lt;br /&gt;
 	else:&lt;br /&gt;
 	    i = n - 1&lt;br /&gt;
 	    while i &amp;gt;= 0:&lt;br /&gt;
 		start_of_level = i&lt;br /&gt;
 		end_of_level = i&lt;br /&gt;
 		while start_of_level &amp;gt;= 0 and \\&lt;br /&gt;
 		levels[end_of_level] == levels[start_of_level]:&lt;br /&gt;
 		    start_of_level = start_of_level - 1&lt;br /&gt;
 		start_of_level = start_of_level + 1&lt;br /&gt;
 		&lt;br /&gt;
 		for item in range(start_of_level,end_of_level+1):&lt;br /&gt;
 		    queue[item].printLineThree('&amp;quot;')&lt;br /&gt;
 		print ' '&lt;br /&gt;
 		&lt;br /&gt;
 		for item in range(start_of_level,end_of_level+1):&lt;br /&gt;
 		    queue[item].printLineTwo()&lt;br /&gt;
 		print ' '&lt;br /&gt;
 		&lt;br /&gt;
 		for item in range(start_of_level,end_of_level+1):&lt;br /&gt;
 		    queue[item].printLineOne()&lt;br /&gt;
 		print ' '&lt;br /&gt;
 &lt;br /&gt;
 		i = start_of_level - 1&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 def outputTree(f, n):&lt;br /&gt;
     n = n + 1&lt;br /&gt;
     nodes = range(n-1)&lt;br /&gt;
     i = 1&lt;br /&gt;
     while i &amp;lt; n:&lt;br /&gt;
 	nodes[i-1] = Node(i)&lt;br /&gt;
 	if (f(i) != i):&lt;br /&gt;
 	    nodes[f(i)-1].addChild(nodes[i-1])&lt;br /&gt;
 	i = i + 1&lt;br /&gt;
 &lt;br /&gt;
     nodes[0].propagateSubtreeWidths()&lt;br /&gt;
     nodes[0].printTree(upside_down = 1)&lt;br /&gt;
     &lt;br /&gt;
 print &amp;quot;Diagram G up to n=55.&amp;quot;&lt;br /&gt;
 def G(n, cache={}): #cache is shared between calls (!)&lt;br /&gt;
     if n == 0:&lt;br /&gt;
 	return 0&lt;br /&gt;
 &lt;br /&gt;
     if n not in cache:&lt;br /&gt;
 	cache[n] = n - G(G(n-1))&lt;br /&gt;
 &lt;br /&gt;
     return cache[n]&lt;br /&gt;
 &lt;br /&gt;
 outputTree(G, 55)&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;\&lt;br /&gt;
\&lt;br /&gt;
Diagram H up to n=59.&amp;quot;&lt;br /&gt;
 def H(n, cache={}):&lt;br /&gt;
     if n == 0:&lt;br /&gt;
 	return 0&lt;br /&gt;
 &lt;br /&gt;
     if n not in cache:&lt;br /&gt;
 	cache[n] = n - H(H(H(n-1)))&lt;br /&gt;
 &lt;br /&gt;
     return cache[n]&lt;br /&gt;
 &lt;br /&gt;
 outputTree(H, 59)&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;\&lt;br /&gt;
\&lt;br /&gt;
Diagram I up to n=69.&amp;quot;&lt;br /&gt;
 def I(n, cache={}):&lt;br /&gt;
     if n == 0:&lt;br /&gt;
 	return 0&lt;br /&gt;
 &lt;br /&gt;
     if n not in cache:&lt;br /&gt;
 	cache[n] = n - I(I(I(I(n-1))))&lt;br /&gt;
 &lt;br /&gt;
     return cache[n]&lt;br /&gt;
 &lt;br /&gt;
 outputTree(I, 69)&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;\&lt;br /&gt;
\&lt;br /&gt;
Diagram J up to n=80.&amp;quot;&lt;br /&gt;
 def J(n, cache={}):&lt;br /&gt;
     if n == 0:&lt;br /&gt;
 	return 0&lt;br /&gt;
 &lt;br /&gt;
     if n not in cache:&lt;br /&gt;
 	cache[n] = n - J(J(J(J(J(n-1)))))&lt;br /&gt;
 &lt;br /&gt;
     return cache[n]&lt;br /&gt;
 &lt;br /&gt;
 outputTree(J, 80)&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;\&lt;br /&gt;
\&lt;br /&gt;
The tree for Q(n) up to n=64.&amp;quot;&lt;br /&gt;
 def Q(n, cache={}):&lt;br /&gt;
     if n == 0:&lt;br /&gt;
 	return 0&lt;br /&gt;
 &lt;br /&gt;
     if n not in cache:&lt;br /&gt;
 	cache[n] = n - Q(n-1)&lt;br /&gt;
     &lt;br /&gt;
     return cache[n]&lt;br /&gt;
 &lt;br /&gt;
 outputTree(Q, 64)&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;\&lt;br /&gt;
\&lt;br /&gt;
The mirror tree MG(n) up to n=55.&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 def L(n, cache={}):&lt;br /&gt;
     if n == 1:&lt;br /&gt;
 	return 1&lt;br /&gt;
 &lt;br /&gt;
     if n not in cache:&lt;br /&gt;
 	cache[n] = L(G(n)) + 1&lt;br /&gt;
 &lt;br /&gt;
     return cache[n]&lt;br /&gt;
 &lt;br /&gt;
 def F(n, cache={0:1, 1:1}):&lt;br /&gt;
     if n == 1 or n == 0:&lt;br /&gt;
 	return 1&lt;br /&gt;
 &lt;br /&gt;
     if n not in cache:&lt;br /&gt;
 	keys = cache.keys()&lt;br /&gt;
 	keys.sort(reverse=True)&lt;br /&gt;
 	max_known = keys[0]&lt;br /&gt;
 	a, b = F(max_known), F(max_known - 1)&lt;br /&gt;
 	for i in range(max_known + 1, n + 1):&lt;br /&gt;
 	    a, b = a + b, a&lt;br /&gt;
 	    cache[i] = a&lt;br /&gt;
 &lt;br /&gt;
     return cache[n]&lt;br /&gt;
 	&lt;br /&gt;
 def M(n):&lt;br /&gt;
     if n == 1:&lt;br /&gt;
 	return 1&lt;br /&gt;
 &lt;br /&gt;
     return F(L(n)) - (n - F(L(n)-1)) + 1&lt;br /&gt;
 &lt;br /&gt;
 def MG(n):&lt;br /&gt;
     return M(G(M(n)))&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 outputTree(MG, 55)&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 #Debugging code.&lt;br /&gt;
 #print nodes&lt;br /&gt;
 	    &lt;br /&gt;
 #for node in nodes:&lt;br /&gt;
     #print node.content, ': ',&lt;br /&gt;
     #for child in node.children:&lt;br /&gt;
 	#print child.content, ' ',&lt;br /&gt;
     #print ' '&lt;/div&gt;</description>
			<pubDate>Tue, 21 Mar 2006 14:27:13 GMT</pubDate>			<dc:creator>203.171.122.38</dc:creator>			<comments>http://72.14.177.54/geb/Talk:Diagram_G_script</comments>		</item>
	</channel>
</rss>