├── 20200912_taocp_2_algorithms └── README.md ├── 20201205_taocp_14_link_order └── README.md ├── 20200905_taocp_1_inaugural_meeting └── README.md ├── 20201017_taocp_7_mmix_programming └── README.md ├── 20201031_taocp_9_sequential_allocation └── README.md ├── 20201114_taocp_11_polynomial_arithmetic └── README.md ├── 20201024_taocp_8_stacks_queues_and_deques └── README.md ├── 20210130_taocp_21_derivatives ├── diagram_2.3.2.7_formula_binary_tree.pdf ├── diagram_2.3.2.4_threaded_binary_tree.pdf ├── diagram_2.3.2.4_threaded_binary_tree.neato.pdf ├── diagram_2.3.2.4_threaded_binary_tree.neato.dot ├── diagram_2.3.2.7_formula_binary_tree.dot ├── diagram_2.3.2.4_threaded_binary_tree.dot └── README.md ├── LICENSE ├── 20201219_taocp_16_quicksort └── README.md ├── 20201107_taocp_10_topological_sort └── README.md ├── 20210206_taocp_22_equivalence_relations └── README.md ├── 20201010_taocp_6_mmix_branching └── README.md ├── 20201121_taocp_12_sorting └── README.md ├── 20210220_taocp_24_huffman_trees └── README.md ├── 20201212_taocp_15_batcher_sort └── README.md ├── 20210123_taocp_20_binary_trees └── README.md ├── 20201128_taocp_13_shellsort └── README.md ├── 20210109_taocp_18_radixsort ├── README.md └── algorithm_l_list_merge_sort.txt ├── 20210116_taocp_19_trees └── README.md ├── 20210213_taocp_23_polynomials_as_trees └── README.md ├── 20201003_taocp_5_mmix_problem_fest └── README.md ├── 20200926_taocp_4_basic_mmix_instructions └── README.md ├── 20210102_taocp_17_mergesort └── README.md └── 20200919_taocp_3_introduction_to_mmix └── README.md /20200912_taocp_2_algorithms/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theartofcomputerprogramming/meetup/HEAD/20200912_taocp_2_algorithms/README.md -------------------------------------------------------------------------------- /20201205_taocp_14_link_order/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theartofcomputerprogramming/meetup/HEAD/20201205_taocp_14_link_order/README.md -------------------------------------------------------------------------------- /20200905_taocp_1_inaugural_meeting/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theartofcomputerprogramming/meetup/HEAD/20200905_taocp_1_inaugural_meeting/README.md -------------------------------------------------------------------------------- /20201017_taocp_7_mmix_programming/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theartofcomputerprogramming/meetup/HEAD/20201017_taocp_7_mmix_programming/README.md -------------------------------------------------------------------------------- /20201031_taocp_9_sequential_allocation/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theartofcomputerprogramming/meetup/HEAD/20201031_taocp_9_sequential_allocation/README.md -------------------------------------------------------------------------------- /20201114_taocp_11_polynomial_arithmetic/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theartofcomputerprogramming/meetup/HEAD/20201114_taocp_11_polynomial_arithmetic/README.md -------------------------------------------------------------------------------- /20201024_taocp_8_stacks_queues_and_deques/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theartofcomputerprogramming/meetup/HEAD/20201024_taocp_8_stacks_queues_and_deques/README.md -------------------------------------------------------------------------------- /20210130_taocp_21_derivatives/diagram_2.3.2.7_formula_binary_tree.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theartofcomputerprogramming/meetup/HEAD/20210130_taocp_21_derivatives/diagram_2.3.2.7_formula_binary_tree.pdf -------------------------------------------------------------------------------- /20210130_taocp_21_derivatives/diagram_2.3.2.4_threaded_binary_tree.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theartofcomputerprogramming/meetup/HEAD/20210130_taocp_21_derivatives/diagram_2.3.2.4_threaded_binary_tree.pdf -------------------------------------------------------------------------------- /20210130_taocp_21_derivatives/diagram_2.3.2.4_threaded_binary_tree.neato.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/theartofcomputerprogramming/meetup/HEAD/20210130_taocp_21_derivatives/diagram_2.3.2.4_threaded_binary_tree.neato.pdf -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020-2021 Zartaj Majeed 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /20210130_taocp_21_derivatives/diagram_2.3.2.4_threaded_binary_tree.neato.dot: -------------------------------------------------------------------------------- 1 | // diagram_2.3.2.4_threaded_binary_tree.neato.dot 2 | // dot -Tpdf -o diagram_2.3.2.4_threaded_binary_tree.neato.pdf diagram_2.3.2.4_threaded_binary_tree.neato.dot 3 | 4 | digraph { 5 | layout=neato 6 | // reflect y-axis to place origin at topleft instead of default bottomleft 7 | // allows easier association of nodes to expected position for a topdown structure like a tree, should help in computation of node positions for generating a tree 8 | scale="1,-1" 9 | // looks better with stretched edges, haven't played with interaction of scale and inputscale 10 | inputscale=0.72 11 | // curved edges go around nodes with splines=true otherwise edges may cross nodes 12 | splines=true 13 | 14 | /* 15 | subgraph header { 16 | margin=1 17 | style=invis 18 | header [label="Graphviz Neato Flowchart" pos="0,0!" margin=1 shape=plaintext] 19 | } 20 | */ 21 | 22 | node [shape=circle] 23 | edge [arrowhead=open] 24 | 25 | { 26 | 27 | node [style=invis shape=point height=0 width=0] 28 | // uncomment to see invisible positioning nodes, also comment out above 29 | //node [shape=point height=0.1 width=0.1] 30 | 31 | // 20 is needed for thread destination 32 | 20 [pos="2,0!"] 33 | // 01 is needed for thread destination 34 | 01 [pos="0,1!"] 35 | } 36 | 37 | // the tree nodes 38 | 11 [label=A, pos="1,1!"] 39 | 31 [label=D, pos="3,1!"] 40 | 12 [label=B, pos="1,2!"] 41 | 22 [label=C, pos="2,2!"] 42 | 32 [label=E, pos="3,2!"] 43 | 42 [label=F, pos="4,2!"] 44 | 52 [label=G, pos="5,2!"] 45 | 23 [label=K, pos="2,3!"] 46 | 33 [label=H, pos="3,3!"] 47 | 43 [label=J, pos="4,3!"] 48 | 49 | // columns layout 50 | 51 | 11 -> 12 52 | 22 -> 23 53 | 31 -> 32 54 | 32 -> 33 55 | 42 -> 43 56 | 57 | // rows layout 58 | 59 | 11 -> 31 60 | 12 -> 22 61 | 32 -> 42 62 | 42 -> 52 63 | 64 | // threads shown as dotted edges 65 | // ports are needed to prevent neato from combining two edges into one bidirectional edge 66 | // or to add separation between two edges meeting at the same node causing arrowsheads to overlap 67 | { 68 | edge [style=dotted] 69 | 70 | 22 -> 11 71 | 23 -> 12 72 | 23 -> 22 [tailport=ne headport=se] 73 | 12 -> 01 74 | 75 | 31 -> 20 76 | 33 -> 11 [headport=e] 77 | 33 -> 32 [tailport=ne headport=se] 78 | 43 -> 32 [headport=e] 79 | 43 -> 42 [tailport=ne headport=se] 80 | 52 -> 31 81 | 52 -> 42 [tailport=sw headport=se] 82 | } 83 | 84 | label="Threaded binary tree (4) from TAOCP 2.3.2 Binary Tree Representation of Trees - graphviz neato layout\n\n\n\n" 85 | labelloc=t 86 | 87 | } 88 | -------------------------------------------------------------------------------- /20210130_taocp_21_derivatives/diagram_2.3.2.7_formula_binary_tree.dot: -------------------------------------------------------------------------------- 1 | // diagram_2.3.2.7_formula_binary_tree.dot 2 | // dot -Tpdf -o diagram_2.3.2.7_formula_binary_tree.pdf diagram_2.3.2.7_formula_binary_tree.dot 3 | 4 | digraph { 5 | splines=false 6 | nodesep=1 7 | ranksep=0.9 8 | size="8.5,11!" 9 | 10 | node [shape=circle fontsize=24 width=0.5 fixedsize=true] 11 | edge [arrowhead=open] 12 | 13 | { 14 | node [style=invis shape=point height=0 width=0] 15 | //node [label="\N" shape=plaintext] 16 | edge [style=invis] 17 | y_0 -> y_1 -> y_2 -> y_3 -> y_4 -> y_5 18 | } 19 | 20 | 00 [label=<y>] 21 | 01 [label=<−>] 22 | 02 [label=<×>] 23 | 03 [label=3] 24 | 13 [label=ln] 25 | // unicode plus sign, + does not work 26 | 14 [label=<+>] 27 | 15 [label=<x>] 28 | // unicode division slash 29 | 22 [label=<∕>] 30 | 23 [label=<a>] 31 | 25 [label=1] 32 | // unicode uparrow 33 | 33 [label=<↑>] 34 | 34 [label=<x>] 35 | 44 [label=2] 36 | 37 | { 38 | node [style=invis shape=point height=0 width=0] 39 | //node [label="\N" shape=plaintext] 40 | edge [style=invis] 41 | rank=same x_0 x_1 x_2 x_3 x_4 42 | x_0 -> x_1 -> x_2 -> x_3 -> x_4 43 | } 44 | 45 | {rank=same y_0 00} 46 | {rank=same y_1 01} 47 | {rank=same y_2 02 22} 48 | {rank=same y_3 03 13 23 33} 49 | {rank=same y_4 14 34 44} 50 | {rank=same y_5 15 25} 51 | 52 | // columns 53 | 54 | { 55 | // force column alignment with very high weight otherwise nodes can turn offcenter 56 | edge [weight=100] 57 | 58 | x_0 -> 00 [style=invis] 59 | 00 -> 01 60 | 01 -> 02 61 | 02 -> 03 62 | 63 | x_1 -> 13 [style=invis] 64 | 13 -> 14 65 | 14 -> 15 66 | 67 | x_2 -> 22 [style=invis] 68 | 22 -> 23 69 | 23 -> 25 [style=invis] 70 | 71 | x_3 -> 33 [style=invis] 72 | 33 -> 34 73 | 74 | x_4 -> 44 [style=invis] 75 | 76 | } 77 | 78 | 79 | // rows 80 | 81 | { 82 | edge [weight=10] 83 | y_0 -> 00 [style=invis] 84 | y_1 -> 01 [style=invis] 85 | y_2 -> 02 [style=invis] 86 | 87 | 02 -> 22 88 | 89 | y_3 -> 03 [style=invis] 90 | 03 -> 13 91 | 13 -> 23 [style=invis] 92 | 23 -> 33 93 | 94 | y_4 -> 14 [style=invis] 95 | 14 -> 34 [style=invis] 96 | 34 -> 44 97 | 98 | y_5 -> 15 [style=invis] 99 | 15 -> 25 100 | 101 | } 102 | 103 | 00 -> 00 [tailport=se] 104 | 105 | // threads 106 | 107 | { 108 | edge [style=dotted] 109 | 01 -> 00 [tailport=ne headport=se] 110 | 22 -> 01 111 | 13 -> 02 112 | 14 -> 13 [tailport=ne headport=se] 113 | 25 -> 14 114 | 33 -> 22 115 | 44 -> 33 116 | } 117 | 118 | label="Threaded binary tree (7) from TAOCP 2.3.2 Binary Tree Representation of Trees - graphviz dot layout\n" 119 | labelloc=t 120 | 121 | } 122 | -------------------------------------------------------------------------------- /20210130_taocp_21_derivatives/diagram_2.3.2.4_threaded_binary_tree.dot: -------------------------------------------------------------------------------- 1 | // diagram_2.3.2.4_threaded_binary_tree.dot 2 | // dot -Tpdf -o diagram_2.3.2.4_threaded_binary_tree.pdf diagram_2.3.2.4_threaded_binary_tree.dot 3 | 4 | digraph { 5 | splines=false 6 | nodesep=0.5 7 | ranksep=0.9 8 | 9 | 10 | node [shape=circle] 11 | edge [arrowhead=open] 12 | 13 | { 14 | //node [label="\N" shape=plaintext] 15 | node [style=invis shape=point height=0 width=0] 16 | edge [style=invis] 17 | y_0 -> y_1 -> y_2 -> y_3 18 | } 19 | 20 | { 21 | node [style=invis shape=point height=0 width=0] 22 | //node [shape=point height=0.1 width=0.1] 23 | // 20 is needed for empty thread destination 24 | 20 25 | // 01 is needed for empty thread destination 26 | 01 27 | } 28 | 29 | 11 [label=A] 30 | 12 [label=B] 31 | 22 [label=C] 32 | 31 [label=D] 33 | 32 [label=E] 34 | 42 [label=F] 35 | 52 [label=G] 36 | 33 [label=H] 37 | 43 [label=J] 38 | 23 [label=K] 39 | 40 | { 41 | //node [label="\N" shape=plaintext] 42 | node [style=invis shape=point height=0 width=0] 43 | edge [style=invis] 44 | rank=same x_0 x_1 x_2 x_3 x_4 x_5 45 | x_0 -> x_1 -> x_2 -> x_3 -> x_4 -> x_5 46 | } 47 | 48 | {rank=same y_0 20} 49 | {rank=same y_1 01 11 31} 50 | {rank=same y_2 12 22 32 42 52} 51 | {rank=same y_3 23 33 43} 52 | 53 | // columns 54 | 55 | { 56 | // force column alignment with very high weight otherwise nodes can turn offcenter 57 | edge [weight=100] 58 | 59 | x_0 -> 01 [style=invis] 60 | x_1 -> 11 [style=invis] 61 | 62 | 11 -> 12 63 | 64 | x_2 -> 20 [style=invis] 65 | 20 -> 22 [style=invis] 66 | 67 | 22 -> 23 68 | 69 | x_3 -> 31 [style=invis] 70 | 71 | 31 -> 32 72 | 32 -> 33 73 | 74 | x_4 -> 42 [style=invis] 75 | 76 | 42 -> 43 77 | 78 | x_5 -> 52 [style=invis] 79 | 80 | } 81 | 82 | 83 | // rows 84 | 85 | { 86 | edge [weight=10] 87 | y_0 -> 20 [style=invis] 88 | y_1 -> 11 [style=invis] 89 | 90 | 11 -> 31 91 | 92 | y_2 -> 12 [style=invis] 93 | 94 | 12 -> 22 95 | 96 | 32 -> 42 97 | 42 -> 52 98 | } 99 | 100 | // threads 101 | 102 | { 103 | edge [style=dotted] 104 | 22 -> 11 105 | 23 -> 12 106 | // had to use tailport headport to prevent curved solid and dotted arrows 107 | 23 -> 22 [tailport=ne headport=se] 108 | 12 -> 01 109 | 110 | 31 -> 20 111 | // headport here to move arrow away from the arrow of another edge to the same node 112 | 33 -> 11 [headport=e] 113 | 33 -> 32 [tailport=ne headport=se] 114 | 43 -> 32 [headport=e] 115 | 43 -> 42 [tailport=ne headport=se] 116 | 52 -> 31 117 | 52 -> 42 [tailport=sw] 118 | } 119 | 120 | label="Threaded binary tree (4) from TAOCP 2.3.2 Binary Tree Representation of Trees - graphviz dot layout\n" 121 | labelloc=t 122 | fontsize=24 123 | 124 | } 125 | -------------------------------------------------------------------------------- /20201219_taocp_16_quicksort/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #16 - Quicksort (Chapter 5, Sorting: Section 5.2.2) 2 | 3 | Quicksort! 4 | 5 | We close out the section on Sorting by Exchanging with two fast algorithms. 6 | 7 | First we look at the famous quicksort algorithm invented by Tony Hoare. Quicksort works by partitioning the array around a pivot key. Keys smaller than the pivot are placed in one partition and larger keys in the other. This process is repeated with smaller and smaller partitions resulting in a completely sorted array. 8 | 9 | Quicksort naturally lends itself to a recursive formulation. And we'll see this in the MMIX implementation of Program Q (Quicksort). 10 | 11 | The second algorithm is Algorithm R (Radix exchange sort). It is similar to quicksort in separating keys into two groups. But the criteria is different. Keys are separated into two groups based on the most significant bit in the binary representation of a key. The process is repeated with the next most significant bit and so on. The MMIX code for Program R (Radix exchange sort) is also recursive. 12 | 13 | We'll work on some exercises. 14 | 15 | The bonus segment will demo a debugger stepthru of Program Q (Quicksort) from The MMIX Supplement. 16 | 17 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 18 | 19 | Keep the conversation going! 20 | 21 | Facebook: https://www.facebook.com/groups/678335496099220
22 | IRC ##taocp: https://webchat.freenode.net/##taocp 23 | 24 | **Date:** Saturday, 19 December 2020\ 25 | **Time:** 2-4pm America/New_York\ 26 | **Location:** Google Meet online 27 | 28 | ## Agenda 29 | 30 | **2:00 - 2:10** Meet and greet\ 31 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 5, Sorting* (along with *MMIX Supplement*) 32 | 33 | - *5.2.2 Sorting by Exchanging* (pp.113-128) 34 | - *Quicksort* (pp.113-115) 35 | - *Algorithm Q (Quicksort)* (pp.115-117) 36 | - *Program Q (Quicksort)*, MMIX Supplement (pp.82-84) 37 | - *Analysis of quicksort* (pp.118-122), MMIX Supplement (pp.84-85) 38 | - *Radix exchange* (pp.122-123) 39 | - *Algorithm R (Radix exchange sort)* (pp.123-125) 40 | - *Program R (Radix exchange sort)*, MMIX Supplement (pp.85-86) 41 | - Analysis of radix exchange sort (pp.126-128), MMIX Supplement (p.86) 42 | 43 | **3:00 - 3:10** Break\ 44 | **3:10 - 4:00** 45 | - *Exercises* (pp.134-138), MMIX Supplement (p.86) 46 | - Shoot the breeze 47 | 48 | **Bonus Segment** 49 | 50 | Stepthru in MMIX Visual Debugger 51 | 52 | - *Program Q (Quicksort)*, MMIX Supplement (pp.82-84) 53 | 54 | **Note on MMIX and MIX** 55 | 56 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 57 | 58 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 59 | 60 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 61 | 62 | ## Chat Copy 63 | 64 | **Zartaj Majeed** 2:15 PM\ 65 | reading till 2:21 66 | 67 | **Zartaj Majeed** 2:35 PM\ 68 | reading till 3:41\ 69 | putting up a slide that breaks out step Q7 70 | 71 | **Zartaj Majeed** 2:41 PM\ 72 | meant 2:41, anyway ... 73 | 74 | **Miguel Angel Iglesias** 3:01 PM\ 75 | https://stackify.com/premature-optimization-evil/ 76 | 77 | 78 | **Zartaj Majeed** 3:04 PM\ 79 | reading till 3:09 80 | 81 | **Zartaj Majeed** 3:10 PM\ 82 | break till 3:19 83 | 84 | **Zartaj Majeed** 3:19 PM\ 85 | we're back 86 | 87 | **Zartaj Majeed** 3:22 PM\ 88 | reading till 3:29 89 | 90 | **Zartaj Majeed** 3:40 PM\ 91 | reading till 3:45 92 | 93 | **Zartaj Majeed** 3:55 PM\ 94 | reading till 4:01 95 | 96 | -------------------------------------------------------------------------------- /20201107_taocp_10_topological_sort/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #10 - Topological Sort and Linked Lists (Chapter 2, Information Structures: Section 2.2.3) 2 | 3 | Linked lists! 4 | 5 | We look at adding links to nodes in a list to allow more flexible memory allocation schemes. We discuss what would need to be done for insertions and deletions. We go over tradeoffs between linked allocation and sequential allocation. 6 | 7 | Then we use linked lists in an algorithm for topological sorting to create a linear order on a set of items that only has a partial order. We'll work on some exercises as well. 8 | 9 | After the main meetup session, we'll continue to record a demo and walkthrough of Program T for topological sorting in the MMIX Visual Debugger. Attendees will be welcome to stay on if they desire. 10 | 11 | **A recording of this event is at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 12 | 13 | **Date:** Saturday, 7 November 2020\ 14 | **Time:** 2-4pm America/New_York\ 15 | **Location:** Google Meet online 16 | 17 | ## Agenda 18 | 19 | **2:00 - 2:10** Meet and greet\ 20 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 2, Information Structures* (along with *MMIX Supplement*) 21 | 22 | - *2.2 Linear Lists* (pp.254-268) 23 | 24 | - *2.2.3 Linked Allocation* (pp.254-256), MMIX Supplement (p.18) 25 | - *2.2.3 Linked Allocation* (pp.256-258), MMIX Supplement (pp.18-19) 26 | - *2.2.3 Linked Allocation* (pp.259-260), MMIX Supplement (p.19) 27 | - *Topological sorting* (pp.261-263), MMIX Supplement (p.19) 28 | - *Topological sorting* (pp.263-264), MMIX Supplement (p.19) 29 | - *Algorithm T (Topological sort)* (pp.265-266), MMIX Supplement (p.20) 30 | 31 | **3:00 - 3:10** Break\ 32 | **3:10 - 4:00** 33 | - *Exercises* (pp.268-273), MMIX Supplement (pp.22-25) 34 | - Shoot the breeze 35 | 36 | **Bonus Segment** 37 | 38 | - *Program T (Topological sort)* (pp.266-268), MMIX Supplement (pp.20-22) 39 | - Stepthru in MMIX Visual Debugger 40 | 41 | **Note on MMIX and MIX** 42 | 43 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 44 | 45 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 46 | 47 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 48 | 49 | ## Chat Copy 50 | 51 | **Michael Zalewski** 2:28 PM\ 52 | He kind of glosses over the 'extra memory' problem. He assumes that we can fit both LINK and INFO into a single OCTA 53 | 54 | **Miguel Angel Iglesias** 2:37 PM\ 55 | brb 56 | 57 | **Zartaj Majeed** 2:52 PM\ 58 | T for TOP of stack 59 | 60 | **Michael Zalewski** 2:59 PM\ 61 | On p 256, he says a node has one word and that it is broken into the two fields INFO and LINK. But in the MMIX Supplement, INFO and LINK are consecutive words 62 | 63 | **Zartaj Majeed** 3:03 PM\ 64 | break till 3:13 65 | 66 | **Zartaj Majeed** 3:14 PM\ 67 | we're back 68 | 69 | **Zartaj Majeed** 3:30 PM\ 70 | pick 9 then 2 then 5\ 71 | 5 cannot be removed right now\ 72 | remove 1\ 73 | so we have 9, 2, 1\ 74 | then remove 3\ 75 | then 7 76 | 77 | **Zartaj Majeed** 3:31 PM\ 78 | so we have 9, 2, 1, 3, 7, ... 79 | 80 | **Jolene Dunne** 3:37 PM\ 81 | I need to drop off now unfortunately, thanks everyone and see you next week! 82 | 83 | **Zartaj Majeed** 3:39 PM\ 84 | thanks Jolene 85 | 86 | **Zartaj Majeed** 3:41 PM\ 87 | reading till 3:46 88 | 89 | **Michael Zalewski** 3:43 PM\ 90 | The input to the problem can be thought of a a list of the 'arrows' from the network diagram in Fig. 6. But I think we are more likely to receive input as a list of the 'nodes'. (And each node would require its own list of outgoing arrows) 91 | 92 | **Zartaj Majeed** 3:55 PM\ 93 | reading till 4:02 94 | 95 | **Miguel Angel Iglesias** 4:40 PM\ 96 | got to drop off, see you next week! 97 | 98 | **Zartaj Majeed** 5:58 PM\ 99 | Michael - your webcam is still on! 100 | 101 | 102 | -------------------------------------------------------------------------------- /20210206_taocp_22_equivalence_relations/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #22 - Equivalence Relations (Chapter 2, Information Structures: Section 2.3.3) 2 | 3 | Trees in memory! 4 | 5 | We look at ways to represent a binary tree in memory in section 2.3.3 Other Representations of Trees. 6 | 7 | Knuth's fascinating coverage begins with the pros and cons of a few sequential representation techniques. We see one of these - postorder with degrees - applied to the bottom-up evaluation of functions in Algorithm F (Evaluate a locally defined function in a tree). 8 | 9 | Then we discuss linked representations. An application based on oriented trees is shown in Algorithm E (Process equivalence relations) 10 | 11 | We'll do some exercises 12 | 13 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 14 | 15 | Keep the conversation going! 16 | 17 | Facebook: https://www.facebook.com/groups/678335496099220
18 | IRC ##taocp: https://webchat.freenode.net/##taocp 19 | 20 | **Date:** Saturday, 6 February 2021\ 21 | **Time:** 2-4pm America/New_York\ 22 | **Location:** Google Meet online 23 | 24 | ## Agenda 25 | 26 | **2:00 - 2:10** Meet and greet\ 27 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 2, Information Structures* (along with *MMIX Supplement*) 28 | 29 | - *2.3.3 Other Representations of Trees* (pp.348-355) 30 | - Preorder sequential representation (pp.348-349) 31 | - Reusing empty right-link fields (pp.349-350) 32 | - Family order and level order (pp.350-351) 33 | - *Algorithm F (Evaluate a locally defined function in a tree)* (p.351) 34 | - Linked representations (pp.352-353) 35 | - Equivalence relations (pp.353-354) 36 | - *Algorithm E (Process equivalence relations)* (pp.354-355) 37 | 38 | **3:00 - 3:10** Break\ 39 | **3:10 - 4:00** 40 | - *Exercises* (pp.359-362) 41 | - Shoot the breeze 42 | 43 | **Note on MMIX and MIX** 44 | 45 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 46 | 47 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 48 | 49 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 50 | 51 | ## Chat Copy 52 | 53 | **Zartaj Majeed** 2:14 PM\ 54 | reading till 2:19 55 | 56 | **Zartaj Majeed** 2:17 PM\ 57 | the orthogonal binary tree diagram in (2) on p.349 is what Knuth calls the natural correspondence of ""general" trees/forests and binary trees 58 | 59 | **Arthur O'Dwyer** 2:18 PM\ 60 | Fig 20(b) is on page 312. 61 | 62 | **Zartaj Majeed** 2:18 PM\ 63 | defined on p.334 in 2.3.2 64 | 65 | **Zartaj Majeed** 2:21 PM\ 66 | 2 minutes more till 2:22 67 | 68 | **Zartaj Majeed** 2:29 PM\ 69 | reading till 2:35 70 | 71 | **Arthur O'Dwyer** 2:30 PM\ 72 | Btw, "Λ" is how Knuth spells "the null pointer" 73 | 74 | **Zartaj Majeed** 2:34 PM\ 75 | exercise 2.4.12 given as an application of SCOPEd representation has to do with symbol table lookups from what I gather 76 | 77 | **Zartaj Majeed** 2:45 PM\ 78 | reading till 2:50 79 | 80 | **Arthur O'Dwyer** 2:49 PM\ 81 | Page 350: What is a "family" again? 82 | 83 | **Zartaj Majeed** 2:50 PM\ 84 | I think it's the family tree\ 85 | p.311 86 | 87 | **Zartaj Majeed** 2:59 PM\ 88 | fig 8 is level order 89 | 90 | **Zartaj Majeed** 3:01 PM\ 91 | reading till 3:05 92 | 93 | **Zartaj Majeed** 3:09 PM\ 94 | break till 3:19 95 | 96 | **Zartaj Majeed** 3:19 PM\ 97 | we're back 98 | reading till 3:25 99 | 100 | **Arthur O'Dwyer** 3:23 PM\ 101 | Bottom of page 352 also uses "family" in the sense of "set of siblings." So I guess that's pretty well established as Knuth's intended meaning. 102 | 103 | **Zartaj Majeed** 3:33 PM\ 104 | reading till 3:38 105 | 106 | **Zartaj Majeed** 3:46 PM\ 107 | reading till 3:51 108 | 109 | **Zartaj Majeed** 3:58 PM\ 110 | exercise 2.3.3.1 111 | 112 | **Zartaj Majeed** 4:06 PM\ 113 | exercise 2.3.3.6 114 | 115 | -------------------------------------------------------------------------------- /20201010_taocp_6_mmix_branching/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #6 - MMIX Branching 2 | 3 | **Date:** Saturday, 10 October 2020\ 4 | **Time:** 2-4pm America/New_York\ 5 | **Location:** Google Meet online 6 | 7 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 8 | 9 | #### Agenda 10 | 11 | **2:00 - 2:10** Meet and greet\ 12 | **2:10 - 3:00** Read and discuss couple pages at a time from *Fascicle 1, MMIX* (corresponding to *Chapter 1, Basic Concepts*) 13 | 14 | - *1.3.1' Description of MMIX* (pp.13-24) 15 | 16 | - *Immediate constants* (pp.13-14) 17 | - *Jumps and branches* (pp.15-16) 18 | - *The complete instruction set* (pp.19-21) 19 | - *Timing* (pp.21-23) 20 | - *MMIX versus reality* (p.23) 21 | - *Summary* (p.24) 22 | 23 | **3:00 - 3:10** Break\ 24 | **3:10 - 4:00** 25 | - *Exercises* (pp.24-28) 26 | - Shoot the breeze 27 | 28 | We wrap up the **MMIX** instruction set! 29 | 30 | We learn that many instructions can take constants instead of registers as operands. This is often a nice convenience that allows small values to be used for arithmetic or for relative addressing. It also allows a register to be set to any value without loading data from memory. 31 | 32 | Then we learn instructions to branch and jump. These are the basis of essential programming control constructs like **if-else** conditions and **while** loops. This will allow us to finally study and write complete programs for an **MMIX** computer. 33 | 34 | We'll go over the costs of the entire **MMIX** instruction set. This lets us estimate the performance of a program and compare the speed of two programs. 35 | 36 | After the break, we'll work on exercises on the new instructions and those from previous meetups on **MMIX**. 37 | 38 | **Note on MMIX and MIX** 39 | 40 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 41 | 42 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 43 | 44 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 45 | 46 | ## Chat Copy 47 | 48 | **Zartaj Majeed** 2:20 PM\ 49 | Question: Do you like problem-solving in the large, or in the small? 50 | 51 | **Zartaj Majeed** 2:32 PM\ 52 | ADD $1,$2,$3 53 | 54 | **Zartaj Majeed** 2:34 PM\ 55 | ADD $1,$2,25 56 | 57 | **Zartaj Majeed** 2:35 PM\ 58 | SETH $1,$2,$3 59 | 60 | **Zartaj Majeed** 2:38 PM\ 61 | SETH $0,#0123 62 | 63 | **Deepa Annamalai** 2:39 PM\ 64 | $0 <=== #0123 #hexa 65 | 66 | **Zartaj Majeed** 2:39 PM\ 67 | INCMH $0,#4567 68 | 69 | **Deepa Annamalai** 2:40 PM\ 70 | 0123 + 4567 # hex addition 71 | 72 | **Zartaj Majeed** 2:41 PM\ 73 | $0 = #0123 00 00 00 00 00 00 74 | 75 | **Deepa Annamalai** 2:45 PM\ 76 | INCMH <=== 0123 4567 00 00 00 00 77 | 78 | **Zartaj Majeed** 2:46 PM\ 79 | INCML $0,#89ab 80 | 81 | **Deepa Annamalai** 2:47 PM\ 82 | $0 <==== 0123 4567 89ab 00 00 83 | 84 | **Zartaj Majeed** 2:48 PM\ 85 | INCL $0,#cdef 86 | 87 | **Deepa Annamalai** 2:48 PM\ 88 | $0 <====0123 4567 89ab cdef 89 | 90 | **Zartaj Majeed** 3:01 PM\ 91 | symbolic form #f0 00 00 02\ 92 | operand is @+4 * 2 93 | 94 | **Zartaj Majeed** 3:03 PM\ 95 | XYZ = 2\ 96 | @=#1000 97 | 98 | **Zartaj Majeed** 3:05 PM\ 99 | next address will be #1000 + 4 * 2\ 100 | = #1008 101 | 102 | **Zartaj Majeed** 3:15 PM\ 103 | $1 = #1000\ 104 | GO $1,$1,0 105 | 106 | **Zartaj Majeed** 3:17 PM\ 107 | $1 = ?\ 108 | $1 = #1004 109 | 110 | **Zartaj Majeed** 3:19 PM\ 111 | @=#1000\ 112 | $1 = #1234 113 | 114 | **Zartaj Majeed** 3:20 PM\ 115 | GO $1,$1,0\ 116 | @=#1234 117 | 118 | **Zartaj Majeed** 3:21 PM\ 119 | $1=? 120 | 121 | **Deepa Annamalai** 3:22 PM\ 122 | $1 = #1234 123 | 124 | **Deepa Annamalai** 3:24 PM\ 125 | $1 = #1004 # this gets saved before 126 | 127 | **Zartaj Majeed** 3:34 PM\ 128 | break till 3:42 129 | 130 | **Deepa Annamalai** 3:42 PM\ 131 | i am ready 132 | 133 | **Deepa Annamalai** 3:51 PM\ 134 | btw, this is a fixed link for every week? 135 | 136 | **Deepa Annamalai** 4:02 PM\ 137 | Sorry, i need to leave now. i will watch the recording for this last part. 138 | -------------------------------------------------------------------------------- /20210130_taocp_21_derivatives/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #21 - Derivatives (Chapter 2, Information Structures: Section 2.3.2) 2 | 3 | Calculus with trees! 4 | 5 | It turns out any tree may be represented as a binary tree. We learn this correspondence in Section 2.3.2 Binary Tree Representation of Trees and use it to compute the derivative of an algebraic expression. For example the derivative of 6 | y = 3 * ln(x + 1) − a / x² is 7 | D(y) = 3 * (1 / (x + 1)) − (-(a * (2 * x)) / (x²)²) 8 | 9 | Knuth provides the bulk of the algorithm and MMIX code for differentiation. Some parts are left to exercises. We'll try to go over the complete program. 10 | 11 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 12 | 13 | Keep the conversation going! 14 | 15 | Facebook: https://www.facebook.com/groups/678335496099220
16 | IRC ##taocp: https://webchat.freenode.net/##taocp 17 | 18 | **Date:** Saturday, 30 January 2021\ 19 | **Time:** 2-4pm America/New_York\ 20 | **Location:** Google Meet online 21 | 22 | ## Agenda 23 | 24 | **2:00 - 2:10** Meet and greet\ 25 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 2, Information Structures* (along with *MMIX Supplement*) 26 | 27 | - *2.3.2. Binary Tree Representation of Trees* (pp.334-346) 28 | - Natural correspondence of forests and binary trees (p.334-337) 29 | - Tree of an algebraic formula (pp.337-338), MMIX Supplement (p.39) 30 | - Finding the derivative (pp.338-340) 31 | - *Algorithm D (Differentiation)* (p.340) 32 | - Routines for various operators (pp.340-342) 33 | - *Program D (Differentiation)* (pp.342-346), MMIX Supplement (pp.39-43) 34 | 35 | **3:00 - 3:10** Break\ 36 | **3:10 - 4:00** 37 | - *Exercises* (pp.346-348), MMIX Supplement (p.43) 38 | - Shoot the breeze 39 | 40 | **Note on MMIX and MIX** 41 | 42 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 43 | 44 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 45 | 46 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 47 | 48 | ## Chat Copy 49 | 50 | **Zartaj Majeed** 2:14 PM\ 51 | reading till 3:21 ny 52 | 53 | **Zartaj Majeed** 2:17 PM\ 54 | section 2.3.2 Binary Tree Representation of Trees\ 55 | sorry - reading till 2:21 ny 56 | 57 | **Zartaj Majeed** 2:42 PM\ 58 | inorder traversal of binary tree in (3) should be postorder traversal of forest of trees in (1) 59 | 60 | **Adam Zippor** 2:44 PM\ 61 | BKCAHEJFGD? 62 | 63 | **Zartaj Majeed** 2:50 PM\ 64 | reading till 2:55 ny 65 | 66 | **Zartaj Majeed** 2:53 PM\ 67 | threaded trees are defined on pp.321-323 of vol 1 3rd ed.\ 68 | the point of threaded trees is to make traversals more efficient 69 | 70 | **Zartaj Majeed** 2:56 PM\ 71 | note memory representation of node structure is different for MMIX - shown in the MMIX supplement p.39 72 | 73 | **Zartaj Majeed** 3:08 PM\ 74 | break till 3:18 ny 75 | 76 | **Zartaj Majeed** 3:18 PM\ 77 | we're back 78 | reading till 3:24 ny 79 | 80 | **Zartaj Majeed** 3:31 PM\ 81 | reading till 3:36 ny 82 | 83 | **Zartaj Majeed** 3:32 PM\ 84 | the Y$ notation is defined on p.321 of vol 1 3rd ed 85 | 86 | **Zartaj Majeed** 3:34 PM\ 87 | Λ (big lambda) is a NULL link/pointer 88 | 89 | **Zartaj Majeed** 3:37 PM\ 90 | RTAG is a flag that tells you if the right link points to an actual child (RTAG=0) or is a thread that points to the inorder successor of the node (RTAG=1) 91 | 92 | **Zartaj Majeed** 3:52 PM\ 93 | reading till 3:59 ny 94 | 95 | **Michael Zalewski** 4:00 PM\ 96 | 3 x 1 + ln x a x 2 ^ / - 97 | 98 | **Michael Zalewski** 4:04 PM\ 99 | D(3) 3 x 1 ... 100 | 101 | **Michael Zalewski** 4:05 PM\ 102 | 0 3 x$ 1 + ln ...\ 103 | 0 3 1 x 1$ + ln ... 104 | 105 | **Michael Zalewski** 4:06 PM\ 106 | 0 3 1 x 0 1 +$ ln ... 107 | 108 | **Michael Zalewski** 4:08 PM\ 109 | ((0 3) ((1 x) (0 1))) 110 | 111 | **Michael Zalewski** 4:15 PM\ 112 | 2^n > n^3 when n > 10 113 | 114 | **Zartaj Majeed** 4:15 PM\ 115 | p.11 of vol 1 3rd ed\ 116 | section 1.2.1 Mathematical Induction 117 | 118 | **Michael Zalewski** 4:15 PM\ 119 | 2^(n + 1) > (n + 1)^3\ 120 | 2^n + 2^n > n^ 3 n^3 121 | 122 | **Michael Zalewski** 4:17 PM\ 123 | 2^n + 2^n > n^3 + 7 * n^2\ 124 | 2^n + 2^n > n^3 + 3* n^2 + 3*n + 1 125 | 126 | **Michael Zalewski** 4:18 PM\ 127 | 2^(n+1) > (n+1)^3 128 | 129 | -------------------------------------------------------------------------------- /20201121_taocp_12_sorting/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #12 - Sorting (Chapter 5, Sorting: Section 5.2) 2 | 3 | TAOCP Volume 3! 4 | 5 | We dip our toes in Volume 3 with an introduction to sorting. We consider broad categories of approaches to solving the problem of sorting items. TAOCP covers many sorting techniques in great depth. Fortunately some of the initial algorithms don't need data structures any more complex than an array or singly linked list. 6 | 7 | We should be able to spend about a dozen meetups on these first sorting algorithms. Afterwards we'll return to data structures in Volume 1 to learn more on lists and trees. 8 | 9 | Our initial focus will be on sorting quantities of data that entirely fit in memory. This is what TAOCP calls internal sorting. 10 | 11 | We look at two methods of sorting by counting in this meetup - comparison counting and distribution counting. An MMIX program for comparison counting will be demoed in the bonus segment. 12 | 13 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 14 | 15 | Keep the conversation going! 16 | 17 | Facebook: https://www.facebook.com/groups/678335496099220
18 | IRC ##taocp: https://webchat.freenode.net/##taocp 19 | 20 | **Date:** Saturday, 21 November 2020\ 21 | **Time:** 2-4pm America/New_York\ 22 | **Location:** Google Meet online 23 | 24 | ## Agenda 25 | 26 | **2:00 - 2:10** Meet and greet\ 27 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 5, Sorting* (along with *MMIX Supplement*) 28 | 29 | - *5.2 Internal Sorting* (pp.73-79) 30 | 31 | - *5.2 Internal Sorting* (pp.73-75) 32 | - *Sorting by counting* (pp.75-76) 33 | - *Algorithm C (Comparison counting)* (p.76) 34 | - *Program C (Comparison counting)* (pp.76-78), MMIX Supplement (pp.74-75) 35 | - *Algorithm D (Distribution counting)* (pp.78-79) 36 | 37 | **3:00 - 3:10** Break\ 38 | **3:10 - 4:00** 39 | - *Exercises* (pp.79-80), MMIX Supplement (p.75) 40 | - Shoot the breeze 41 | 42 | **Bonus Segment** 43 | 44 | Stepthru in MMIX Visual Debugger 45 | 46 | - *Program C (Comparison counting)*, MMIX Supplement (pp.74-75) 47 | 48 | **Note on MMIX and MIX** 49 | 50 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 51 | 52 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 53 | 54 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 55 | 56 | ## Chat Copy 57 | 58 | **Zartaj Majeed** 2:15 PM\ 59 | reading till 2:22 60 | 61 | **Sensea Sensea** 2:24 PM\ 62 | exchange 63 | 64 | **Sensea Sensea** 2:27 PM\ 65 | bubble sort most popular likely 66 | 67 | **Zartaj Majeed** 2:31 PM\ 68 | reading till 2:37 69 | 70 | **Zartaj Majeed** 2:39 PM\ 71 | K: 5, -2, -3, 6\ 72 | COUNT: ? 73 | 74 | **Miguel Angel Iglesias** 2:40 PM\ 75 | 0,0,0,0 76 | 77 | **Miguel Angel Iglesias** 2:42 PM\ 78 | 0,0,0,3 79 | 80 | 81 | **James Curran** 2:42 PM\ 82 | 1,1,0,3 83 | 84 | **James Curran** 2:44 PM\ 85 | 2,1,0,3 86 | 87 | **James Curran** 2:49 PM\ 88 | final [0] = data[address[0] ]\ 89 | final[count[0]] = data[0] 90 | 91 | **Miguel Angel Iglesias** 2:53 PM\ 92 | brb 93 | 94 | **Sensea Sensea** 2:54 PM\ 95 | 5 | -2 | -3 | 6\ 96 | 2 | 1 | 0 | 3 97 | 98 | **Michael Zalewski** 2:57 PM\ 99 | DATA = 4 3 1 2\ 100 | COUNT = 3 2 0 1\ 101 | DATA[ COUNT[ 0] ] = 2, which is not the min 102 | 103 | **Zartaj Majeed** 3:00 PM\ 104 | thanks Michael! 105 | 106 | **Zartaj Majeed** 3:03 PM\ 107 | break till 3:14 108 | 109 | **Zartaj Majeed** 3:15 PM\ 110 | we're back 111 | 112 | **Zartaj Majeed** 3:19 PM\ 113 | reading till 3:26 114 | 115 | **Zartaj Majeed** 3:26 PM\ 116 | ex 6:\ 117 | K: 5, 0, 5, 0, 9, 1, 8, 2, 6, 4, 1, 5, 6, 6, 7, 7\ 118 | N = 16 119 | 120 | **Zartaj Majeed** 3:29 PM\ 121 | initialize: COUNT[0..9] 122 | COUNT: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 123 | 124 | **James Curran** 3:31 PM\ 125 | after D3: count = [2,2,1,0,1,3,3,2,1,1]\ 126 | after D4, count = [2,4,5,5,6,9,12,14,15,16] 127 | 128 | **James Curran** 3:38 PM\ 129 | final[0..2] = 0\ 130 | final[3..4] = 1|\ 131 | final[5..5] = 2|\ 132 | final[-] = 3|\ 133 | final[6..6] = 4 134 | 135 | **Miguel Angel Iglesias** 3:49 PM\ 136 | I got to drop off, see you next time! 137 | 138 | **Sensea Sensea** 3:54 PM\ 139 | need to run, catch up in the replay 140 | 141 | **Zartaj Majeed** 3:55 PM\ 142 | thanks Paul! 143 | 144 | 145 | -------------------------------------------------------------------------------- /20210220_taocp_24_huffman_trees/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #24 - Huffman Trees (Chapter 2, Information Structures: Sections 2.3.4.5) 2 | 3 | We look at the concept of path length in trees in section 2.3.4.5 that Knuth considers "of great importance in the analysis of algorithms, since this quantity is often directly related to the execution time". 4 | 5 | We look at extended binary trees that insure every node of the original tree has two children. This is used to establish some short results on path lengths in binary trees that are generalized to ternary, quaternary and higher-order trees. 6 | 7 | Finally we consider associating weights with the nodes of a tree and look at Huffman's method for finding a tree with minimum weighted path length. 8 | 9 | We'll do some exercises 10 | 11 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 12 | 13 | Keep the conversation going! 14 | 15 | Facebook: https://www.facebook.com/groups/678335496099220
16 | IRC ##taocp: https://webchat.freenode.net/##taocp 17 | 18 | **Date:** Saturday, 20 February 2021\ 19 | **Time:** 2-4pm America/New_York\ 20 | **Location:** Google Meet online 21 | 22 | ## Agenda 23 | 24 | **2:00 - 2:10** Meet and greet\ 25 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 2, Information Structures* (along with *MMIX Supplement*) 26 | 27 | - *2.3.4.5 Path length* (pp.399-404) 28 | 29 | - Extended binary tree (pp.399-400) 30 | - Internal and external path lengths (p.400) 31 | - Complete binary trees and higher-order trees (pp.401-402) 32 | - Huffman's method for weighted path lengths (pp.402-404) 33 | 34 | **3:00 - 3:10** Break\ 35 | **3:10 - 4:00** 36 | - *Exercises* (pp.404-406) 37 | - Shoot the breeze 38 | 39 | **Note on MMIX and MIX** 40 | 41 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 42 | 43 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 44 | 45 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 46 | 47 | ## Chat Copy 48 | 49 | **Zartaj Majeed** 2:17 PM\ 50 | reading till 2:22 51 | 52 | **Zartaj Majeed** 2:19 PM\ 53 | the result about the number of edges of a free tree is on pp.363-364 54 | 55 | **Zartaj Majeed** 2:21 PM\ 56 | specifically Theorem A a) G is a free tree with n > 0 vertices implies d) G contains no cycles and has n − 1 edges 57 | 58 | **Arthur O'Dwyer** 2:22 PM\ 59 | "To prove formula (3), consider deleting..." seems to be presented backwards; I think it'd be (a) more technically correct logical induction and (b) clearer if he'd said "Consider replacing an external node at distance k with an internal node."\ 60 | Then all that remains to prove is that every binary tree is constructible by iterating this "add a node" step starting from the empty tree. 61 | 62 | **Zartaj Majeed** 2:24 PM\ 63 | reading till 2:29 64 | 65 | **Zartaj Majeed** 2:42 PM\ 66 | reading till 2:47 67 | 68 | **Zartaj Majeed** 2:56 PM\ 69 | reading till 3:01 70 | 71 | **Arthur O'Dwyer** 2:57 PM\ 72 | = (n+1)(lg n + O(1)) - 2^(lg n + O(1)) + 2\ 73 | = (n lg n) + lg n + O(n) + O(1) - (2^O(1)) * n + 2\ 74 | = (n lg n) + lg n + O(n) + O(1) - O(n) + 2\ 75 | = (n lg n) + O(n) 76 | 77 | **Zartaj Majeed** 3:02 PM\ 78 | break till 3:12 79 | 80 | **Zartaj Majeed** 3:12 PM\ 81 | we're back\ 82 | reading till 3:18 83 | 84 | **Arthur O'Dwyer** 3:32 PM\ 85 | Divide our 20 possibilities into:\ 86 | (2 3 4), (11)\ 87 | Then recursively divide the left-hand 9 possibilities into:\ 88 | (4), (2 3)\ 89 | and so on 90 | 91 | **Zartaj Majeed** 3:36 PM\ 92 | reading till 3:41 93 | 94 | **Arthur O'Dwyer** 3:38 PM\ 95 | "we can apply it to the merging of sorted sequences" — ah, I see (I think). He means if we have a bunch of small sorted sequences but we're allowed to merge only 2 at a time. It takes (n+m) time to merge a sequence of length n with a sequence of length m. So we want to merge the smaller sequences first and save the longer sequences for later (higher up in our "tree" of merges). 96 | 97 | **Zartaj Majeed** 3:50 PM\ 98 | reading till 3:54 99 | 100 | **Arthur O'Dwyer** 3:51 PM\ 101 | Re my extended "20 Questions" problem: I'm fairly confident that if you have a fixed list of "questions" you're allowed to ask (e.g. suppose I know a question that distinguishes A,B,C from D,E,F, but I don't know any single question that distinguishes A,B,E from C,D,F), then the top-down "20 Questions" algorithm is the only optimal solution. Huffman's bottom-up solution stops working.\ 102 | Because perhaps E and F are the least likely answers, so I want to keep them together in the lowest subtree; but in fact all the questions I know *distinguish* between E and F. So I physically can't keep them together in the same subtree. 103 | 104 | **Arthur O'Dwyer** 3:54 PM\ 105 | (or rather, Huffman would greedily keep them together in the lowest subtree, thus producing a subtree that would not be physically possible to place into the larger tree) 106 | 107 | **Michael Zalewski** 3:54 PM\ 108 | You need something stronger than a "fixed list of question". A fixed list might not be sufficient to arrive at an answer. 109 | 110 | **Arthur O'Dwyer** 4:18 PM\ 111 | "Convex function" is what we called "concave up" in high school. 112 | 113 | -------------------------------------------------------------------------------- /20201212_taocp_15_batcher_sort/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #15 - Batcher Sort (Chapter 5, Sorting: Section 5.2.2) 2 | 3 | Bubble sorting! 4 | 5 | We've explored two techniques for sorting - counting smaller values to figure out the final position of a key - and insertion of a new key in its correct position in an already sorted sequence. 6 | 7 | We look at the category of sorting by exchanging in our fourth meetup on sorting. 8 | 9 | The first algorithm is bubblesort - it makes multiple passes through an array making bigger keys bubble up as high as possible. 10 | 11 | We'll discuss deficiencies of Algorithm B (Bubble sort) and how it may be improved. 12 | 13 | Then we look at Algorithm M (Merge exchange) due to Batcher that too falls under the approach of sorting by exchanging. It has particular appeal because it may be parallelized making it one of the fastest known general sorting methods. Also its method of comparisons make it an example of data-oblivious algorithms as well as constant-time algorithms that are of interest to cryptography. Constant-time algorithms take the same amount of time for a given input size independent of the actual data values. 14 | 15 | We'll work on some exercises. 16 | 17 | The bonus segment will demo a debugger stepthru of an MMIX program for Algorithm M (Merge exchange) from The MMIX Supplement. 18 | 19 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 20 | 21 | Keep the conversation going! 22 | 23 | Facebook: https://www.facebook.com/groups/678335496099220
24 | IRC ##taocp: https://webchat.freenode.net/##taocp 25 | 26 | **Date:** Saturday, 12 December 2020\ 27 | **Time:** 2-4pm America/New_York\ 28 | **Location:** Google Meet online 29 | 30 | ## Agenda 31 | 32 | **2:00 - 2:10** Meet and greet\ 33 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 5, Sorting* (along with *MMIX Supplement*) 34 | 35 | - *5.2.2 Sorting by Exchanging* (pp.105-113) 36 | - *The bubble sort* (pp.105-107) 37 | - *Algorithm B (Bubble sort)* (p.107) 38 | - *Program B (Bubble sort)*, MMIX Supplement (p.81) 39 | - *Analysis of the bubble sort* (pp.108-109), MMIX Supplement (p.82) 40 | - *Refinements of the bubble sort* (pp.109-110) 41 | - *Batcher's parallel method* (pp.110-111) 42 | - *Algorithm M (Merge exchange)* (pp.111-113) 43 | 44 | **3:00 - 3:10** Break\ 45 | **3:10 - 4:00** 46 | - *Exercises* (pp.134-138), MMIX Supplement (p.86) 47 | - Shoot the breeze 48 | 49 | **Bonus Segment** 50 | 51 | Stepthru in MMIX Visual Debugger 52 | 53 | - *Exercise 5.2.2.12* implements Algorithm M (Merge exchange), MMIX Supplement (p.169) 54 | 55 | **Note on MMIX and MIX** 56 | 57 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 58 | 59 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 60 | 61 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 62 | 63 | ## Chat Copy 64 | 65 | **Zartaj Majeed** 2:09 PM\ 66 | reading till 2:14 67 | 68 | **Arthur O'Dwyer** 2:14 PM\ 69 | IIUC, the horizontal lines in Fig 14 don't actually numerically correspond to the values of "t" in Algorithm B. 70 | 71 | **Zartaj Majeed** 2:18 PM\ 72 | reading till 2:22 73 | 74 | **Arthur O'Dwyer** 2:19 PM\ 75 | Ah, I see: The horizontal line ("water level") in the Nth column [where the leftmost column is the 0th column] goes in between the last two elements to have been actually swapped in Pass N. 76 | 77 | **Zartaj Majeed** 2:22 PM\ 78 | yes - t is the temporary tracking that level\ 79 | and BOUND gets updated to t at the end of loop 80 | 81 | **Zartaj Majeed** 2:34 PM\ 82 | reading till 2:37 83 | 84 | **Zartaj Majeed** 2:47 PM\ 85 | reading till 2:50 86 | 87 | **Arthur O'Dwyer** 2:48 PM\ 88 | Is the final `POP 0,0` instruction basically just a no-op that he put there so that there'd be somewhere to hang label 9H? Or is it significant to the operation of the program? 89 | 90 | **Arthur O'Dwyer** 2:52 PM\ 91 | "Another idea is to eliminate most of the exchanges; since most elements simply shift left one step during an exchange, we could achieve the same effect by viewing the array differently, shifting the origin of indexing"\ 92 | I don't follow this part. 93 | 94 | **Zartaj Majeed** 3:02 PM\ 95 | reading till 3:05 96 | 97 | **Arthur O'Dwyer** 3:03 PM\ 98 | Historical note: Ken Iverson's "A Programming Language" is also known as "APL". :) 99 | 100 | **Arthur O'Dwyer** 3:05 PM\ 101 | 5.1.1 exercise 5 sketches an O(n lg n) algorithm for computing a permutation from its inversion table. 102 | 103 | **Zartaj Majeed** 3:05 PM\ 104 | break till 3:15 105 | 106 | **Zartaj Majeed** 3:16 PM\ 107 | we're back 108 | 109 | **Zartaj Majeed** 3:27 PM\ 110 | reading till 3:34 111 | 112 | **Arthur O'Dwyer** 3:59 PM\ 113 | 16 16 0 16\ 114 | 8 16 0 8\ 115 | 8 8 8 8 116 | 117 | **Arthur O'Dwyer** 4:03 PM\ 118 | https://en.wikipedia.org/wiki/Hybrid_algorithm\ 119 | https://en.wikipedia.org/wiki/Introsort 120 | 121 | **Zartaj Majeed** 4:07 PM\ 122 | MMIX stepthru of Bubble sort - https://github.com/theartofcomputerprogramming/mmixsamples/blob/master/program_b_bubble_sort.mms 123 | 124 | **Arthur O'Dwyer** 4:19 PM\ 125 | I just wrote up this C++ "bubblesort vs. shaker sort" demo: https://godbolt.org/z/avEcjT\ 126 | Now I'm trying to write up the "shift up by 1, shift down by 1" variation of shaker sort... 127 | 128 | **Zartaj Majeed** 4:31 PM\ 129 | break for 5 minutes 130 | 131 | **Zartaj Majeed** 4:35 PM\ 132 | we're back 133 | 134 | **Zartaj Majeed** 5:27 PM\ 135 | array in memory corresponds to array in Table 1 after pass 1 on row 1\ 136 | i.e. this is row 2 of Table 1 137 | 138 | **Zartaj Majeed** 5:30 PM\ 139 | this is now row 4 of Table 1\ 140 | this is row 6 of Table 1 141 | 142 | -------------------------------------------------------------------------------- /20210123_taocp_20_binary_trees/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #20 - Binary Trees (Chapter 2, Information Structures: Section 2.3.1) 2 | 3 | Binary trees and proof by induction! 4 | 5 | We wrap up the introduction to binary trees and threaded trees with two algorithms. Algorithm I (Insertion into a threaded binary tree) shows how to construct a threaded tree. Algorithm C (Copy a binary tree) may be used to copy binary trees that are threaded or unthreaded, or have threads only on one side. 6 | 7 | Section 2.3.1 has a number of exercises that flesh out many aspects of the material. We'll attempt a few. 8 | 9 | But first we'll go over section 1.2.1 Mathematical Induction that is part of section 1.2 Mathematical Preliminaries. We've already seen the use of induction in a proof of Algorithm T (Traverse binary tree in inorder). And it's bound to be used often to prove properties of recursive data structures like trees and of algorithms on them. Knuth's presentation of induction is quite interesting and different from that typically given in purely mathematical texts. 10 | 11 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 12 | 13 | Keep the conversation going! 14 | 15 | Facebook: https://www.facebook.com/groups/678335496099220
16 | IRC ##taocp: https://webchat.freenode.net/##taocp 17 | 18 | **Date:** Saturday, 23 January 2021\ 19 | **Time:** 2-4pm America/New_York\ 20 | **Location:** Google Meet online 21 | 22 | ## Agenda 23 | 24 | **2:00 - 2:10** Meet and greet\ 25 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 1, Basic Concepts* and *Chapter 2, Information Structures* (along with *MMIX Supplement*) 26 | 27 | - *1.2.1 Mathematical Induction* (pp.11-18) 28 | - Algorithmic proof procedure (pp.11-13) 29 | - *Algorithm I (Construct a proof)* (pp.11-12) 30 | - *Algorithm E (Extended Euclid’s algorithm)* (pp.13-16) 31 | - Inductive assertions (pp.16-18) 32 | 33 | - *2.3.1 Traversing Binary Trees* (pp.327-330) 34 | - *Algorithm I (Insertion into a threaded binary tree)* (p.327) 35 | - Similar trees and equivalent trees (pp.327-329) 36 | - *Algorithm C (Copy a binary tree)* (pp.329-330) 37 | 38 | **3:00 - 3:10** Break\ 39 | **3:10 - 4:00** 40 | - *Exercises* (pp.18-21, 330-334), MMIX Supplement (p.39) 41 | - Shoot the breeze 42 | 43 | **Note on MMIX and MIX** 44 | 45 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 46 | 47 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 48 | 49 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 50 | 51 | ## Chat Copy 52 | 53 | **Zartaj Majeed** 2:09 PM\ 54 | reading till 2:14 55 | 56 | **Zartaj Majeed** 2:16 PM\ 57 | if n >= 10, then 2^n > n^3 58 | 59 | **Zartaj Majeed** 2:19 PM\ 60 | (n + 1)^3 = n^3 + 3n^2 + 3n + 1 61 | 62 | **James Curran** 2:20 PM\ 63 | p(n+1) = n^2 + 5n + 4 is even\ 64 | p(n) = n\* (N+3) is even 65 | 66 | (n+1) * (n+4) is even 67 | 68 | n^2 +4n+n + 4 69 | 70 | **Zartaj Majeed** 2:23 PM\ 71 | n times (n + 3) is an even number 72 | 73 | **Zartaj Majeed** 2:28 PM\ 74 | n^2 + 3n + 2n + 4 75 | n(n + 3) + 2n + 4 76 | 77 | **Zartaj Majeed** 2:29 PM\ 78 | induction hypothesis says n(n + 3) is even\ 79 | so that plus 2n + 4 is even\ 80 | reading till 2:35 81 | 82 | **Zartaj Majeed** 2:39 PM\ 83 | reading till 2:46 84 | 85 | **Arthur O'Dwyer** 2:51 PM\ 86 | Searching "dijkstra discipline of programming pdf" turns up a (presumably pirate) PDF pretty easily. 87 | 88 | **James Curran** 2:54 PM\ 89 | P(1) = (1-a)^1 >= 1-a\ 90 | P(N+1) = (1-a)^(n+1) >= 1-A(N+1) 91 | 92 | **Zartaj Majeed** 2:57 PM\ 93 | rhs = 1 - n - a 94 | 95 | **James Curran** 2:57 PM\ 96 | P(n) = (1-a)^n >= 1-na 97 | 98 | **Michael Zalewski** 2:58 PM\ 99 | P(N) => (1-a)^n > 1 - na 100 | 101 | **Arthur O'Dwyer** 2:58 PM\ 102 | So we're multiplying the LHS by (1-a), which is to say we're subtracting LHS\*a from the LHS. But on the right we're subtracting a, which is to say 1\*a. And 1 >= LHS, so 1\*a >= LHS\*a, so the amount we're subtracting from the RHS is *no less than* the amount we're subtracting from the LHS. 103 | 104 | **Michael Zalewski** 2:58 PM\ 105 | (1-a)^n(1-a) > (1 - na)( 1 - a)\ 106 | (1-a)^(n+1) > (1 - na)(1 - a)\ 107 | (10a)^(n+1) > (1 - (n+1) + na^2 108 | 109 | **Michael Zalewski** 2:59 PM\ 110 | (10a)^(n+1) > (1 - (n+1)a + na^2\ 111 | (1-a)^(n+1) > (1 - (n+1)a + na^2 112 | 113 | **Michael Zalewski** 3:01 PM\ 114 | (1-a)^(n+1) > (1 - (n+1)a + na^2 > 1 - (n+1)a 115 | 116 | **Arthur O'Dwyer** 3:01 PM\ 117 | Completely off-topic, but the diagram for Exercise 8 reminds me of https://mathworld.wolfram.com/McGregorMap.html :) 118 | 119 | **Zartaj Majeed** 3:03 PM\ 120 | reading till 3:07 121 | 122 | **Zartaj Majeed** 3:05 PM\ 123 | threaded trees were introduced pp.322-323 124 | 125 | **Zartaj Majeed** 3:18 PM\ 126 | break till 3:28 127 | 128 | **Zartaj Majeed** 3:29 PM\ 129 | we're back 130 | 131 | **Zartaj Majeed** 3:32 PM\ 132 | exercise 17 on p.332 133 | how to find the the preorder successor of P 134 | 135 | **Zartaj Majeed** 3:33 PM\ 136 | preorder is node - left child - right child 137 | 138 | **Arthur O'Dwyer** 3:36 PM\ 139 | - If P has a left child, that's P\*. 140 | - Else if P has a right child, that's P\*. 141 | - Else let Q = P's right thread; then if Q has a right child, that's P\*. 142 | - Else let Q = Q's right thread; then if Q has a right child, that's P\*. 143 | - Else repeat that very last step. 144 | (I think.) 145 | 146 | **Zartaj Majeed** 3:39 PM\ 147 | reading till 3:46 148 | 149 | **James Curran** 3:57 PM\ 150 | I have another thing at 4PM, so I'm going to have to bow out now. See you next week. 151 | 152 | **Zartaj Majeed** 3:59 PM\ 153 | reading till 4:04 154 | 155 | **Arthur O'Dwyer** 4:00 PM\ 156 | p. 569, answer to exercise 24 157 | 158 | **Arthur O'Dwyer** 4:01 PM\ 159 | (A,B,(C,D,E)) and ((A,B,C),D,E) would both come out as 00,11,00,11,00 in in-order traversal\ 160 | but in preorder they'd be 11,00,11,00,00 and 11,11,00,00,00 respectively 161 | 162 | -------------------------------------------------------------------------------- /20201128_taocp_13_shellsort/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #13 - Shellsort (Chapter 5, Sorting: Section 5.2.1) 2 | 3 | Sorting by insertion! 4 | 5 | We'll begin with a quick introduction to the field of sorting and a mathematical definition of sorting using permutations that we missed covering in the previous meetup. 6 | 7 | Then we continue with another simple approach to sorting often used by card players when arranging a hand being dealt to them. It's also a natural choice when items arrive one by one and need to be kept in order. The technique presumes the list is already sorted and the new item can simply be inserted into its correct position. We look at couple algorithms to do this. 8 | 9 | First is Algorithm S (Straight insertion sort). It compares the new item successively with each item in the list moving the list till the correct position for the new item is found. We'll go over the MMIX Program S that implements this algorithm. 10 | 11 | The main cost in straight insertion sort is from possibly repeated movements of items in a sequential list (array). We discuss some ways to reduce this cost using binary insertion and two-way insertion. 12 | 13 | Shellsort is a kind of insertion sort that makes interesting choices for selecting the items of the list to compare. We'll study Algorithm D (Shellsort) and briefly discuss its performance. Knuth provides extensive analysis of Shellsort for interested readers. 14 | 15 | We'll work on some exercises. 16 | 17 | The bonus segment will have a demo of Program D (Shellsort) from The MMIX Supplement in the MMIX Visual Debugger. 18 | 19 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 20 | 21 | Keep the conversation going! 22 | 23 | Facebook: https://www.facebook.com/groups/678335496099220
24 | IRC ##taocp: https://webchat.freenode.net/##taocp 25 | 26 | **Date:** Saturday, 28 November 2020\ 27 | **Time:** 2-4pm America/New_York\ 28 | **Location:** Google Meet online 29 | 30 | ## Agenda 31 | 32 | **2:00 - 2:10** Meet and greet\ 33 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 5, Sorting* (along with *MMIX Supplement*) 34 | 35 | - *Preface* (pp.v-vii) 36 | 37 | - *5 Sorting* (pp.1-5) 38 | 39 | - *5.2.1 Sorting by Insertion* (pp.80-85) 40 | 41 | - *Straight insertion* (p.80) 42 | - *Algorithm S (Straight insertion sort)* (pp.80-81) 43 | - *Program S (Straight insertion sort)*, MMIX Supplement (p.xi, p.76) 44 | - *Binary insertion and two-way insertion* (pp.82-83) 45 | - *Shell's method* (pp.83-84) 46 | - *Algorithm D (Shellsort)* (pp.84-85) 47 | 48 | **3:00 - 3:10** Break\ 49 | **3:10 - 4:00** 50 | - *Exercises* (pp.102-105), MMIX Supplement (pp.80-81) 51 | - Shoot the breeze 52 | 53 | **Bonus Segment** 54 | 55 | Stepthru in MMIX Visual Debugger 56 | 57 | - *Program S (Straight insertion sort)*, MMIX Supplement (p.76) 58 | - *Program D (Shellsort)*, MMIX Supplement (pp.77-78) 59 | 60 | **Note on MMIX and MIX** 61 | 62 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 63 | 64 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 65 | 66 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 67 | 68 | ## Chat Copy 69 | 70 | **Zartaj Majeed** 2:10 PM\ 71 | reading till 2:13 72 | 73 | **Zartaj Majeed** 2:16 PM\ 74 | reading till 2:21 75 | 76 | **Zartaj Majeed** 2:36 PM\ 77 | reading till 2:43 78 | 79 | **Arthur O'Dwyer** 2:37 PM\ 80 | I just googled up this manual on the LARC Scientific Compiler, since I didn't really understand that anecdote as well as I'd like to. http://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-9-pdf/k-9-u2226-LARC-scientific-compiler.pdf
81 | I confirm that the note on the first page is written in Knuth's handwriting. :) 82 | 83 | **Arthur O'Dwyer** 2:40 PM\ 84 | On the difference between "insertion sort" and "bubble sort", I found this extremely enlightening (although I'll forget it again in a minute): https://stackoverflow.com/a/17271911/1424877 85 | 86 | **Zartaj Majeed** 2:43 PM\ 87 | thanks Arthur - this will certainly help make more sense of Knuth's description of LARC 88 | 89 | **Arthur O'Dwyer** 2:48 PM\ 90 | It looks to me like the colon in Table 1 is the "sorted up to here" point, and the caret underneath is the "here's the insertion point" point. 91 | 92 | **Zartaj Majeed** 2:51 PM\ 93 | reading till 2:58 94 | 95 | **Arthur O'Dwyer** 2:57 PM\ 96 | On page 82, do we implicitly assume that "A" and "B" are independent of each other? Is their independence mathematically obvious? And/or is there some deep mathematical reason that they don't need to be independent? 97 | 98 | **Arthur O'Dwyer** 3:07 PM\ 99 | H_N 100 | 101 | **Zartaj Majeed** 3:09 PM\ 102 | break till 3:20 103 | 104 | **Michael Zalewski** 3:16 PM\ 105 | I guess Hn is the Harmonic Number. H1 = 1, H2 = 1 + 1/2, H3 = 1 + 1/2 + 1/3. Defined on page 101 106 | 107 | **Zartaj Majeed** 3:17 PM\ 108 | yes - Volume 1, 1.2.7 Harmonic Numbers 109 | 110 | **Zartaj Majeed** 3:20 PM\ 111 | we're back 112 | 113 | **Zartaj Majeed** 3:21 PM\ 114 | reading till 3:24 115 | 116 | **Arthur O'Dwyer** 3:24 PM\ 117 | I failed to google any information on the IBM 705 "tumble" instruction. But I did learn that some IBM printers use the term "tumble duplex" to describe double-sided printing where the binding goes at the top edge instead of the side. :P 118 | 119 | **Zartaj Majeed** 3:25 PM\ 120 | reading till 3:30 121 | 122 | **Zartaj Majeed** 3:32 PM\ 123 | referring to Table 3 124 | 125 | **Zartaj Majeed** 3:41 PM\ 126 | reading till 3:48 127 | 128 | **Zartaj Majeed** 3:50 PM\ 129 | exercise 1 130 | 131 | **Arthur O'Dwyer** 3:59 PM\ 132 | Hmm. 133 | a[0]=3, a[1]=0, a[3]=1, a[4]=1, a[7]=4, a[10]=2, ...\ 134 | appears to be 7-ordered, but 3-sorting it produces a[1]=0, a[4]=1, a[7]=2, a[10]=4, ... 135 | 136 | **Zartaj Majeed** 4:05 PM\ 137 | MMIX source for Algorithm S (Straight insertion sort): https://github.com/theartofcomputerprogramming/mmixsamples/blob/master/program_s_straight_insertion_sort.mms 138 | 139 | **Jolene D** 4:09 PM\ 140 | also dropping off now, thanks all and see you next time! 141 | 142 | **Michael Zalewski** 4:29 PM\ 143 | Thanks Zartaj 144 | 145 | -------------------------------------------------------------------------------- /20210109_taocp_18_radixsort/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #18 - Radix Sort (Chapter 5, Sorting: Section 5.2.5) 2 | 3 | Sorting is sorted out! (for now...) 4 | 5 | We'll take a break from sorting after this meetup. We wrap up sorting by merging by questioning the need for twice the amount of memory as required for the array of keys. This motivates a variant of mergesort using link fields called Algorithm L (List merge sort). There is an interesting use of links serving dual purposes that is somewhat specific to the old MIX machine. As such we also need to look at the MMIX version of Algorithm L (List merge sort) in The MMIX Supplement. It, on the other hand, relies on the MMIX feature of an address being implicitly aligned to the word type of the instruction, e.g. `LDTU` ignores the low 2 bits of the address when loading a tetrabyte (4 bytes). 6 | 7 | The final section is on sorting by distribution. This technique expands on the basic sorting by counting method we covered in section 5.2. There is quite a bit of discussion of this approach and its applicability to various types of data. We go over Algorithm R (Radix list sort), its MMIX implementation and analysis. 8 | 9 | This meetup marks the end of our first pass through Volume 3 of TAOCP. The next few meetups will be on data structures from Volume 1. There is a lot to still learn about lists, arrays and trees from TAOCP. It will all stand us in good stead when we return to Volume 3 for more sorting (and searching) ... 10 | 11 | We'll do some exercises. 12 | 13 | The bonus segment will include a debugger stepthru of Program L (List merge sort) from The MMIX Supplement. 14 | 15 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 16 | 17 | Keep the conversation going! 18 | 19 | Facebook: https://www.facebook.com/groups/678335496099220
20 | IRC ##taocp: https://webchat.freenode.net/##taocp 21 | 22 | **Date:** Saturday, 9 January 2021\ 23 | **Time:** 2-4pm America/New_York\ 24 | **Location:** Google Meet online 25 | 26 | ## Agenda 27 | 28 | **2:00 - 2:10** Meet and greet\ 29 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 5, Sorting* (along with *MMIX Supplement*) 30 | 31 | - *5.2.4 Sorting by Merging* (pp.163-166) 32 | - List merge sort (pp.163-164) 33 | - *Algorithm L (List merge sort)* (pp.164-165), MMIX Supplement (pp.89-90) 34 | - *Program L (List merge sort)*, MMIX Supplement (pp.90-92) 35 | - Analysis of Program L, MMIX Supplement (p.92) 36 | 37 | - *5.2.5 Sorting by Distribution* (pp.168-177) 38 | - Sorting by Distribution (pp.168-171) 39 | - *Algorithm R (Radix list sort)* (pp.171-172) 40 | - *Algorithm H (Hooking-up of queues)* (pp.172-173) 41 | - *Program R (Radix list sort)*, MMIX Supplement (pp.93-94) 42 | - Analysis of Algorithm R (pp.174-177), MMIX Supplement (pp.93-94) 43 | 44 | **3:00 - 3:10** Break\ 45 | **3:10 - 4:00** 46 | - *Exercises* (pp.166-168, 177-179), MMIX Supplement (pp.92, 94) 47 | - Shoot the breeze 48 | 49 | **Bonus Segment** 50 | 51 | Stepthru in MMIX Visual Debugger 52 | 53 | - *Program L (List merge sort)*, MMIX Supplement (pp.90-92) 54 | 55 | **Note on MMIX and MIX** 56 | 57 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 58 | 59 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 60 | 61 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 62 | 63 | ## Chat Copy 64 | 65 | **Arthur O'Dwyer** 2:09 PM\ 66 | I may end up nerdsniped by this: https://www-cs-faculty.stanford.edu/~knuth/pi_hamilton_maze.png 67 | 68 | **Zartaj Majeed** 2:12 PM\ 69 | reading till 2:19 70 | 71 | **Zartaj Majeed** 2:53 PM\ 72 | reading till 2:58 73 | 74 | **Arthur O'Dwyer** 2:57 PM\ 75 | Btw, my internet seems to be really bad today (Hangouts keeps blacking out your video feeds due to lack of bandwidth), but I hope my own speech is still coming through okay. 76 | 77 | **Zartaj Majeed** 2:58 PM\ 78 | audio has been fine Arthur 79 | 80 | **Zartaj Majeed** 3:04 PM\ 81 | reading till 3:07 82 | 83 | **Zartaj Majeed** 3:07 PM\ 84 | break till 3:17 85 | 86 | **Arthur O'Dwyer** 3:09 PM\ 87 | Btw, in the "execution counts" column, I notice that C = C'+C'', and B=B'+B''. In case that helps anyone's intuition. 88 | 89 | **Zartaj Majeed** 3:18 PM\ 90 | we're back 91 | GNU sort has this note in its TODO file about trying out Algorithm L (List merge sort): https://github.com/coreutils/coreutils/blob/master/TODO#:~:text=sort:%20Investigate%20better%20sorting%20algorithms%3b%20see%20Knuth%20vol.%203 92 | 93 | **Arthur O'Dwyer** 3:19 PM\ 94 | https://github.com/coreutils/coreutils/commit/93f9ffc6141ad028223a33e5ab0614aebbd4aa2e 95 | 96 | **Zartaj Majeed** 3:20 PM\ 97 | reading till 3:27 98 | 99 | **Arthur O'Dwyer** 3:23 PM\ 100 | "Turn the deck face down and deal again, this time into four piles for the four suits. (Again you turn the cards face up as you deal them.)"\ 101 | For someone so concerned with constant factors, I'm surprised at Knuth here. ;) Surely it would be faster to leave the deck face-up during the whole process (and stack the 13 piles in the opposite order). 102 | 103 | **Arthur O'Dwyer** 3:24 PM\ 104 | Speaking of algorithmic card tricks, here's one I just recently learned of. Totally off-topic of course. https://www.vanishingincmagic.com/blog/the-gilbreath-principle 105 | 106 | **Arthur O'Dwyer** 3:29 PM\ 107 | "The desired sum of products is easily seen to be..." — Knuth doesn't say so, but the point of this rigmarole is to minimize the number of integer multiplications that we have to do: from number-of-cards number of multiplications (maybe hundreds or thousands) down to like 30 multiplications. 108 | 109 | **Zartaj Majeed** 3:36 PM\ 110 | reading till 3:43 111 | 112 | **Arthur O'Dwyer** 3:43 PM\ 113 | The [square brackets] in the MIX version of Program R indicate self-modifying code. Good times. 114 | 115 | **Zartaj Majeed** 3:48 PM\ 116 | reading till 3:51 117 | 118 | **Zartaj Majeed** 3:53 PM\ 119 | reading till 4:00 120 | 121 | **Zartaj Majeed** 4:02 PM\ 122 | nice table summarizing performance of sorting algorithms on p.382 (MMIX Supplement p.96) 123 | 124 | **Zartaj Majeed** 4:03 PM\ 125 | exercise 5.2.5.4 126 | 127 | **Miguel Angel Iglesias** 4:08 PM\ 128 | I'm dropping off, I am so sleepy I can barely think 129 | 130 | **Zartaj Majeed** 4:09 PM\ 131 | exercise 5.2.5.8 132 | 133 | -------------------------------------------------------------------------------- /20210116_taocp_19_trees/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #19 - Trees (Chapter 2, Information Structures: Section 2.3) 2 | 3 | Return to the forest! 4 | 5 | We're back in Volume 1 of TAOCP, Fundamental Algorithms. We'll try to cover most of what remains on data structures in Volume 1 before continuing with sorting and searching in Volume 3 6 | 7 | We begin with section 2.3 Trees that introduces the concept of trees. There's much terminology and examples of different kinds of trees. 8 | 9 | The next section 2.3.1 Traversing Binary Trees looks at the highly important category of binary trees. We consider the different ways to visit the nodes of a binary tree - inorder, preorder and postorder. We'll go over Algorithm T for inorder traversal of a binary tree. Then we look at Algorithm S that improves on Algorithm T by adding special links called threads to a basic binary tree turning it into a threaded binary tree. 10 | 11 | Knuth has published extensively on trees - and still does. Here's a preprint from just last year https://www-cs-faculty.stanford.edu/~knuth/papers/fibonacci-matchings.pdf - Trees have been a favorite topic for his annual Christmas Lectures. 12 | 13 | By the way, his most recent preprint was on New Year's Day just a few days ago! https://www-cs-faculty.stanford.edu/~knuth/papers/amazing.pdf 14 | 15 | I'm very excited to follow his development of the foundations of this fundamental data structure. 16 | 17 | We'll do some exercises. 18 | 19 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 20 | 21 | Keep the conversation going! 22 | 23 | Facebook: https://www.facebook.com/groups/678335496099220
24 | IRC ##taocp: https://webchat.freenode.net/##taocp 25 | 26 | **Date:** Saturday, 16 January 2021\ 27 | **Time:** 2-4pm America/New_York\ 28 | **Location:** Google Meet online 29 | 30 | ## Agenda 31 | 32 | **2:00 - 2:10** Meet and greet\ 33 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 2, Information Structures* (along with *MMIX Supplement*) 34 | 35 | - *2.3 Trees* (pp.308-316) 36 | - Trees and forests (pp.308-311) 37 | - Binary trees and Lists (pp.312-316) 38 | 39 | - *2.3.1 Traversing Binary Trees* (pp.318-326) 40 | - Preorder, inorder and postorder traversal (pp.318-320) 41 | - *Algorithm T (Traverse binary tree in inorder)* (pp.320-321) 42 | - Threaded tree representation (pp.322-323) 43 | - *Algorithm S (Symmetric (inorder) successor in a threaded binary tree)* (pp.323-324), MMIX Supplement (p.37) 44 | - *Program T (Traverse binary tree in inorder)*, MMIX Supplement (pp.37-38) 45 | - *Program S (Symmetric (inorder) successor in a threaded binary tree)*, MMIX Supplement (p.38) 46 | - Analysis of Programs T and S (p.326) 47 | 48 | **3:00 - 3:10** Break\ 49 | **3:10 - 4:00** 50 | - *Exercises* (pp.316-318, 330-334), MMIX Supplement (p.39) 51 | - Shoot the breeze 52 | 53 | **Note on MMIX and MIX** 54 | 55 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 56 | 57 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 58 | 59 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 60 | 61 | ## Chat Copy 62 | 63 | 64 | **Zartaj Majeed** 2:18 PM\ 65 | reading till 2:23 66 | 67 | **Arthur O'Dwyer** 2:21 PM\ 68 | "plane trees" har har 69 | 70 | **Zartaj Majeed** 2:32 PM\ 71 | reading till 2:37 72 | 73 | **Arthur O'Dwyer** 2:34 PM\ 74 | Page 312: I don't really get the significance of "...Figure 20(a) essentially represents Figure 19 as an _oriented_ tree..." — is it "oriented" in the sense that we can now talk about D being "to the left of" F? But in what sense did Figure 19 lack that kind of orientedness? 75 | 76 | **Zartaj Majeed** 2:36 PM\ 77 | oriented means ordering is unimportant 78 | 79 | **Zartaj Majeed** 2:38 PM\ 80 | Fig 19 displays an ordering of the subtrees - to me that means it is not oriented 81 | 82 | **Arthur O'Dwyer** 2:41 PM\ 83 | Ah, I infer from page 396 that "oriented tree" means a depiction of the tree with its root *labeled*; as opposed to an unoriented tree which would be like a matchstick figure laid out in the middle of a circular table with the root unmarked. 84 | 85 | **Zartaj Majeed** 3:01 PM\ 86 | reading till 3:06 87 | 88 | **Zartaj Majeed** 3:15 PM\ 89 | break till 3:16 90 | 91 | **Zartaj Majeed** 3:17 PM\ 92 | we're back 93 | 94 | **Zartaj Majeed** 3:24 PM\ 95 | reading till 3:31 96 | 97 | **Arthur O'Dwyer** 3:35 PM\ 98 | The reference to "coroutines" made me wonder whether there would be some neat way to combine Algorithm T with C++20 `co_await`. I think not, though. Here's a plain old C++ version though. https://godbolt.org/z/hfej5q 99 | 100 | **Zartaj Majeed** 3:40 PM\ 101 | Welcome Michael Lane! 102 | 103 | **Michael Lane** 3:40 PM\ 104 | Internet is working ;D 105 | 106 | **Zartaj Majeed** 3:42 PM\ 107 | glad to hear - chime in whenever you like 108 | 109 | **Zartaj Majeed** 3:54 PM\ 110 | reading till 3:59 111 | 112 | **Miguel Angel Iglesias** 3:54 PM\ 113 | I got to drop off, too early, see you next week 114 | 115 | **Arthur O'Dwyer** 3:57 PM\ 116 | The page numbers on your slide must be wrong — reading up to Algorithm S, I'm assuming? 117 | 118 | **Zartaj Majeed** 3:58 PM\ 119 | yes Arthur 120 | 121 | **Zartaj Majeed** 3:59 PM\ 122 | pp.320-323 because of Fig 24 123 | 124 | **Michael Lane** 4:03 PM\ 125 | Is it dumb to think the author is introducing some chirality to these trees? In terms of whether LLink(x) and RLink(x) in are successor precessor. 126 | 127 | **Zartaj Majeed** 4:07 PM\ 128 | let's discuss a little earlier - say at 4:10 129 | 130 | **Arthur O'Dwyer** 4:08 PM\ 131 | Algorithm S ("find successor in order") isn't really a counterpart to Algorithm T ("traverse all nodes in order"); it's a counterpart to *one small piece of* Algorithm T.\ 132 | There is an "Algorithm S-prime" for use with non-threaded trees: 133 | - Is RLINK(P) non-null? If so, set Q to RLINK(P), and then as long as LLINK(Q) is non-null, set Q to LLINK(Q). 134 | - Otherwise, you're out of luck, give up. 135 | 136 | **Arthur O'Dwyer** 4:13 PM\ 137 | I've got to drop off. Welcome @Michael Lane btw! 138 | 139 | **Zartaj Majeed** 4:13 PM\ 140 | Thanks Arthur 141 | 142 | **Zartaj Majeed** 4:15 PM\ 143 | LOC(T) is the address in memory of T\ 144 | location of T 145 | 146 | **Michael Lane** 4:21 PM\ 147 | What edition are you guys doing? :D\ 148 | 3rd :D 149 | 150 | **Michael Lane** 4:23 PM\ 151 | This one: https://gatech.bncollege.com/shop/gatech/textbook/algorithms 152 | 153 | -------------------------------------------------------------------------------- /20210213_taocp_23_polynomials_as_trees/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #23 - Polynomials As Trees (Chapter 2, Information Structures: Sections 2.3.3, 2.3.4.5) 2 | 3 | Trees above! Trees to the left! Trees to the right! Trees below???? 4 | 5 | We examine more complex representations of trees. A particular doubly linked ring structure is applied to the problem of arithmetic on polynomials. 6 | 7 | We have previously seen algorithms for polynomial addition and multiplication using circular lists. Those however were limited to polynomials in three or four variables. 8 | 9 | We close out section 2.3.3 Other Representations of Trees with Algorithm A (Addition of polynomials) that works for polynomials in any number of variables. The algorithm illustrates traversal, insertion, and deletion in a four-way-linked tree. 10 | 11 | Then we jump to section 2.3.4.5 Path length. We look at extended binary trees that insure every node of the original tree has two children. This is used to establish some results on path lengths in binary trees that are generalized to ternary, quaternary and higher-order trees. 12 | 13 | Finally we consider associating weights with the nodes of a tree and look at Huffman's method for finding a tree with minimum weighted path length. 14 | 15 | We'll do some exercises 16 | 17 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 18 | 19 | Keep the conversation going! 20 | 21 | Facebook: https://www.facebook.com/groups/678335496099220
22 | IRC ##taocp: https://webchat.freenode.net/##taocp 23 | 24 | **Date:** Saturday, 13 February 2021\ 25 | **Time:** 2-4pm America/New_York\ 26 | **Location:** Google Meet online 27 | 28 | ## Agenda 29 | 30 | **2:00 - 2:10** Meet and greet\ 31 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 2, Information Structures* (along with *MMIX Supplement*) 32 | 33 | - *2.3.3 Other Representations of Trees* (pp.355-359) 34 | - Ring structures (pp.355-357) 35 | - *Algorithm A (Addition of polynomials)* (pp.357-359), MMIX Supplement (pp.43-44) 36 | 37 | - *2.3.4.5 Path length* (pp.399-404) 38 | - Extended binary tree (pp.399-400) 39 | - Internal and external path lengths (p.400) 40 | - Complete binary trees and higher-order trees (pp.401-402) 41 | - Huffman's method for weighted path lengths (pp.402-404) 42 | 43 | **3:00 - 3:10** Break\ 44 | **3:10 - 4:00** 45 | - *Exercises* (pp.359-362, 404-406) 46 | - Shoot the breeze 47 | 48 | **Note on MMIX and MIX** 49 | 50 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 51 | 52 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 53 | 54 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 55 | 56 | ## Chat Copy 57 | 58 | **Zartaj Majeed** 2:19 PM\ 59 | reading till 2:26 60 | 61 | **Arthur O'Dwyer** 2:20 PM\ 62 | This is your weekly reminder that Knuth uses "Λ" to mean "null pointer" :) 63 | 64 | **Miguel Angel Iglesias** 2:21 PM\ 65 | this Λ means "null" btw 66 | 67 | **Zartaj Majeed** 2:22 PM\ 68 | don't worry about thread versus unthreaded trees here\ 69 | but later you can find threaded trees defined on p.322 70 | 71 | **Shreevatsa R** 2:31 PM\ 72 | I think "CV" may stand for "either a Constant or the Variable name" 73 | 74 | **Arthur O'Dwyer** 2:35 PM\ 75 | In a sense, Miguel, our DOWN and RIGHT here are playing the role of LLINK and RLINK in the "corresponding binary tree" stuff.\ 76 | DOWN points to my eldest child; RIGHT points to my next-youngest sibling. 77 | 78 | **Arthur O'Dwyer** 2:41 PM\ 79 | (And I said "LLINK and RLINK," but we even saw one place last week where Knuth calls them "LCHILD and RLINK". Here he's calling them "DOWN and RIGHT".) 80 | 81 | **Shreevatsa R** 2:42 PM\ 82 | If I understand correctly, the idea is that the given polynomial\ 83 | 3 + x^2 + xyz + z^3 - 3xz^3\ 84 | can be written out as a polyomial in z, namely\ 85 | z^0(3 + x^2) + z^1(xy) + z^3(1 - 3x)\ 86 | and these 3 polynomials (namely 3+x^2, xy, and 1-3x) are the 3 "children" of the root node, themselves represented (recursively) using the same representation. 87 | 88 | **Arthur O'Dwyer** 2:42 PM\ 89 | :+1: 90 | 91 | **Zartaj Majeed** 2:44 PM\ 92 | reading till 2:50\ 93 | That's great Shreevatsa! These comments are immensely useful for viewers of the recordings! 94 | 95 | **Zartaj Majeed** 2:49 PM\ 96 | AVAIL is the free memory allocator\ 97 | R <= AVAIL means allocate a node and assign to R 98 | 99 | **Arthur O'Dwyer** 2:50 PM\ 100 | "Before and after diagrams" are explained a bit on page 260. 101 | 102 | **Zartaj Majeed** 2:50 PM\ 103 | AVAIL <= R means free the node or return node to memory pool\ 104 | read another couple minutes 105 | 106 | **Zartaj Majeed** 2:54 PM\ 107 | can we try adding the examples he gives? 108 | 109 | **Zartaj Majeed** 2:55 PM\ 110 | 3 + x^2 + x * y * z + z^3 − 3 * x * z^3 111 | 112 | **Zartaj Majeed** 2:56 PM\ 113 | (x * y) − (x^2) − (x * y * z) − (z^3) + (3 * x * z^3) 114 | 115 | **Zartaj Majeed** 3:00 PM\ 116 | z^0 * (( x * y) - (x^2)) + z^1 * ( (-1) * (x * y) ) + z^3 * ( (-1) + (3 * x)) 117 | 118 | **Zartaj Majeed** 3:10 PM\ 119 | break till 3:20 120 | 121 | **Shreevatsa R** 3:14 PM\ 122 | https://imgur.com/SLdjLnE 123 | 124 | **Arthur O'Dwyer** 3:18 PM\ 125 | Here's mine. Let's see if they match! https://i.imgur.com/VUONGNm.jpg 126 | 127 | **Arthur O'Dwyer** 3:19 PM\ 128 | Three places near the bottom left: My understanding is that EXP(DOWN(x)) must invariably be zero (when DOWN(x) is not Λ).\ 129 | Other than that, we match. 130 | 131 | **Shreevatsa R** 3:20 PM\ 132 | yeah, looks like the difference is I left out the (0, 0) nodes... I think I'm missing why are they needed 133 | 134 | **Zartaj Majeed** 3:21 PM\ 135 | we're back 136 | 137 | **Michael Zalewski** 3:21 PM\ 138 | You need the 0,0 nodes to define the part of the polynomial that does not include the parent's variable 139 | 140 | **Shreevatsa R** 3:22 PM\ 141 | ah yes, makes sense, thanks 142 | 143 | **Miguel Angel Iglesias** 3:53 PM\ 144 | I fear we used up too much time in this algorithm, I fail to see its significance, other than as an example of what can be done with a circular Tree, the next section we were going to talk about, Path Length seems way more relevant 145 | 146 | **Zartaj Majeed** 3:54 PM\ 147 | true Miguel - we will be sure to continue with path length next Saturday 148 | 149 | **Shreevatsa R** 3:58 PM\ 150 | The page does say "Our main interest in Algorithm A is the way it typifies manipulations on trees with many links." ... so it's indeed intended as an example mainly I think 151 | 152 | **Zartaj Majeed** 3:59 PM\ 153 | it looks liike P + Q = 3 + x y 154 | 155 | **Shreevatsa R** 4:13 PM\ 156 | Funnily the page also says "In Chapter 8 we will consider another format for polynomial representation [...] with significant advantages of conceptual simplicity..." and Chapter 8 (yet to be published) is Recursion, so this probably refers to a more straightforward recursive representation way we might think of implementing (multi-variable) polynomial addition today 157 | 158 | **Arthur O'Dwyer** 4:13 PM\ 159 | 3 + xx + xyz + zzz + 3xzzz\ 160 | \+ xy - xx - xyz - zzz + 3xzzz\ 161 | should have produced "3 + xy + 6xzzz", I guess 162 | 163 | -------------------------------------------------------------------------------- /20201003_taocp_5_mmix_problem_fest/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #5 - MMIX Problem Fest 2 | 3 | **Date:** Saturday, 3 October 2020\ 4 | **Time:** 2-4pm America/New_York\ 5 | **Location:** Google Meet online 6 | 7 | ## Agenda 8 | 9 | **2:00 - 2:10** Meet and greet\ 10 | **2:10 - 3:00** *Exercises* (pp.24-28) for topics from *Fascicle 1, MMIX* (corresponding to *Chapter 1, Basic Concepts*) 11 | 12 | - *1.3.1' Description of MMIX* (pp.8-12) 13 | 14 | - *Bits and bytes* (pp.2-4) 15 | - *Memory and registers* (pp.4-5) 16 | - *Instructions* (pp.5-6) 17 | - *Loading and storing* (pp.6-8) 18 | - *Arithmetic operators* (pp.8-9) 19 | - *Conditional instructions* (p.10) 20 | - *Bitwise operations* (pp.10-11) 21 | - *Bytewise operations* (pp.11-12) 22 | 23 | **3:00 - 3:10** Break\ 24 | **3:10 - 4:00** 25 | - Continue *Exercises* (pp.24-28) 26 | - Shoot the breeze 27 | 28 | MMIX exercises galore! 29 | 30 | We've covered the bulk of instructions for the **MMIX** computer. We've tried out some examples in the MMIX Visual Debugger. But nothing like working on a lot of problems to truly strengthen our grasp of the material. This event is an opportunity to deepen our understanding of **MMIX**. Equally we want to share our work with the group and help others with any questions. It's also a chance for anyone who missed a session on **MMIX** to catch up. 31 | 32 | We're dedicating the full two hours to solving exercises from *Fascicle 1, MMIX*. The format is rather free-form. A restricted Google Doc with many exercises is now available on request for members to work in and collaborate with the group. We'll work collectively and individually in parallel to attempt as many exercises as possible. And share solutions or partial work with everyone. Afterwards all our work will be posted to the meetup's Github repos for notes and exercises. 33 | 34 | It's better to not look at the answers to exercises. Instead members are encouraged to ask questions and enter any comments into the shared doc or in the chat panel. Every note that reflects genuine individual thought could be useful to people who come across the notes in the future. 35 | 36 | ## Chat Copy 37 | 38 | **Zartaj Majeed** 2:04 PM\ 39 | Question: What website do you like for problem solving? 40 | 41 | **Arthur O'Dwyer** 2:05 PM\ 42 | I'd suggest Google's yearly "Advent of Code", and StackExchange (puzzling.SE, plus regular StackOverflow). 43 | 44 | **Miguel Iglesias** 2:09 PM\ 45 | https://www.chegg.com/ 46 | 47 | **Arthur O'Dwyer** 2:13 PM\ 48 | I haven't watched this video yet, but for those interested in recent Knuth interviews, https://www.youtube.com/watch?v=O5g4Zl8ppQA just happened on Sept 21. 49 | 50 | **Deepa Annamalai** 2:14 PM\ 51 | question is not visible 52 | yes 53 | 54 | **Deepa Annamalai** 2:24 PM\ 55 | take them like 4 as a set and convert? 56 | 57 | **Miguel Iglesias** 2:24 PM\ 58 | +1 59 | 60 | **Arthur O'Dwyer** 2:25 PM\ 61 | So that number is (0)111'1101'1001 in sets of four 62 | 63 | **Zartaj Majeed** 2:26 PM\ 64 | 0xfd9 65 | 66 | **Deepa Annamalai** 2:26 PM\ 67 | FD9 68 | it is not F 69 | 70 | **Arthur O'Dwyer** 2:27 PM\ 71 | 0x1000 would be 2^12, which is 4096 72 | 73 | **Deepa Annamalai** 2:27 PM\ 74 | there are three 1's\ 75 | 111-1101-1001 76 | 77 | **Zartaj Majeed** 2:28 PM\ 78 | 0x7d9 79 | 80 | **Arthur O'Dwyer** 2:28 PM\ 81 | Just like in decimal: 000123 is the same number as 123. 82 | 83 | **Deepa Annamalai** 2:29 PM\ 84 | hex because it is 8 bit is one byte ? 85 | 86 | **Arthur O'Dwyer** 2:30 PM\ 87 | https://en.wikipedia.org/wiki/Hexadecimal#History_of_written_representations 88 | 89 | **Deepa Annamalai** 2:33 PM\ 90 | 11 - A in hexa and 65 in ASCII 91 | 92 | **Deepa Annamalai** 2:34 PM\ 93 | they are consecutive from 65 onwards and 97 is lower case a 94 | 95 | **Deepa Annamalai** 2:36 PM\ 96 | sorry i did not get it ...why there are 6 empty 90 to 97...i know this is not relevant 97 | 98 | **Arthur O'Dwyer** 2:37 PM\ 99 | To lowercase "A", just bitwise-OR it with 32 (0x20).\ 100 | To uppercase 'a', just bitwise-XOR it with 32 (0x20). 101 | 102 | **Deepa Annamalai** 2:37 PM\ 103 | oh ok. 104 | 105 | **Arthur O'Dwyer** 2:38 PM\ 106 | So, in order to get a displacement of exactly 32 (0x20) between 'A' and 'a', we must have six other characters filling in the gap between 'Z' and 'a'. 107 | 108 | **Arthur O'Dwyer** 2:40 PM\ 109 | Note: TEtRA, PEnTA, hEXA. 110 | 111 | **Arthur O'Dwyer** 2:42 PM\ 112 | After those three the system starts getting a bit strained: zetta, yotta. And then it seems to stop (for now). 113 | 114 | **Arthur O'Dwyer** 2:45 PM\ 115 | Knuth is surprisingly non-rigorous here. This is all he seems to have to say about what he means by s(x) throughout this whole section: "Here s(x) denotes the signed integer corresponding to the bit pattern x, according to the conventions of two's complement notation." 116 | 117 | **Deepa Annamalai** 2:46 PM\ 118 | this is a maths exercise ...so prove it with maths way 119 | 120 | **Miguel Iglesias** 2:52 PM\ 121 | have you tried the Whiteboard?\ 122 | perhaps we should try it? 123 | 124 | **Zartaj Majeed** 2:52 PM\ 125 | s(alpha) = alpha if high bit is 0\ 126 | s(alpha) = alpha - 2^n if high bit is 1\ 127 | u(alpha) = alpha 128 | 129 | **Arthur O'Dwyer** 2:56 PM\ 130 | Re Miguel's question, the intuition here is that 111 in binary is 7 = (2^3 - 1); 1111 in binary is 15 = 2^4 - 1; 11111 in binary is 31 = 2^5 - 1; and so on. The number 2^n is always one greater than the maximum possible value of an n-bit binary number. 131 | 132 | **Zartaj Majeed** 2:58 PM\ 133 | 0111 => s(0111) = 7\ 134 | u(0111) = 7\ 135 | 1001 => u(1001) = 9\ 136 | s(1001) = ? 137 | 138 | **Zartaj Majeed** 2:59 PM\ 139 | 9 - 2^4 = 9 - 16 140 | -7 141 | 142 | **Zartaj Majeed** 3:01 PM\ 143 | x - u(alpha) is divisible by 2^n 144 | 145 | **Zartaj Majeed** 3:02 PM\ 146 | any takers for #6? 147 | 148 | **Deepa Annamalai** 3:04 PM\ 149 | ex.: 7 --> 0111 150 | 151 | negation -> 1000 152 | 153 | add 1\ 154 | \_---------\ 155 | 1001 156 | 157 | 158 | compliment not negation 159 | 160 | **Arthur O'Dwyer** 3:04 PM\ 161 | Sorry for my disappearance. I'll be back at... well, 3:14. :) 162 | 163 | **Zartaj Majeed** 3:04 PM\ 164 | yes - 3:14 165 | 166 | **Arthur O'Dwyer** 3:14 PM\ 167 | For problem 7, here's the actual definition of the LDHT and STHT instructions:\ 168 | LDHT $X, $Y, $Z (load high tetra): u($X) ← u(M4[A]) × 2^32\ 169 | STHT $X,$Y,$Z (store high tetra): u(M4[A]) ← ⌊u($X)/2^32⌋. 170 | 171 | **Zartaj Majeed** 3:15 PM\ 172 | we're back 173 | 174 | **Miguel Iglesias** 3:18 PM\ 175 | brb 176 | 177 | **Arthur O'Dwyer** 3:24 PM\ 178 | If we use f($Y) to denote the real number between 0 and 1, we have basically s($Y) = 2^64 * f($Y).\ 179 | If we're multiplying s($Z) * f($Y), the result is going to be something between 0 and 2^64. So that means the radix point must be 64 bits from the left (which is also 64 bits from the right). 180 | 181 | **Miguel Iglesias** 3:25 PM\ 182 | remind me what a "radix point is"? 183 | 184 | **Arthur O'Dwyer** 3:25 PM\ 185 | Decimal point. But in a base that's not decimal. 186 | 187 | **Arthur O'Dwyer** 3:36 PM\ 188 | (-2^63) divided by (-1) mathematically comes out to (2^63), but that overflows -- we get (0) as the answer, and signal overflow. 189 | 190 | **Deepa Annamalai** 3:37 PM\ 191 | btw where are the answers 192 | 193 | **Arthur O'Dwyer** 3:37 PM\ 194 | I have answers in my ebook, near the end. 195 | 196 | **Deepa Annamalai** 3:38 PM\ 197 | oh ok thank yoh 198 | you 199 | 200 | **Arthur O'Dwyer** 3:42 PM\ 201 | s($X) * s($Y) is (u($X) maybe minus 2^64) * (u($Y) maybe minus 2^64)\ 202 | which should always be congruent to u($X) * u($Y) modulo 2^64 203 | 204 | **Arthur O'Dwyer** 3:44 PM\ 205 | $Y / 0xFFFFFFFFFFFFFFFFF != $Y / (-1) 206 | 207 | **Miguel Iglesias** 3:45 PM\ 208 | I need to sign off, thanks guy! 209 | 210 | **Arthur O'Dwyer** 3:46 PM\ 211 | I happen to know that "there is a carry" if and only if "the sum is smaller than (either) one of the inputs." 212 | 213 | **Arthur O'Dwyer** 3:58 PM\ 214 | I notice that 25 = 16 + 8 + 1. 215 | 216 | **Arthur O'Dwyer** 4:01 PM\ 217 | 2ADDU $0, $Y, $Y // 2y+y\ 218 | 8ADDU $X, $0, $Y // 8(2y+y)+y 219 | 220 | **Deepa Annamalai** 4:03 PM\ 221 | Thank you. I need to sign off 222 | 223 | **Arthur O'Dwyer** 4:03 PM\ 224 | When I said "load effective address," I was thinking of "LDA", btw, which turns out to be just a synonym for "ADDU". 225 | 226 | 227 | -------------------------------------------------------------------------------- /20200926_taocp_4_basic_mmix_instructions/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #4 - Basic MMIX Instructions (Fascicle 1, 1.3' MMIX) (Chapter 1, Basic Concepts: 1.3 MIX) 2 | 3 | **Date:** Saturday, 26 September 2020\ 4 | **Time:** 2-4pm America/New_York\ 5 | **Location:** Google Meet online 6 | 7 | ## Agenda 8 | 9 | **2:00 - 2:10** Meet and greet\ 10 | **2:10 - 3:00** Read and discuss couple pages at a time from *Fascicle 1, MMIX* (corresponding to *Chapter 1, Basic Concepts*) 11 | 12 | - *1.2.4 Integer Functions and Elementary Number Theory* (pp.39-40 of *TAOCP Chapter 1*, not *Fascicle 1, MMIX*) 13 | - *1.3.1' Description of MMIX* (pp.8-12) 14 | 15 | - *Arithmetic operators* (pp.8-9) 16 | - *Conditional instructions* (p.10) 17 | - *Bitwise operations* (pp.10-11) 18 | - *Bytewise operations* (pp.11-12) 19 | 20 | **3:00 - 3:10** Break\ 21 | **3:10 - 4:00** 22 | - Hands-on MMIX Visual Debugger 23 | - *Exercises* (pp.24-28) 24 | - Shoot the breeze 25 | 26 | We continue to learn more about **MMIX** - the TAOCP computer! 27 | 28 | We cover more of the instruction set architecture of **MMIX** from *Fascicle 1, MMIX*. We'll also need to consult *TAOCP, Chapter 1* for a little section on the mathematical basis for the `DIV` instruction. 29 | 30 | We'll start with instructions for simple arithmetic. We'll learn how to compare values. We'll see instructions for working with the bits and bytes in registers. 31 | 32 | After the break, we'll use the free and open source MMIX Visual Debugger https://mmix.cs.hm.edu/mmixvd introduced in TAOCP Meetup #3 for hands-on practice with the instructions we have learnt so far. We'll work on some exercises too. 33 | 34 | ## Chat Copy 35 | 36 | **Zartaj Majeed** 2:00PM\ 37 | What's your favorite bit hack? 38 | 39 | **Arthur O'Dwyer** 2:02 PM\ 40 | (x & (x-1)) to remove the low-order set bit :) 41 | 42 | **Jason Vigil** 2:02 PM\ 43 | to square a number, shift left 44 | 45 | **Jason Vigil** 2:04 PM\ 46 | I guess I 47 | 'm wrong about that one. maybe it's just multiply by 2 48 | 49 | **Miguel Angel Iglesias** 2:05 PM\ 50 | I came here to _learn_ what shift left means, I read it in the book, but did not get it :( 51 | 52 | **Michael Zalewski** 2:05 PM\ 53 | Swap two bytes using XOR instead of temp variable 54 | 55 | **Arthur O'Dwyer** 2:06 PM\ 56 | Sometimes seen as a ^= b ^= a ^= b, IIRC 57 | 58 | **Michael Zalewski** 2:11 PM\ 59 | Each instruction executes in a single clock cycle 60 | (That is a goal) 61 | 62 | **Miguel Angel Iglesias** 2:16 PM\ 63 | oh you mean that it is actually _hard_ to have a single instruction per cycle? 64 | 65 | **Arthur O'Dwyer** 2:21 PM\ 66 | If you know something about hardware architecture and want your mind blown repeatedly, I recommend Ivan Godard's series of video talks on the "Mill" CPU architecture. 67 | 68 | **Uri Segal** 2:37 PM\ 69 | shift left by one is multiply by 2 70 | shift right by one is divide by 2 71 | extremely cheap in hardware to do 72 | 73 | **Miguel Angel Iglesias** 2:41 PM\ 74 | ah, so that is why if you want to shift left by n, you multiply by 2^n 75 | 76 | **Zartaj T Majeed** 2:42 PM\ 77 | yes - thats right Miguel 78 | 79 | **Arthur O'Dwyer** 2:45 PM\ 80 | On closer reading, the case-wise behavior(s) of the DIVU instruction seem very weird. If the dividend is greater than 2^64 times the divisor, we just put dividend-over-2^64 into the quotient register? That's not mathematically valid, right? Is it mechanically useful/convenient? 81 | 82 | **Uri Segal** 2:52 PM\ 83 | -2 84 | 85 | **Arthur O'Dwyer** 2:52 PM\ 86 | From my programmer's point of view, I wish Knuth had just said "For integer division, I always round the quotient //down//; I don't round it toward zero." So for example -2 divided by 3 is -1 in Knuth's model, not 0. 87 | 88 | **Miguel Angel Iglesias** 2:55 PM\ 89 | are these comparisons built in terms of CMP and CMPU? or use some underlying trickery? 90 | 91 | **Arthur O'Dwyer** 2:55 PM\ 92 | "A register is negative if and only if its leading 93 | (leftmost) bit is 1. A register is odd if and only if its trailing (rightmost) bit is 1." 94 | I like this symmetrical way of looking at it. OTOH, I don't like that the mnemonics for "CS if odd" and "CS if not odd" are "CSOD" and "CSEV" respectively. 95 | 96 | **Uri Segal** 2:56 PM\ 97 | miguel seems like mostly bit comparisons. either the msb or the lsb. or all of them to know if it's zero 98 | 99 | **Miguel Angel Iglesias** 2:56 PM\ 100 | right 101 | 102 | **Arthur O'Dwyer** 2:57 PM\ 103 | @Miguel: you're talking about the CSP/CSZ/CSN operations, are they built in terms of CMP/CMPU? If so: No, these are primitive operations in their own right. So they aren't "built in terms of" any other operations; they're on equal footing with the other primitive instructions. 104 | 105 | **Miguel Angel Iglesias** 2:57 PM\ 106 | got it! 107 | 108 | **Arthur O'Dwyer** 3:09 PM\ 109 | https://pharr.org/matt/blog/2018/04/30/ispc-all.html 110 | "In general, the Intel hardware architects knew remarkably little about programming (that Forsyth fellow notwithstanding), and I’m sure those that thought that way really believed it. [... They] grew tired of the graphics people trying to tell them how they might improve their vector programming model and that their current one was insufficient for the kinds of programs we wanted to write." 111 | 112 | **Zartaj T Majeed** 3:16 PM\ 113 | we're back 114 | 115 | **Arthur O'Dwyer** 3:19 PM\ 116 | Using ?(x) $\nu(x)$ for what a programmer would call "popcount" is noteworthy to me. 117 | 118 | **Uri Segal** 3:24 PM\ 119 | the ANDN and ORN seem non RISC like 120 | because of the embedded inverse 121 | 122 | **Arthur O'Dwyer** 3:25 PM\ 123 | I notice that "SADD $X, $Y hardcoded-zero-register" is equivalent to "X <- popcount(Y)". 124 | 125 | **Arthur O'Dwyer** 3:28 PM\ 126 | In the discussion of matrix operations, Knuth uses "×" but it would have been equally correct to use "&": 0×0=0, 0×1=0, 1×1=1; 0&0=0, 0&1=0, 1&1=1. 127 | 128 | **Arthur O'Dwyer** 3:30 PM\ 129 | Why "dot minus" but no "dot plus" or "dot times"? 130 | 131 | **Uri Segal** 3:32 PM\ 132 | for each bit, if y==1 and z==0, then x=1. that seems like the input to SADD 133 | 134 | **Michael Zalewski** 3:32 PM\ 135 | What would "dot plus" or "dot times" do? 136 | 137 | **Arthur O'Dwyer** 3:33 PM\ 138 | @Michael: "Dot plus" (saturating add) is actually common in hardware, I think. It would add but clamp to 255/65535/whatever, instead of overflowing around. 139 | 140 | **Arthur O'Dwyer** 3:34 PM\ 141 | For "dot times", I suppose there's not much sensible you could do with it with just integer arithmetic. 142 | 143 | **Michael Zalewski** 3:35 PM\ 144 | "dotMinus" reminds me of ReLU, used in neural networks 145 | 146 | **Uri Segal** 3:38 PM\ 147 | transistors weren't small enough before that 148 | 149 | **Arthur O'Dwyer** 3:38 PM\ 150 | Based on exercise 37, I *think* MXOR is similar to https://en.wikipedia.org/wiki/CLMUL_instruction_set 151 | 152 | **Uri Segal** 3:39 PM\ 153 | did the original MIX not have this instruction? 154 | 155 | **Arthur O'Dwyer** 3:39 PM\ 156 | The original MIX didn't have 64-bit registers. Its registers were MUCH weirder. 157 | 158 | **Arthur O'Dwyer** 3:46 PM\ 159 | https://en.wikipedia.org/wiki/36-bit_computing 160 | In a 36-bit word you can store 6 6-bit characters; but the PDP convention was "five 7-bit characters and 1 unused bit", which explains why in the classic text adventure "Colossal Cave" the parser looks at only the first 5 letters of each word. 161 | 162 | **Zartaj Majeed** 3:48 PM\ 163 | https://github.com/theartofcomputerprogramming/mmixsamples/blob/master/arithmetic.mms 164 | 165 | **Uri Segal** 3:50 PM\ 166 | @Arthur, interesting that Lattice FPGAs include hardware that can do 36-bit multiplies 167 | 168 | **Arthur O'Dwyer** 3:51 PM\ 169 | Looks like I was wrong about MXOR being similar to CLMUL. https://math.stackexchange.com/questions/1107839/how-is-d-knuth-mmix-instruction-mxor-useful-for-finite-field-multiplication 170 | 171 | **Uri Segal** 3:56 PM\ 172 | vim keyboard bindings? 173 | 174 | **Uri Segal** 4:00 PM\ 175 | alignment 176 | 177 | **Uri Segal** 4:05 PM\ 178 | for the debuger? 179 | \*debugger 180 | 181 | **Uri Segal** 4:14 PM\ 182 | does mmix store & process doubles using ieee 754 format? 183 | 184 | **Arthur O'Dwyer** 4:14 PM\ 185 | Yes, I believe so. 186 | Beware that (AFAICT) Knuth uses the word "float" for what a C programmer would call IEEE double, and "short float" for what a C programmer would call IEEE float. 187 | 188 | **Arthur O'Dwyer** 4:24 PM\ 189 | Would it make sense to devote one meeting to exercises? 190 | 191 | **Miguel Angel Iglesias** 4:24 PM\ 192 | +1 193 | 194 | **Jason Vigil** 4:26 PM\ 195 | Thanks! 196 | 197 | **Uri Segal** 4:26 PM\ 198 | thanks all!! 199 | 200 | **Miguel Angel Iglesias** 4:26 PM\ 201 | thanks! this was great! 202 | 203 | **Deepa Annamalai** 4:26 PM\ 204 | Thank you 205 | 206 | **Marc Vreuls** 4:26 PM\ 207 | Thanks! 208 | 209 | ## Zartaj 210 | 211 | Zartaj's notes 212 | 213 | ## Your Name 214 | Your notes 215 | 216 | -------------------------------------------------------------------------------- /20210102_taocp_17_mergesort/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #17 - Mergesort (Chapter 5, Sorting: Sections 5.2.3, 5.2.4) 2 | 3 | New Year! New sorting methods! 4 | 5 | We've studied algorithms that use the techniques of sorting by insertion and sorting by exchanging. We now look at two other approaches. 6 | 7 | Sorting by selection involves repeatedly selecting and separating the smallest key. We'll introduce the technique with Algorithm S (Straight selection sort) and discuss its refinements. Section 5.2.3 has other algorithms that we'll skip for now and return to after we have studied tree data structures in Volume 1. 8 | 9 | The next section 5.2.4 presents sorting by merging. We'll go over couple mergesort algorithms in this meetup and cover the rest in the next meetup. Mergesort is particularly useful for external sorting when it is infeasible to sort large amounts of data all in memory. It is the technique used by the GNU sort program. 10 | 11 | We'll do some exercises. 12 | 13 | The bonus segment will include a debugger stepthru of Program S (Straight selection sort) from The MMIX Supplement. 14 | 15 | **This event will be recorded and posted to YouTube as a public video at https://www.youtube.com/channel/UCHOHy9Rjl3MlEfZ2HI0AD3g** 16 | 17 | Keep the conversation going! 18 | 19 | Facebook: https://www.facebook.com/groups/678335496099220
20 | IRC ##taocp: https://webchat.freenode.net/##taocp 21 | 22 | **Date:** Saturday, 2 January 2021\ 23 | **Time:** 2-4pm America/New_York\ 24 | **Location:** Google Meet online 25 | 26 | ## Agenda 27 | 28 | **2:00 - 2:10** Meet and greet\ 29 | **2:10 - 3:00** Read and discuss couple pages at a time from *Chapter 5, Sorting* (along with *MMIX Supplement*) 30 | 31 | - *5.2.3 Sorting by Selection* (pp.138-141) 32 | - *Algorithm S (Straight selection sort)* (p.139) 33 | - *Program S (Straight selection sort)*, MMIX Supplement (p.87) 34 | - *Refinements of straight selection* (pp.140-141) 35 | 36 | - *5.2.4 Sorting by Merging* (pp.158-163) 37 | - *Algorithm M (Two-way merge)* (pp.158-159) 38 | - Mergesort (pp.159-160) 39 | - *Algorithm N (Natural two-way merge sort)* (pp.160-161) 40 | - Analysis of Algorithm N (pp.161-162), MMIX Supplement (p.89) 41 | - *Algorithm S (Straight two-way merge sort)* (pp.162-163) 42 | 43 | **3:00 - 3:10** Break\ 44 | **3:10 - 4:00** 45 | - *Exercises* (pp.166-168), MMIX Supplement (p.92) 46 | - Shoot the breeze 47 | 48 | **Bonus Segment** 49 | 50 | Stepthru in MMIX Visual Debugger 51 | 52 | - *Program S (Straight selection sort)*, MMIX Supplement (p.87) 53 | 54 | **Note on MMIX and MIX** 55 | 56 | The **MMIX** is a hypothetical computer designed by Knuth. It is a successor to **MIX** which is still referred to in all printings of Vols. 1-3 of TAOCP. **MMIX** is significantly different from **MIX**. In order to use **MMIX** instead of **MIX** now means having to supplement TAOCP with two primary sources. 57 | 58 | The first supplement is *Fascicle 1, MMIX*, a booklet written by Knuth describing the computer and its assembly programming language. It replaces Sections 1.3 and 1.4 of *Chapter 1, Basic Concepts*. The section numbers in the fascicle have a prime (') suffix to distinguish them from the originals, e.g. fascicle section 1.3.1' replaces TAOCP section 1.3.1. 59 | 60 | The second supplement is *The MMIX Supplement* by Martin Ruckert that has **MMIX** versions of all programs and content in TAOCP that currently refer to the older **MIX** computer. It uses the same section numbers as in TAOCP with page references and text snippets from TAOCP to help sync the **MMIX** version of the content with its location in TAOCP. 61 | 62 | ## Chat Copy 63 | 64 | **Arthur O'Dwyer** 2:06 PM\ 65 | https://news.ycombinator.com/item?id=25589619 66 | "I’m a grad student in my second year of grad school. I had been working part-time writing compilers and people knew that I was fairly good at writing compilers. So a guy came to me from the publishing house Addison-Wesley and said that his editor had recommended that they ask me to write a book on how to write compilers."\ 67 | "Anyway, I went home from that lunch and I wrote down on a piece of yellow paper a list of twelve chapters that I thought ought to be in a book on how to write compilers. Chapter 12 was actually “Compilers.” The first eleven chapters were techniques that you wanted to know in general that would be of help." 68 | 69 | **Arthur O'Dwyer** 2:09 PM\ 70 | LR parsers: https://web.archive.org/web/20120315152151/http://www.cs.dartmouth.edu/~mckeeman/cs48/mxcom/doc/knuth65.pdf\ 71 | Interview: https://news.ycombinator.com/item?id=25589619 72 | 73 | **Zartaj Majeed** 2:15 PM\ 74 | reading till 2:20 75 | 76 | **Zartaj Majeed** 2:28 PM\ 77 | reading till 2:30 78 | 79 | **Zartaj Majeed** 2:34 PM\ 80 | reading till 2:39 81 | 82 | **Zartaj Majeed** 2:38 PM\ 83 | repasting Arthur's earlier comments in case you missed them 84 | 85 | **Arthur O'Dwyer** 2:38 PM\ 86 | "8. [24] Show that if the search for max (K_1, ..., K_j) in step S2 is carried out by examining keys in left-to-right order K_1, K_2, ..., K_j, instead of going from right to left as in Program S, it is often possible to reduce the number of comparisons needed on the next iteration of step S2." 87 | 88 | **Zartaj Majeed** 2:38 PM\ 89 | 90 | **Arthur O'Dwyer** 2:06 PM\ 91 | https://news.ycombinator.com/item?id=25589619 92 | "I’m a grad student in my second year of grad school. I had been working part-time writing 93 | compilers and people knew that I was fairly good at writing compilers. So a guy came to me 94 | from the publishing house Addison-Wesley and said that his editor had recommended that they 95 | ask me to write a book on how to write compilers." 96 | "Anyway, I went home from that lunch and I wrote down on a piece of yellow paper a list of 97 | twelve chapters 98 | 99 | **Arthur O'Dwyer** 2:09 PM\ 100 | LR parsers: https://web.archive.org/web/20120315152151/http://www.cs.dartmouth.edu/~mckeeman/cs48/mxcom/doc/knuth65.pdf\ 101 | Interview: https://news.ycombinator.com/item?id=25589619 102 | 103 | **Zartaj Majeed** 2:47 PM\ 104 | reading till 2:52 105 | 106 | **Arthur O'Dwyer** 2:51 PM\ 107 | Algorithm M, steps M4 and M6, seem like unnecessary frills, but actually reflect physically relevant details of how the algorithm is done in practice. I happen to have been messing with libc++'s `std::merge` code very recently and can confirm that it delegates to `std::copy` at the end: https://github.com/llvm-mirror/libcxx/blob/master/include/algorithm#L4352\ 108 | And this ends up mattering physically because `std::copy` in trivial cases can just do a byte-copying thing instead of element-by-element. 109 | 110 | **Zartaj Majeed** 2:56 PM\ 111 | reading till 3:01 112 | 113 | **Zartaj Majeed** 3:08 PM\ 114 | break till 3:18 115 | 116 | **Zartaj Majeed** 3:18 PM\ 117 | we're back 118 | 119 | **Zartaj Majeed** 3:19 PM\ 120 | reading till 3:26 121 | 122 | **Zartaj Majeed** 3:31 PM\ 123 | can we go back to Table 1 on p.160? 124 | 125 | **Arthur O'Dwyer** 3:35 PM\ 126 | 1 2 3 4 2 4 6 8\ 127 | m(1 2 3 4, 8)\ 128 | m(2 4 6, ) 129 | 130 | **Arthur O'Dwyer** 3:36 PM\ 131 | produces 1 2 3 4 8 2 4 6 132 | 133 | **Arthur O'Dwyer** 3:37 PM\ 134 | 1 2 3 4 6 8 2 4\ 135 | 1 2 3 4 4 6 8 2\ 136 | 1 2 2 3 4 4 6 8 137 | 138 | **Arthur O'Dwyer** 3:38 PM\ 139 | Knuth: 1 2 3 4 8 4 6 2\ 140 | 1 2 2 3 4 6 8 4\ 141 | 1 2 2 3 4 4 6 8 142 | 143 | **Zartaj Majeed** 3:40 PM\ 144 | reading till 3:43 145 | 146 | **Zartaj Majeed** 3:45 PM\ 147 | reading till 3:52 148 | 149 | **Arthur O'Dwyer** 3:47 PM\ 150 | "Therefore it is possible to predict the location of the sorted output in advance, and copying will usually be unnecessary." — IIUC, Knuth means that copying will be unnecessary because the caller can just deal with it. Sorting 15 elements? then the output will show up in location FOO. Sorting 17 elements? then the output will show up in location BAR. Caller's problem, not mine. 151 | 152 | **Zartaj Majeed** 3:50 PM\ 153 | I take it to mean two possibilities\ 154 | callee can say which area has output\ 155 | or callee can modify start of algorithm to insure output is in original area 156 | 157 | **Zartaj Majeed** 4:01 PM\ 158 | exercise 1 159 | 160 | **Zartaj Majeed** 4:02 PM\ 161 | exercise 5 162 | 163 | **Arthur O'Dwyer** 4:05 PM\ 164 | If I have a sorted (increasing) run from the left, and a backwards sorted (decreasing) run from the right, they meet in a local maximum which is the end of both runs simultaneously. 165 | 166 | **Zartaj Majeed** 4:05 PM\ 167 | exercise 8 168 | 169 | **Zartaj Majeed** 4:10 PM\ 170 | exercise 10 171 | 172 | **Arthur O'Dwyer** 4:13 PM\ 173 | What I'm trying to say, in code, is:\ 174 | (0,0,0,0,2,4,6,8,1,3,5,7)\ 175 | I can std::merge [a+4,a+8) and [a+8,a+12) together into [a+0,a+8) without physical undefined behavior. Because by the time I've begun to overwrite \*(a+4), I must have already moved its old value out (or else I'm just doing a self-move).\ 176 | Knuth says merely: "With care we can exploit this idea so that N + 2⌊lg N⌋−1 locations are required for an entire sort. But the program seems to be rather complicated..." 177 | 178 | **Zartaj Majeed** 4:20 PM\ 179 | MMIX Debugger stepthru of Algorithm S (Straight selection sort) 180 | 181 | **Zartaj Majeed** 4:21 PM\ 182 | MMIX program will be in the mmixsamples github repo\ 183 | https://github.com/theartofcomputerprogramming/mmixsamples 184 | 185 | **Zartaj Majeed** 4:34 PM\ 186 | going to demo Table 1 on p.139 of TAOCP\ 187 | section 5.2.3 188 | 189 | **Zartaj Majeed** 4:50 PM\ 190 | we've now got row 2 of Table 1 showing in the debugger memory panel below 191 | 192 | **Zartaj Majeed** 4:54 PM\ 193 | now we're seeing row 3 of Table 1 194 | -------------------------------------------------------------------------------- /20200919_taocp_3_introduction_to_mmix/README.md: -------------------------------------------------------------------------------- 1 | # TAOCP #3 - Introduction to MMIX (Fascicle 1, 1.3' MMIX) (Chapter 1, Basic Concepts: 1.3 MIX) 2 | 3 | **Date:** Saturday, 19 September 2020
4 | **Time:** 2-4pm America/New_York
5 | **Location:** Google Meet online 6 | 7 | ## Agenda 8 | 9 | **2:00 - 2:10** Meet and greet
10 | **2:10 - 3:00** Read and discuss couple pages at a time from *Fascicle 1, MMIX* (corresponding to *Chapter 1, Basic Concepts*) 11 | 12 | - *Preface* (pp.iii-v) 13 | - *1.3' MMIX* (p.2) 14 | - *1.3.1' Description of MMIX* (pp.2-8) 15 | 16 | - *Bits and bytes* (pp.2-4) 17 | - *Memory and registers* (pp.4-5) 18 | - *Instructions* (pp.5-6) 19 | - *Loading and storing* (pp.6-8) 20 | 21 | **3:00 - 3:10** Break
22 | **3:10 - 4:00** MMIX Visual Debugger, shoot the breeze
23 | 24 | We introduce the MMIX computer used throughout TAOCP! 25 | 26 | Algorithms in TAOCP are described in pseudocode and implemented as programs written in assembly language for the MMIX computer. But an MMIX computer has never been manufactured. It can only be used in simulator programs. Outside of TAOCP, there are almost no code examples, guides, tutorials or videos. This can be a dealbreaker for many people used to an abundance of information for other programming languages readily available at popular websites. 27 | 28 | The next few TAOCP meetups will cover enough of MMIX to attain a working knowledge sufficient to read and write simple programs. Side by side we will learn to use tools to run and debug our programs. Hopefully by the time we're done, our meetup notes, discussions and videos will lower the barrier to learning and working with MMIX. 29 | 30 | In this first meetup on MMIX, we learn how data is represented and stored in MMIX memory. Data is operated upon using instructions from the MMIX instruction set. We'll start with instructions for moving data between memory and registers where data may be manipulated. We'll continue with more instructions in the following meetups. 31 | 32 | We'll begin to use some invaluable tools for working with MMIX in the second half of the meetup. We'll see how to use the MMIX Visual Debugger GUI https://mmix.cs.hm.edu/mmixvd to edit, run and step through MMIX assembly language programs. The MMIX simulator and assembler https://mmix.cs.hm.edu/src are commandline tools that will be demoed in upcoming meetups. All these tools are free and open source and available for Linux, Windows and Mac. 33 | 34 | 35 | ## Chat Copy 36 | 37 | **Uri Segal** 2:02 PM
38 | IBM PC AT 39 | no... XT 40 | 41 | **Zartaj T Majeed** 2:04 PM
42 | Miguel heard me so I think it's at your end 43 | 44 | **Michael Zalewski** 2:04 PM
45 | Time sharing system... PDP or maybe a IBM mainframe 46 | 47 | **Jason Vigil** 2:05 PM
48 | thanks -- I'll try to figure it out 49 | 50 | **Zartaj T Majeed** 2:09 PM
51 | Is anyone having a problem hearing us? 52 | 53 | **Jason Vigil** 2:10 PM
54 | Denver, CO 55 | 56 | **Deepa Annamalai** 2:10 PM
57 | i am connecting from Bay Area, California 58 | 59 | **Uri Segal** 2:11 PM
60 | i think it was IBM PC first 61 | then they split into an XT and AT version 62 | 63 | **Miguel Angel Iglesias** 2:11 PM
64 | MSX Basic 65 | 66 | **Jason Vigil** 2:11 PM
67 | Probably some unknown make/model win95 machine, or a TI graphing calculator 68 | 69 | **Uri Segal** 2:11 PM
70 | early 80s 71 | 72 | **Deepa Annamalai** 2:14 PM
73 | Not sure microprocessor programming counts on 8085/8086 74 | 75 | **Michael Zalewski** 2:15 PM
76 | I think in my case it was an IBM mainframe 77 | 78 | **Miguel Angel Iglesias** 2:20 PM
79 | http://mmix.cs.hm.edu/doc/fasc1.pdf 80 | 81 | **Jason Vigil** 2:26 PM
82 | I wonder if the series will ever be "finished" 83 | 84 | **Uri Segal** 2:27 PM
85 | he states his numbers as powers of 2 86 | $2.56 reward 87 | 128 page fascicle 88 | 89 | **Uri Segal** 2:29 PM
90 | father of mips2000 no? 91 | and now chairman of alphabet 92 | 93 | **Uri Segal** 2:30 PM
94 | \*MIPS 95 | DEC 96 | 97 | **Michael Zalewski** 2:31 PM
98 | I would like to see a comparison between MMIX and a modern 64 bit processor like Pentium or maybe powerPC. I think there are lots of differences 99 | 100 | **Uri Segal** 2:31 PM
101 | yes 102 | 103 | **Michael Zalewski** 2:32 PM
104 | Things about real microprocessors that you would never learn if you study MMIX. Especially how the processor interracts with the O/S 105 | 106 | **Zartaj T Majeed** 2:35 PM
107 | Knuth also wrote MMIXWare mentioned in sec 1.3' 108 | MMIXWare has the complete specification of MMIX and how it interacts with an OS 109 | 110 | **Miguel Angel Iglesias** 2:41 PM
111 | as a self taught, this is the first time I find out why we use hexadecimals in computers o_O 112 | 113 | **Uri Segal** 2:46 PM
114 | dword for tetra 115 | 116 | **Uri Segal** 2:47 PM
117 | one's complemmentand add 1 118 | 119 | **Michael Zalewski** 2:47 PM
120 | Flip the bits and then add 1 121 | Uri said same 122 | 123 | **Deepa Annamalai** 2:49 PM
124 | Could you pls give me a simple example say with number 4 -- 0100 125 | 126 | **Michael Zalewski** 2:49 PM
127 | Flip the bits, get 1011 128 | Add 1, get 1100 129 | 130 | **Miguel Angel Iglesias** 2:50 PM
131 | I think the one I found is slightly different... 132 | 133 | **Uri Segal** 2:50 PM
134 | 0100 --> 1011 --> 1100 135 | that's -4 in 2's complement 136 | 137 | **Deepa Annamalai** 2:50 PM
138 | thank you 139 | 140 | **Zartaj T Majeed** 2:51 PM
141 | that would be 4 -> -4 142 | 143 | **Deepa Annamalai** 2:51 PM
144 | ahhh got it... :) 145 | 146 | **Zartaj T Majeed** 2:51 PM
147 | try it the other way: -4 -> 4 148 | 149 | **Deepa Annamalai** 2:51 PM
150 | the first bit identifies as negative... 151 | 152 | **Zartaj T Majeed** 2:51 PM
153 | the technique is the same 154 | 155 | **Michael Zalewski** 2:52 PM
156 | -4 is 1111 1100. Flip the bits and get 0000 0011. Then add 1 to get 0000 0100 157 | 158 | **Zartaj T Majeed** 2:53 PM
159 | Marc - do you have the text? Fascicle 1, MMIX? 160 | 161 | **Miguel Angel Iglesias** 2:54 PM
162 | I actually need one more min 163 | http://mmix.cs.hm.edu/doc/fasc1.pdf 164 | 165 | **Miguel Angel Iglesias** 2:57 PM
166 | it took me a second read 167 | 168 | **Uri Segal** 2:57 PM
169 | $ + number 170 | 171 | **Miguel Angel Iglesias** 2:57 PM
172 | I mean it took me a second read to understand the Mx 173 | 174 | 175 | **Michael Zalewski** 2:57 PM
176 | Kind of. But if you are accessing a Tetra, then M[0] = M[1] = M[2] = M[3] 177 | Which is wierd 178 | 179 | **Miguel Angel Iglesias** 2:58 PM
180 | M1[0] = M[0]M[1] 181 | 182 | **Uri Segal** 2:59 PM
183 | the subscript indicates the number of bytes pulled out 184 | 185 | **Miguel Angel Iglesias** 2:59 PM
186 | \*M2 187 | 188 | **Jason Vigil** 2:59 PM
189 | so M_4[0] = M_4[1] = M_4[2] = M_4[3] 190 | 191 | **Miguel Angel Iglesias** 3:01 PM
192 | M_2[1] = M[2]M[3] = M[2*1]M[2*1 +1] 193 | 8 bits 194 | 195 | **Uri Segal** 3:01 PM
196 | bytes 197 | 198 | **Miguel Angel Iglesias** 3:02 PM
199 | yeah it's an octa 200 | 201 | **Zartaj T Majeed** 3:19 PM
202 | we're back 203 | 204 | **Uri Segal** 3:19 PM
205 | only 256 opcodes.... 206 | 207 | **Miguel Angel Iglesias** 3:20 PM
208 | ADD $X $Y $Z reminded me of lisp 209 | 210 | **Uri Segal** 3:20 PM
211 | few... 212 | guess i'm used to modern processors 213 | x86... 214 | 215 | **Miguel Angel Iglesias** 3:21 PM
216 | (+ 1 2) 217 | 1 + 2 218 | 219 | **Uri Segal** 3:21 PM
220 | he uses GNU style assembly: left to riht 221 | as oppoed to Intel style assembly for the operands, which is right to left 222 | 223 | **Zartaj T Majeed** 3:24 PM
224 | I'm going to set up the demo screenshare now 225 | so the slides will go away and will be replaced by the MMIX Visual Debugger in a bit 226 | 227 | **Miguel Angel Iglesias** 3:27 PM
228 | I guess is time to install wine... 229 | 230 | **Zartaj T Majeed** 3:27 PM
231 | I believe there are binaries for Mac and Linux 232 | 233 | **Miguel Angel Iglesias** 3:27 PM
234 | there are! http://mmix.cs.hm.edu/bin/index.html 235 | 236 | **Zartaj T Majeed** 3:28 PM
237 | for now I suggest just following the demo 238 | 239 | **Zartaj Majeed** 3:28 PM
240 | demo program is https://github.com/theartofcomputerprogramming/mmixsamples/blob/master/load_and_store/loadstore.mms 241 | 242 | **Uri Segal** 3:36 PM
243 | does MMIX store in LSB or MSB order? 244 | or rather interpret 245 | the opcodes 246 | 247 | **Uri Segal** 3:37 PM
248 | \*instructions 249 | 250 | **Uri Segal** 3:42 PM
251 | initial value of program counter? 252 | 253 | **Uri Segal** 3:44 PM
254 | and the general registers... 255 | 256 | **Michael Zalewski** 3:45 PM
257 | Copy one byte from memory 258 | 259 | **Uri Segal** 3:45 PM
260 | load M[$2 + $3] into $4 261 | $2 + $3 262 | 263 | **Miguel Angel Iglesias** 3:45 PM
264 | but isn't $2 and $3 empty yet? 265 | 266 | **Uri Segal** 3:45 PM
267 | is the address 268 | 269 | **Miguel Angel Iglesias** 3:45 PM
270 | \*arent 271 | 272 | **Miguel Angel Iglesias** 3:47 PM
273 | oh, basically the first instruction says to put whatever is in M[0] to $4 274 | 275 | **Uri Segal** 3:48 PM
276 | argv[0] is the name i think 277 | 278 | **Uri Segal** 3:51 PM
279 | address of the current instruction 280 | to eecute 281 | execute 282 | 283 | **Uri Segal** 3:52 PM
284 | can we assume all opcodes execute in one 'clock-cycle', whatever that mean in this context ? 285 | 286 | **Uri Segal** 3:55 PM
287 | so the label 'Main' is required ? 288 | yes 289 | 290 | **Uri Segal** 4:08 PM
291 | why did rL highlight ? 292 | for the instruction on line 61 293 | 294 | **Uri Segal** 4:12 PM
295 | the sign bit was set 296 | 297 | **Miguel Angel Iglesias** 4:12 PM
298 | mod 264? 299 | 300 | **Uri Segal** 4:12 PM
301 | so it sign extended 302 | 303 | **Michael Zalewski** 4:13 PM
304 | \#83 is signed byte, so sign was extended 305 | 306 | **Uri Segal** 4:13 PM
307 | 8 308 | the upper bit 309 | 310 | **Uri Segal** 4:16 PM
311 | byte-lane mapping 312 | 313 | **Uri Segal** 4:23 PM
314 | $3 + an offset 315 | 316 | **Deepa Annamalai** 4:24 PM
317 | gotit 318 | 319 | **Uri Segal** 4:27 PM
320 | yes. and flag was set 321 | 322 | **Jason Vigil** 4:28 PM
323 | have to go now, thanks 324 | 325 | **Miguel Angel Iglesias** 4:32 PM
326 | this was great! thanks 327 | 328 | **Thomson Kneeland** 4:32 PM
329 | all good, thanks for all that! 330 | 331 | **Alan Lin** 4:32 PM
332 | Thank you! 333 | 334 | **Uri Segal** 4:32 PM
335 | thanks! 336 | 337 | **Deepa Annamalai** 4:32 PM
338 | this was wonderful. i was little scared to join 339 | thank you so much 340 | 341 | **Marc Vreuls** 4:32 PM
342 | Thanks a lot! Very nice presentation. 343 | 344 | 345 | ## Zartaj 346 | 347 | Zartaj's notes 348 | 349 | Expanding on topics that came up in meetup 350 | 351 | ### MMIX is Big-endian 352 | 353 | MMIX is bigendian or MSB or Most Significant Byte memory layout order 354 | 355 | Why? 356 | 357 | Endianness only makes a difference when storing (writing) or loading (reading) a value that takes up more than 1 byte in memory 358 | 359 | Suppose we use a 2-byte hex value 0x1234 which is decimal 4660 360 | 361 | This is where Miguel's comment above about appreciating the use of hex in computers makes sense 362 | 363 | In hex it's really easy to see the bits and bytes in memory for any value. Something you can't do with the decimal value or even in binary because it's very hard to count so many bits individually and keep them separated in groups of 8 364 | 365 | anyway 0x1234 needs 2 bytes 12 34 366 | 367 | when MMIX stores 0x1234 at memory address say 0 - it places the bytes as follows: 368 | 369 | address 0: 12\ 370 | address 1: 34 371 | 372 | this means the address of the full value which is address 0 is the address of the high-order or most significant or the big-end byte 373 | 374 | similarly when MMIX reads this 2 byte value from address 0 it loads it into a register as 0x1234 meaning it takes the first byte at address 0 to be the high byte and the second byte as the low byte 375 | 376 | the alternative is little-endian that I won't explain and people can look up in wikipedia 377 | 378 | ### What is $0 and $1 at program startup? 379 | 380 | So $0 is what we call register 0 and $1 is register 1 381 | 382 | When a program starts $0 is set to argc - the number of program arguments on the commandline 383 | 384 | and $1 is set to the **address** of argv - the argument vector or the array of argument strings - so $1 is an address of an array of addresses 385 | 386 | When I ran the `loadstore.mms` program for the debugger demo, I did not set a commandline for the program - it's actually an option in the Run menu 387 | 388 | Since the commandline was empty, argc was zero, and argv pointed to an empty array 389 | 390 | This is highly abnormal - it only happened because `loadstore.mms` is an artificially constructed program to try out individual instructions 391 | 392 | A normal program would run as a command and its commandline would have at least the program executable name as the first argument 393 | 394 | So a normal program would have argc >= 1 and $0 would not be zero. Also argv would not be empty and the address in $1 would be of an array with at least one address - that of the first argument. 395 | 396 | ### Why did the debugger highlight $2 after the first instruction? 397 | 398 | I believe the debugger only highlights fields that change after an instruction runs. The first instruction was `LDB $4,$2,$3`. This only changes $4 but the debugger highlighted $2 as well but not $3. This is because $2 was actually not zero when the program starts. However the simulator sets it to zero before running the first instruction. This is why $2 was highlighted after the instruction ran. 399 | 400 | The status window for the demo program `loadstore.mms` shows $2 as a local register before Main starts. Its value is 2. So $2 is being used by the simulator before Main starts. I don't know why it is 2 and what the 2 means. 401 | 402 | Anyway when Main starts, rL - explained below - is 2. This is because Main starts out with 2 local registers $0 and $1, for argc and argv. And I think this means that all other previously local registers numbered 2 and above are zeroed out when Main starts. This is why $2 got highlighted after the first instruction ran even though the instruction itself did not change it. 403 | 404 | All this has to do with the register stack and function calls but because Main is called by the simulator and not our code it is difficult to see what happened before Main runs. 405 | 406 | We could look at the simulator code or ask Martin Ruckert about this. 407 | 408 | ### Why did rL keep changing? 409 | 410 | rL is the local threshold register - it has the count of local registers. This is the number of registers designated local for the current function. 411 | 412 | A register becomes local when it is set by an instruction. Not just that but all lower-numbered registers become local - and rL changes to show the new count. So in a way the value of rL is the lowest-numbered non-local register. Knuth calls the non-local registers marginal registers, excluding global registers. 413 | 414 | The demo program `loadstore.mms` uses a new destination register for nearly all instructions. This is why rL kept changing and being highlighted as we stepped through the program. 415 | 416 | Local registers are important to understand the register stack used for function/subroutine calls but knowing or using rL does not seem important for applications. 417 | 418 | -------------------------------------------------------------------------------- /20210109_taocp_18_radixsort/algorithm_l_list_merge_sort.txt: -------------------------------------------------------------------------------- 1 | Algorithm L (List merge sort). 2 | 3 | Records R_1,..., R_N are assumed to contain keys K_1,..., K_N, together with link fields L_1,..., L_N capable of holding the numbers -(N + 1) through (N + 1). There are two auxiliary link fields L_0 and L_N+1 in artificial records R_0 and R_N+1 at the beginning and end of the file. This algorithm is a "list sort" that sets the link fields so that the records are linked together in ascending order. After sorting is complete, L_0 will be the index of the record with the smallest key; and L_k, for 1 <= k <= N, will be the index of the record that follows R_k, or L_k = 0 if Rk is the record with the largest key. (See Eq. 5.2.1-(13).) 4 | 5 | During the course of this algorithm, R_0 and R_N+1 serve as list heads for two linear lists whose sublists are being merged. A negative link denotes the end of a sublist known to be ordered; a zero link denotes the end of the entire list. We assume that N >= 2. 6 | 7 | The notation "|L_s| <- p" means "Set L_s to p or -p, retaining the previous sign of L_s." This operation is well-suited to MIX, but unfortunately not to most computers; it is possible to modify the algorithm in straightforward ways to obtain an equally efficient method for most other machines. 8 | 9 | L1. [Prepare two lists.] 10 | Set L_0 <- 1, L_N+1 <- 2, 11 | L_i <- -(i+2) for 1 <= i <= N - 2, 12 | and L_N-1 <- L_N <- 0. 13 | (We have created two lists containing R_1, R_3, R_5,... and R_2, R_4, R_6,..., respectively; the negative links indicate that each ordered sublist consists of one element only. For another way to do this step, taking advantage of ordering that may be present in the initial data, see exercise 12.) 14 | 15 | L2. [Begin new pass.] 16 | (L2a) Set s <- 0, t <- N + 1, p <- L_s, q <- L_t. 17 | (L2b) If q = 0, the algorithm terminates. 18 | (During each pass, p and q traverse the lists being merged; s usually points to the most recently processed record of the current sublist, while t points to the end of the previously output sublist.) 19 | 20 | L3. [Compare K_p : K_q.] 21 | If K_p > K_q, go to L6. 22 | 23 | L4. [Advance p.] 24 | (L4a) Set |L_s| <- p, 25 | (L4b) s <- p, p <- L_p. If p > 0, return to L3. 26 | 27 | L5. [Complete the sublist.] 28 | (L5a) Set L_s <- q, 29 | (L5b) s <- t. 30 | Then set t <- q and q <- L_q, one or more times, until q = 0. Finally go to L8. 31 | 32 | L6. [Advance q.] 33 | (Steps L6 and L7 are dual to L4 and L5.) 34 | (L6a) Set |L_s| <- q, 35 | (L6b) s <- q, q <- L_q. 36 | If q > 0, return to L3. 37 | 38 | L7. [Complete the sublist.] 39 | (L7a) Set L_s <- p, 40 | (L7b) s <- t. 41 | Then set t <- p and p <- L_p, one or more times, until p <= 0. 42 | 43 | L8. [End of pass?] 44 | (At this point, p = 0 and q = 0, since both pointers have moved to the end of their respective sublists.) 45 | Set p <- -p, q <- -q. 46 | If q = 0, set |L_s| <- p, |L_t| <- 0 and return to L2. 47 | Otherwise return to L3 48 | 49 | ------------------------------------------------------------ 50 | 51 | Table 3 List Merge Sorting 52 | Section 5.2.4 Sorting by Merging 53 | p.165 54 | The Art of Computer Programming, Volume 3 Sorting and Searching, 2nd edition, Donald Knuth 55 | 56 | ------------------------------------------------------------ 57 | 58 | Legend: 59 | L: step label from algorithm 60 | j: record index 61 | K: keys 62 | *: updated link field 63 | p: current node in source list 1 64 | q: current node in source list 2 65 | s: current node in active output list 66 | t: current node in inactive output list 67 | SL 1 (p): source list 1, starts at p 68 | SL 2 (q): source list 2, starts at q 69 | OL 1: output list 1 70 | OL 2: output list 2 71 | s|A: active output list, | marks current node at s 72 | t|I: inactive output list, | marks current node at t 73 | 74 | ------------------------------------------------------------ 75 | 76 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 77 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 78 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 79 | L2a 1 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 2 | 1 2 0 17 80 | L3 1 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 2 | 1 2 0 17 81 | 82 | SL 1 (p): 1, -3, -5, -7, -9, -11, -13, -15 83 | SL 2 (q): 2, -4, -6, -8, -10, -12, -14, -16 84 | OL 1 (s|A): 0 | 1, -3, -5, -7, -9, -11, -13, -15 85 | OL 2 (t|I): 17 | 2, -4, -6, -8, -10, -12, -14, -16 86 | 87 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 88 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 89 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 90 | L6a 2* -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 2 | 1 2 0 17 91 | 92 | SL 1 (p): 1, -3, -5, -7, -9, -11, -13, -15 93 | SL 2 (q): 2, -4, -6, -8, -10, -12, -14, -16 94 | OL 1 (s|A): 0 | 2, -4, -6, -8, -10, -12, -14, -16 95 | OL 2 (t|I): 17 | 2, -4, -6, -8, -10, -12, -14, -16 96 | 97 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 98 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 99 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 100 | L6b 2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 2 | 1 -4 2 17 101 | L7a 2 -3 1* -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 2 | 1 -4 2 17 102 | 103 | SL 1 (p): 1, -3, -5, -7, -9, -11, -13, -15 104 | SL 2 (q): -4, -6, -8, -10, -12, -14, -16 105 | OL 1 (s|A): 0, 2 | 1, -3, -5, -7, -9, -11, -13, -15 106 | OL 2 (t|I): 17 | 2, 1, -3, -5, -7, -9, -11, -13, -15 107 | 108 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 109 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 110 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 111 | L7b 2 -3 1 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 2 | -3 -4 17 1 112 | L3 2 -3 1 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 2 | 3 4 17 1 113 | 114 | SL 1 (p): 3, -5, -7, -9, -11, -13, -15 115 | SL 2 (q): 4, -6, -8, -10, -12, -14, -16 116 | OL 1 (t|I): 0, 2, 1 | -3, -5, -7, -9, -11, -13, -15 117 | OL 2 (s|A): 17 | 2, 1, -3, -5, -7, -9, -11, -13, -15 118 | 119 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 120 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 121 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 122 | L6a 2 -3 1 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 4* | 3 4 17 1 123 | 124 | SL 1 (p): 3, -5, -7, -9, -11, -13, -15 125 | SL 2 (q): 4, -6, -8, -10, -12, -14, -16 126 | OL 1 (t|I): 0, 2, 1 | -3, -5, -7, -9, -11, -13, -15 127 | OL 2 (s|A): 17 | 4, -6, -8, -10, -12, -14, -16 128 | 129 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 130 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 131 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 132 | L6b 2 -3 1 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 4 | 3 -6 4 1 133 | L7a 2 -3 1 -5 3* -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 4 | 3 -6 4 1 134 | 135 | SL 1 (p): 3, -5, -7, -9, -11, -13, -15 136 | SL 2 (q): -6, -8, -10, -12, -14, -16 137 | OL 1 (t|I): 0, 2, 1 | -3, -5, -7, -9, -11, -13, -15 138 | OL 2 (s|A): 17, 4 | 3, -5, -7, -9, -11, -13, -15 139 | 140 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 141 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 142 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 143 | L7b 2 -3 1 -5 3 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 4 | -5 -6 1 3 144 | L3 2 -3 1 -5 3 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 4 | 5 6 1 3 145 | 146 | SL 1 (p): 5, -7, -9, -11, -13, -15 147 | SL 2 (q): 6, -8, -10, -12, -14, -16 148 | OL 1 (s|A): 0, 2, 1 | -3, -5, -7, -9, -11, -13, -15 149 | OL 2 (t|I): 17, 4, 3 | -5, -7, -9, -11, -13, -15 150 | 151 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 152 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 153 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 154 | L6a 2 -6* 1 -5 3 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 4 | 5 6 1 3 155 | 156 | SL 1 (p): 5, -7, -9, -11, -13, -15 157 | SL 2 (q): 6, -8, -10, -12, -14, -16 158 | OL 1 (s|A): 0, 2, 1 | -6, -8, -10, -12, -14, -16 159 | OL 2 (t|I): 17, 4, 3 | -5, -7, -9, -11, -13, -15 160 | 161 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 162 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 163 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 164 | L6b 2 -6 1 -5 3 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 0 0 4 | 5 -8 6 3 165 | L7a 2 -6 1 -5 3 -7 5* -9 -10 -11 -12 -13 -14 -15 -16 0 0 4 | 5 -8 6 3 166 | 167 | SL 1 (p): 5, -7, -9, -11, -13, -15 168 | SL 2 (q): -8, -10, -12, -14, -16 169 | OL 1 (s|A): 0, 2, 1, -6 | 5, -7, -9, -11, -13, -15 170 | OL 2 (t|I): 17, 4, 3 | -5, -7, -9, -11, -13, -15 171 | 172 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 173 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 174 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 175 | L7b 2 -6 1 -5 3 -7 5 -9 -10 -11 -12 -13 -14 -15 -16 0 0 4 | -7 -8 3 5 176 | L3 2 -6 1 -5 3 -7 5 -9 -10 -11 -12 -13 -14 -15 -16 0 0 4 | 7 8 3 5 177 | 178 | SL 1 (p): 7, -9, -11, -13, -15 179 | SL 2 (q): 8, -10, -12, -14, -16 180 | OL 1 (t|I): 0, 2, 1, -6, 5 | -7, -9, -11, -13, -15 181 | OL 2 (s|A): 17, 4, 3 | -5, -7, -9, -11, -13, -15 182 | 183 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 184 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 185 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 186 | L6a 2 -6 1 -8* 3 -7 5 -9 -10 -11 -12 -13 -14 -15 -16 0 0 4 | 7 8 3 5 187 | 188 | SL 1 (p): 7, -9, -11, -13, -15 189 | SL 2 (q): 8, -10, -12, -14, -16 190 | OL 1 (t|I): 0, 2, 1, -6, 5 | -7, -9, -11, -13, -15 191 | OL 2 (s|A): 17, 4, 3 | -8, -10, -12, -14, -16 192 | 193 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 194 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 195 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 196 | L6b 2 -6 1 -8 3 -7 5 -9 -10 -11 -12 -13 -14 -15 -16 0 0 4 | 7 -10 8 5 197 | L7a 2 -6 1 -8 3 -7 5 -9 7* -11 -12 -13 -14 -15 -16 0 0 4 | 7 -10 8 5 198 | 199 | SL 1 (p): 7, -9, -11, -13, -15 200 | SL 2 (q): -10, -12, -14, -16 201 | OL 1 (t|I): 0, 2, 1, -6, 5 | -7, -9, -11, -13, -15 202 | OL 2 (s|A): 17, 4, 3, -8 | 7, -9, -11, -13, -15 203 | 204 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 205 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 206 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 207 | L7b 2 -6 1 -8 3 -7 5 -9 7 -11 -12 -13 -14 -15 -16 0 0 4 | -9 -10 5 7 208 | L3 2 -6 1 -8 3 -7 5 -9 7 -11 -12 -13 -14 -15 -16 0 0 4 | 9 10 5 7 209 | 210 | SL 1 (p): 9, -11, -13, -15 211 | SL 2 (q): 10, -12, -14, -16 212 | OL 1 (s|A): 0, 2, 1, -6, 5 | -7, -9, -11, -13, -15 213 | OL 2 (t|I): 17, 4, 3, -8, 7 | -9, -11, -13, -15 214 | 215 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 216 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 217 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 218 | L6a 2 -6 1 -8 3 -10* 5 -9 7 -11 -12 -13 -14 -15 -16 0 0 4 | 9 10 5 7 219 | 220 | SL 1 (p): 9, -11, -13, -15 221 | SL 2 (q): 10, -12, -14, -16 222 | OL 1 (s|A): 0, 2, 1, -6, 5 | -10, -12, -14, -16 223 | OL 2 (t|I): 17, 4, 3, -8, 7 | -9, -11, -13, -15 224 | 225 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 226 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 227 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 228 | L6b 2 -6 1 -8 3 -10 5 -9 7 -11 -12 -13 -14 -15 -16 0 0 4 | 9 -12 10 7 229 | L7a 2 -6 1 -8 3 -10 5 -9 7 -11 9* -13 -14 -15 -16 0 0 4 | 9 -12 10 7 230 | 231 | SL 1 (p): 9, -11, -13, -15 232 | SL 2 (q): -12, -14, -16 233 | OL 1 (s|A): 0, 2, 1, -6, 5, -10 | 9, -11, -13, -15 234 | OL 2 (t|I): 17, 4, 3, -8, 7 | -9, -11, -13, -15 235 | 236 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 237 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 238 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 239 | L7b 2 -6 1 -8 3 -10 5 -9 7 -11 9 -13 -14 -15 -16 0 0 4 | -11 -12 7 9 240 | L3 2 -6 1 -8 3 -10 5 -9 7 -11 9 -13 -14 -15 -16 0 0 4 | 11 12 7 9 241 | 242 | SL 1 (p): 11, -13, -15 243 | SL 2 (q): 12, -14, -16 244 | OL 1 (t|I): 0, 2, 1, -6, 5, -10, 9 | -11, -13, -15 245 | OL 2 (s|A): 17, 4, 3, -8, 7 | -9, -11, -13, -15 246 | 247 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 248 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 249 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 250 | L4a 2 -6 1 -8 3 -10 5 -11* 7 -11 9 -13 -14 -15 -16 0 0 4 | 11 12 7 9 251 | 252 | SL 1 (p): 11, -13, -15 253 | SL 2 (q): 12, -14, -16 254 | OL 1 (t|I): 0, 2, 1, -6, 5, -10, 9 | -11, -13, -15 255 | OL 2 (s|A): 17, 4, 3, -8, 7 | -11, -13, -15 256 | 257 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 258 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 259 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 260 | L4b 2 -6 1 -8 3 -10 5 -11 7 -11 9 -13 -14 -15 -16 0 0 4 | -13 12 11 9 261 | L5a 2 -6 1 -8 3 -10 5 -11 7 -11 9 12* -14 -15 -16 0 0 4 | -13 12 11 9 262 | 263 | SL 1 (p): -13, -15 264 | SL 2 (q): 12, -14, -16 265 | OL 1 (t|I): 0, 2, 1, -6, 5, -10, 9 | -11, 12, -14, -16 266 | OL 2 (s|A): 17, 4, 3, -8, 7, -11 | 12, -14, -16 267 | 268 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 269 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 270 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 271 | L5b 2 -6 1 -8 3 -10 5 -11 7 -11 9 12 -14 -15 -16 0 0 4 | -13 -14 9 12 272 | L3 2 -6 1 -8 3 -10 5 -11 7 -11 9 12 -14 -15 -16 0 0 4 | 13 14 9 12 273 | 274 | SL 1 (p): 13, -15 275 | SL 2 (q): 14, -16 276 | OL 1 (s|A): 0, 2, 1, -6, 5, -10, 9 | -11, 12, -14, -16 277 | OL 2 (t|I): 17, 4, 3, -8, 7, -11, 12 | -14, -16 278 | 279 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 280 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 281 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 282 | L4a 2 -6 1 -8 3 -10 5 -11 7 -13* 9 12 -14 -15 -16 0 0 4 | 13 14 9 12 283 | 284 | SL 1 (p): 13, -15 285 | SL 2 (q): 14, -16 286 | OL 1 (s|A): 0, 2, 1, -6, 5, -10, 9 | -13, -15 287 | OL 2 (t|I): 17, 4, 3, -8, 7, -11, 12 | -14, -16 288 | 289 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 290 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 291 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 292 | L4b 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -14 -15 -16 0 0 4 | -15 14 13 12 293 | L5a 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -14 14* -16 0 0 4 | -15 14 13 12 294 | 295 | SL 1 (p): -15 296 | SL 2 (q): 14, -16 297 | OL 1 (s|A): 0, 2, 1, -6, 5, -10, 9, -13 | 14, -16 298 | OL 2 (t|I): 17, 4, 3, -8, 7, -11, 12 | -14, -16 299 | 300 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 301 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 302 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 303 | L5b 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -14 14 -16 0 0 4 | -15 -16 12 14 304 | L3 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -14 14 -16 0 0 4 | 15 16 12 14 305 | 306 | SL 1 (p): 15 307 | SL 2 (q): 16 308 | OL 1 (t|I): 0, 2, 1, -6, 5, -10, 9, -13, 14 | -16 309 | OL 2 (s|A): 17, 4, 3, -8, 7, -11, 12 | -14, -16 310 | 311 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 312 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 313 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 314 | L6a 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -16* 14 -16 0 0 4 | 15 16 12 14 315 | 316 | SL 1 (p): 15 317 | SL 2 (q): 16 318 | OL 1 (t|I): 0, 2, 1, -6, 5, -10, 9, -13, 14 | -16 319 | OL 2 (s|A): 17, 4, 3, -8, 7, -11, 12 | -16 320 | 321 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 322 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 323 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 324 | L6b 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -16 14 -16 0 0 4 | 15 0 16 14 325 | L7a 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -16 14 -16 0 15* 4 | 15 0 16 14 326 | 327 | SL 1 (p): 15 328 | SL 2 (q): 0 329 | OL 1 (t|I): 0, 2, 1, -6, 5, -10, 9, -13, 14 | -16, 15 330 | OL 2 (s|A): 17, 4, 3, -8, 7, -11, 12, -16 | 15 331 | 332 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 333 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 334 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 335 | L7b 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -16 14 -16 0 15 4 | 0 0 14 15 336 | L8a 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -16 14 -0* 0 15 4 | 0 0 14 15 337 | 338 | SL 1 (p): 0 339 | SL 2 (q): 0 340 | OL 1 (t|I): 0, 2, 1, -6, 5, -10, 9, -13, 14 | 341 | OL 2 (s|A): 17, 4, 3, -8, 7, -11, 12, -16, 15 | 342 | 343 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 344 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 345 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 346 | L8b 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -16 14 -0 0* 15 4 | 0 0 14 15 347 | 348 | SL 1 (p): 0 349 | SL 2 (q): 0 350 | OL 1 (t|I): 0, 2, 1, -6, 5, -10, 9, -13, 14 | 351 | OL 2 (s|A): 17, 4, 3, -8, 7, -11, 12, -16, 15 | 352 | 353 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 354 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 355 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 356 | L2a 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | 2 4 0 17 357 | L3 2 -6 1 -8 3 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | 2 4 0 17 358 | 359 | SL 1 (p): 2, 1, -6, 5, -10, 9, -13, 14 360 | SL 2 (q): 4, 3, -8, 7, -11, 12, -16, 15 361 | OL 1 (s|A): 0 | 2, 1, -6, 5, -10, 9, -13, 14 362 | OL 2 (t|I): 17 | 4, 3, -8, 7, -11, 12, -16, 15 363 | 364 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 365 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 366 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 367 | L6a 4* -6 1 -8 3 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | 2 4 0 17 368 | 369 | SL 1 (p): 2, 1, -6, 5, -10, 9, -13, 14 370 | SL 2 (q): 4, 3, -8, 7, -11, 12, -16, 15 371 | OL 1 (s|A): 0 | 4, 3, -8, 7, -11, 12, -16, 15 372 | OL 2 (t|I): 17 | 4, 3, -8, 7, -11, 12, -16, 15 373 | 374 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 375 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 376 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 377 | L6b 4 -6 1 -8 3 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | 2 3 4 17 378 | L3 4 -6 1 -8 3 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | 2 3 4 17 379 | 380 | SL 1 (p): 2, 1, -6, 5, -10, 9, -13, 14 381 | SL 2 (q): 3, -8, 7, -11, 12, -16, 15 382 | OL 1 (s|A): 0, 4 | 3, -8, 7, -11, 12, -16, 15 383 | OL 2 (t|I): 17 | 4, 3, -8, 7, -11, 12, -16, 15 384 | 385 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 386 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 387 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 388 | L4a 4 -6 1 -8 2* -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | 2 3 4 17 389 | 390 | SL 1 (p): 2, 1, -6, 5, -10, 9, -13, 14 391 | SL 2 (q): 3, -8, 7, -11, 12, -16, 15 392 | OL 1 (s|A): 0, 4 | 2, 1, -6, 5, -10, 9, -13, 14 393 | OL 2 (t|I): 17 | 4, 2, 1, -6, 5, -10, 9, -13, 14 394 | 395 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 396 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 397 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 398 | L4b 4 -6 1 -8 2 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | 1 3 2 17 399 | L3 4 -6 1 -8 2 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | 1 3 2 17 400 | 401 | SL 1 (p): 1, -6, 5, -10, 9, -13, 14 402 | SL 2 (q): 3, -8, 7, -11, 12, -16, 15 403 | OL 1 (s|A): 0, 4, 2 | 1, -6, 5, -10, 9, -13, 14 404 | OL 2 (t|I): 17 | 4, 2, 1, -6, 5, -10, 9, -13, 14 405 | 406 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 407 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 408 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 409 | L4a 4 -6 1* -8 2 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | 1 3 2 17 410 | 411 | SL 1 (p): 1, -6, 5, -10, 9, -13, 14 412 | SL 2 (q): 3, -8, 7, -11, 12, -16, 15 413 | OL 1 (s|A): 0, 4, 2 | 1, -6, 5, -10, 9, -13, 14 414 | OL 2 (t|I): 17 | 4, 2, 1, -6, 5, -10, 9, -13, 14 415 | 416 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 417 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 418 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 419 | L4b 4 -6 1 -8 2 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | -6 3 1 17 420 | L5a 4 3* 1 -8 2 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | -6 3 1 17 421 | 422 | SL 1 (p): -6, 5, -10, 9, -13, 14 423 | SL 2 (q): 3, -8, 7, -11, 12, -16, 15 424 | OL 1 (s|A): 0, 4, 2, 1 | 3, -8, 7, -11, 12, -16, 15 425 | OL 2 (t|I): 17 | 4, 2, 1, 3, -8, 7, -11, 12, -16, 15 426 | 427 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 428 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 429 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 430 | L5b 4 3 1 -8 2 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | -6 -8 17 3 431 | L3 4 3 1 -8 2 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 4 | 6 8 17 3 432 | 433 | SL 1 (p): 6, 5, -10, 9, -13, 14 434 | SL 2 (q): 8, 7, -11, 12, -16, 15 435 | OL 1 (t|I): 0, 4, 2, 1, 3 | -8, 7, -11, 12, -16, 15 436 | OL 2 (s|A): 17 | 4, 2, 1, 3, -8, 7, -11, 12, -16, 15 437 | 438 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 439 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 440 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 441 | L4a 4 3 1 -8 2 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 6* | 6 8 17 3 442 | 443 | SL 1 (p): 6, 5, -10, 9, -13, 14 444 | SL 2 (q): 8, 7, -11, 12, -16, 15 445 | OL 1 (t|I): 0, 4, 2, 1, 3 | -8, 7, -11, 12, -16, 15 446 | OL 2 (s|A): 17 | 6, 5, -10, 9, -13, 14 447 | 448 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 449 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 450 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 451 | L4b 4 3 1 -8 2 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 6 | 5 8 6 3 452 | L3 4 3 1 -8 2 -10 5 -11 7 -13 9 12 -16 14 -0 0 15 6 | 5 8 6 3 453 | 454 | SL 1 (p): 5, -10, 9, -13, 14 455 | SL 2 (q): 8, 7, -11, 12, -16, 15 456 | OL 1 (t|I): 0, 4, 2, 1, 3 | -8, 7, -11, 12, -16, 15 457 | OL 2 (s|A): 17, 6 | 5, -10, 9, -13, 14 458 | 459 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 460 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 461 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 462 | L6a 4 3 1 -8 2 -10 8* -11 7 -13 9 12 -16 14 -0 0 15 6 | 5 8 6 3 463 | 464 | SL 1 (p): 5, -10, 9, -13, 14 465 | SL 2 (q): 8, 7, -11, 12, -16, 15 466 | OL 1 (t|I): 0, 4, 2, 1, 3 | -8, 7, -11, 12, -16, 15 467 | OL 2 (s|A): 17, 6 | 8, 7, -11, 12, -16, 15 468 | 469 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 470 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 471 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 472 | L6b 4 3 1 -8 2 -10 8 -11 7 -13 9 12 -16 14 -0 0 15 6 | 5 7 8 3 473 | L3 4 3 1 -8 2 -10 8 -11 7 -13 9 12 -16 14 -0 0 15 6 | 5 7 8 3 474 | 475 | SL 1 (p): 5, -10, 9, -13, 14 476 | SL 2 (q): 7, -11, 12, -16, 15 477 | OL 1 (t|I): 0, 4, 2, 1, 3 | -8, 7, -11, 12, -16, 15 478 | OL 2 (s|A): 17, 6, 8 | 7, -11, 12, -16, 15 479 | 480 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 481 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 482 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 483 | L6a 4 3 1 -8 2 -10 8 -11 7* -13 9 12 -16 14 -0 0 15 6 | 5 7 8 3 484 | 485 | SL 1 (p): 5, -10, 9, -13, 14 486 | SL 2 (q): 7, -11, 12, -16, 15 487 | OL 1 (t|I): 0, 4, 2, 1, 3 | -8, 7, -11, 12, -16, 15 488 | OL 2 (s|A): 17, 6, 8 | 7, -11, 12, -16, 15 489 | 490 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 491 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 492 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 493 | L6b 4 3 1 -8 2 -10 8 -11 7 -13 9 12 -16 14 -0 0 15 6 | 5 -11 7 3 494 | L7a 4 3 1 -8 2 -10 8 5* 7 -13 9 12 -16 14 -0 0 15 6 | 5 -11 7 3 495 | 496 | SL 1 (p): 5, -10, 9, -13, 14 497 | SL 2 (q): -11, 12, -16, 15 498 | OL 1 (t|I): 0, 4, 2, 1, 3 | -8, 7, 5, -10, 9, -13, 14 499 | OL 2 (s|A): 17, 6, 8, 7 | 5, -10, 9, -13, 14 500 | 501 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 502 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 503 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 504 | L7b 4 3 1 -8 2 -10 8 5 7 -13 9 12 -16 14 -0 0 15 6 | -10 -11 3 5 505 | L3 4 3 1 -8 2 -10 8 5 7 -13 9 12 -16 14 -0 0 15 6 | 10 11 3 5 506 | 507 | SL 1 (p): 10, 9, -13, 14 508 | SL 2 (q): 11, 12, -16, 15 509 | OL 1 (s|A): 0, 4, 2, 1, 3 | -8, 7, 5, -10, 9, -13, 14 510 | OL 2 (t|I): 17, 6, 8, 7, 5 | -10, 9, -13, 14 511 | 512 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 513 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 514 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 515 | L6a 4 3 1 -11* 2 -10 8 5 7 -13 9 12 -16 14 -0 0 15 6 | 10 11 3 5 516 | 517 | SL 1 (p): 10, 9, -13, 14 518 | SL 2 (q): 11, 12, -16, 15 519 | OL 1 (s|A): 0, 4, 2, 1, 3 | -11, 12, -16, 15 520 | OL 2 (t|I): 17, 6, 8, 7, 5 | -10, 9, -13, 14 521 | 522 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 523 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 524 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 525 | L6b 4 3 1 -11 2 -10 8 5 7 -13 9 12 -16 14 -0 0 15 6 | 10 12 11 5 526 | L3 4 3 1 -11 2 -10 8 5 7 -13 9 12 -16 14 -0 0 15 6 | 10 12 11 5 527 | 528 | SL 1 (p): 10, 9, -13, 14 529 | SL 2 (q): 12, -16, 15 530 | OL 1 (s|A): 0, 4, 2, 1, 3, -11 | 12, -16, 15 531 | OL 2 (t|I): 17, 6, 8, 7, 5 | -10, 9, -13, 14 532 | 533 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 534 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 535 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 536 | L4a 4 3 1 -11 2 -10 8 5 7 -13 9 10* -16 14 -0 0 15 6 | 10 12 11 5 537 | 538 | SL 1 (p): 10, 9, -13, 14 539 | SL 2 (q): 12, -16, 15 540 | OL 1 (s|A): 0, 4, 2, 1, 3, -11 | 10, 9, -13, 14 541 | OL 2 (t|I): 17, 6, 8, 7, 5 | -10, 9, -13, 14 542 | 543 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 544 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 545 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 546 | L4b 4 3 1 -11 2 -10 8 5 7 -13 9 10 -16 14 -0 0 15 6 | 9 12 10 5 547 | L3 4 3 1 -11 2 -10 8 5 7 -13 9 10 -16 14 -0 0 15 6 | 9 12 10 5 548 | 549 | SL 1 (p): 9, -13, 14 550 | SL 2 (q): 12, -16, 15 551 | OL 1 (s|A): 0, 4, 2, 1, 3, -11, 10 | 9, -13, 14 552 | OL 2 (t|I): 17, 6, 8, 7, 5 | -10, 9, -13, 14 553 | 554 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 555 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 556 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 557 | L6a 4 3 1 -11 2 -10 8 5 7 -13 12* 10 -16 14 -0 0 15 6 | 9 12 10 5 558 | 559 | SL 1 (p): 9, -13, 14 560 | SL 2 (q): 12, -16, 15 561 | OL 1 (s|A): 0, 4, 2, 1, 3, -11, 10 | 12, -16, 15 562 | OL 2 (t|I): 17, 6, 8, 7, 5 | -10, 12, -16, 15 563 | 564 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 565 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 566 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 567 | L6b 4 3 1 -11 2 -10 8 5 7 -13 12 10 -16 14 -0 0 15 6 | 9 -16 12 5 568 | L7a 4 3 1 -11 2 -10 8 5 7 -13 12 10 9* 14 -0 0 15 6 | 9 -16 12 5 569 | 570 | SL 1 (p): 9, -13, 14 571 | SL 2 (q): -16, 15 572 | OL 1 (s|A): 0, 4, 2, 1, 3, -11, 10, 12 | 9, -13, 14 573 | OL 2 (t|I): 17, 6, 8, 7, 5 | -10, 12, 9, -13, 14 574 | 575 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 576 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 577 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 578 | L7b 4 3 1 -11 2 -10 8 5 7 -13 12 10 9 14 -0 0 15 6 | -13 -16 5 9 579 | L3 4 3 1 -11 2 -10 8 5 7 -13 12 10 9 14 -0 0 15 6 | 13 16 5 9 580 | 581 | SL 1 (p): 13, 14 582 | SL 2 (q): 16, 15 583 | OL 1 (t|I): 0, 4, 2, 1, 3, -11, 10, 12, 9 | -13, 14 584 | OL 2 (s|A): 17, 6, 8, 7, 5 | -10, 12, 9, -13, 14 585 | 586 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 587 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 588 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 589 | L4a 4 3 1 -11 2 -13* 8 5 7 -13 12 10 9 14 -0 0 15 6 | 13 16 5 9 590 | 591 | SL 1 (p): 13, 14 592 | SL 2 (q): 16, 15 593 | OL 1 (t|I): 0, 4, 2, 1, 3, -11, 10, 12, 9 | -13, 14 594 | OL 2 (s|A): 17, 6, 8, 7, 5 | -13, 14 595 | 596 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 597 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 598 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 599 | L4b 4 3 1 -11 2 -13 8 5 7 -13 12 10 9 14 -0 0 15 6 | 14 16 13 9 600 | L3 4 3 1 -11 2 -13 8 5 7 -13 12 10 9 14 -0 0 15 6 | 14 16 13 9 601 | 602 | SL 1 (p): 14 603 | SL 2 (q): 16, 15 604 | OL 1 (t|I): 0, 4, 2, 1, 3, -11, 10, 12, 9 | -13, 14 605 | OL 2 (s|A): 17, 6, 8, 7, 5, -13 | 14 606 | 607 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 608 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 609 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 610 | L4a 4 3 1 -11 2 -13 8 5 7 -13 12 10 9 14* -0 0 15 6 | 14 16 13 9 611 | 612 | SL 1 (p): 14 613 | SL 2 (q): 16, 15 614 | OL 1 (t|I): 0, 4, 2, 1, 3, -11, 10, 12, 9 | -13, 14 615 | OL 2 (s|A): 17, 6, 8, 7, 5, -13 | 14 616 | 617 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 618 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 619 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 620 | L4b 4 3 1 -11 2 -13 8 5 7 -13 12 10 9 14 -0 0 15 6 | 0 16 14 9 621 | L5a 4 3 1 -11 2 -13 8 5 7 -13 12 10 9 14 16* 0 15 6 | 0 16 14 9 622 | 623 | SL 1 (p): 0 624 | SL 2 (q): 16, 15 625 | OL 1 (t|I): 0, 4, 2, 1, 3, -11, 10, 12, 9 | -13, 14, 16, 15 626 | OL 2 (s|A): 17, 6, 8, 7, 5, -13, 14 | 16, 15 627 | 628 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 629 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 630 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 631 | L5b 4 3 1 -11 2 -13 8 5 7 -13 12 10 9 14 16 0 15 6 | 0 15 9 16 632 | L5b 4 3 1 -11 2 -13 8 5 7 -13 12 10 9 14 16 0 15 6 | 0 0 9 15 633 | L8a 4 3 1 -11 2 -13 8 5 7 -0* 12 10 9 14 16 0 15 6 | 0 0 9 15 634 | 635 | SL 1 (p): 0 636 | SL 2 (q): 0 637 | OL 1 (t|I): 0, 4, 2, 1, 3, -11, 10, 12, 9 | 638 | OL 2 (s|A): 17, 6, 8, 7, 5, -13, 14, 16, 15 | 639 | 640 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 641 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 642 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 643 | L8b 4 3 1 -11 2 -13 8 5 7 -0 12 10 9 14 16 0* 15 6 | 0 0 9 15 644 | 645 | SL 1 (p): 0 646 | SL 2 (q): 0 647 | OL 1 (t|I): 0, 4, 2, 1, 3, -11, 10, 12, 9 | 648 | OL 2 (s|A): 17, 6, 8, 7, 5, -13, 14, 16, 15 | 649 | 650 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 651 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 652 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 653 | L2a 4 3 1 -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 4 6 0 17 654 | L3 4 3 1 -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 4 6 0 17 655 | 656 | SL 1 (p): 4, 2, 1, 3, -11, 10, 12, 9 657 | SL 2 (q): 6, 8, 7, 5, -13, 14, 16, 15 658 | OL 1 (s|A): 0 | 4, 2, 1, 3, -11, 10, 12, 9 659 | OL 2 (t|I): 17 | 6, 8, 7, 5, -13, 14, 16, 15 660 | 661 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 662 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 663 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 664 | L4a 4* 3 1 -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 4 6 0 17 665 | 666 | SL 1 (p): 4, 2, 1, 3, -11, 10, 12, 9 667 | SL 2 (q): 6, 8, 7, 5, -13, 14, 16, 15 668 | OL 1 (s|A): 0 | 4, 2, 1, 3, -11, 10, 12, 9 669 | OL 2 (t|I): 17 | 6, 8, 7, 5, -13, 14, 16, 15 670 | 671 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 672 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 673 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 674 | L4b 4 3 1 -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 2 6 4 17 675 | L3 4 3 1 -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 2 6 4 17 676 | 677 | SL 1 (p): 2, 1, 3, -11, 10, 12, 9 678 | SL 2 (q): 6, 8, 7, 5, -13, 14, 16, 15 679 | OL 1 (s|A): 0, 4 | 2, 1, 3, -11, 10, 12, 9 680 | OL 2 (t|I): 17 | 6, 8, 7, 5, -13, 14, 16, 15 681 | 682 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 683 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 684 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 685 | L4a 4 3 1 -11 2* -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 2 6 4 17 686 | 687 | SL 1 (p): 2, 1, 3, -11, 10, 12, 9 688 | SL 2 (q): 6, 8, 7, 5, -13, 14, 16, 15 689 | OL 1 (s|A): 0, 4 | 2, 1, 3, -11, 10, 12, 9 690 | OL 2 (t|I): 17 | 6, 8, 7, 5, -13, 14, 16, 15 691 | 692 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 693 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 694 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 695 | L4b 4 3 1 -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 1 6 2 17 696 | L3 4 3 1 -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 1 6 2 17 697 | 698 | SL 1 (p): 1, 3, -11, 10, 12, 9 699 | SL 2 (q): 6, 8, 7, 5, -13, 14, 16, 15 700 | OL 1 (s|A): 0, 4, 2 | 1, 3, -11, 10, 12, 9 701 | OL 2 (t|I): 17 | 6, 8, 7, 5, -13, 14, 16, 15 702 | 703 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 704 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 705 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 706 | L6a 4 3 6* -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 1 6 2 17 707 | 708 | SL 1 (p): 1, 3, -11, 10, 12, 9 709 | SL 2 (q): 6, 8, 7, 5, -13, 14, 16, 15 710 | OL 1 (s|A): 0, 4, 2 | 6, 8, 7, 5, -13, 14, 16, 15 711 | OL 2 (t|I): 17 | 6, 8, 7, 5, -13, 14, 16, 15 712 | 713 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 714 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 715 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 716 | L6b 4 3 6 -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 1 8 6 17 717 | L3 4 3 6 -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 1 8 6 17 718 | 719 | SL 1 (p): 1, 3, -11, 10, 12, 9 720 | SL 2 (q): 8, 7, 5, -13, 14, 16, 15 721 | OL 1 (s|A): 0, 4, 2, 6 | 8, 7, 5, -13, 14, 16, 15 722 | OL 2 (t|I): 17 | 6, 8, 7, 5, -13, 14, 16, 15 723 | 724 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 725 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 726 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 727 | L6a 4 3 6 -11 2 -13 8* 5 7 -0 12 10 9 14 16 0 15 6 | 1 8 6 17 728 | 729 | SL 1 (p): 1, 3, -11, 10, 12, 9 730 | SL 2 (q): 8, 7, 5, -13, 14, 16, 15 731 | OL 1 (s|A): 0, 4, 2, 6 | 8, 7, 5, -13, 14, 16, 15 732 | OL 2 (t|I): 17 | 6, 8, 7, 5, -13, 14, 16, 15 733 | 734 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 735 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 736 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 737 | L6b 4 3 6 -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 1 7 8 17 738 | L3 4 3 6 -11 2 -13 8 5 7 -0 12 10 9 14 16 0 15 6 | 1 7 8 17 739 | 740 | SL 1 (p): 1, 3, -11, 10, 12, 9 741 | SL 2 (q): 7, 5, -13, 14, 16, 15 742 | OL 1 (s|A): 0, 4, 2, 6, 8 | 7, 5, -13, 14, 16, 15 743 | OL 2 (t|I): 17 | 6, 8, 7, 5, -13, 14, 16, 15 744 | 745 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 746 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 747 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 748 | L4a 4 3 6 -11 2 -13 8 5 1* -0 12 10 9 14 16 0 15 6 | 1 7 8 17 749 | 750 | SL 1 (p): 1, 3, -11, 10, 12, 9 751 | SL 2 (q): 7, 5, -13, 14, 16, 15 752 | OL 1 (s|A): 0, 4, 2, 6, 8 | 1, 3, -11, 10, 12, 9 753 | OL 2 (t|I): 17 | 6, 8, 1, 3, -11, 10, 12, 9 754 | 755 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 756 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 757 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 758 | L4b 4 3 6 -11 2 -13 8 5 1 -0 12 10 9 14 16 0 15 6 | 3 7 1 17 759 | L3 4 3 6 -11 2 -13 8 5 1 -0 12 10 9 14 16 0 15 6 | 3 7 1 17 760 | 761 | SL 1 (p): 3, -11, 10, 12, 9 762 | SL 2 (q): 7, 5, -13, 14, 16, 15 763 | OL 1 (s|A): 0, 4, 2, 6, 8, 1 | 3, -11, 10, 12, 9 764 | OL 2 (t|I): 17 | 6, 8, 1, 3, -11, 10, 12, 9 765 | 766 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 767 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 768 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 769 | L4a 4 3* 6 -11 2 -13 8 5 1 -0 12 10 9 14 16 0 15 6 | 3 7 1 17 770 | 771 | SL 1 (p): 3, -11, 10, 12, 9 772 | SL 2 (q): 7, 5, -13, 14, 16, 15 773 | OL 1 (s|A): 0, 4, 2, 6, 8, 1 | 3, -11, 10, 12, 9 774 | OL 2 (t|I): 17 | 6, 8, 1, 3, -11, 10, 12, 9 775 | 776 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 777 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 778 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 779 | L4b 4 3 6 -11 2 -13 8 5 1 -0 12 10 9 14 16 0 15 6 | -11 7 3 17 780 | L5a 4 3 6 7* 2 -13 8 5 1 -0 12 10 9 14 16 0 15 6 | -11 7 3 17 781 | 782 | SL 1 (p): -11, 10, 12, 9 783 | SL 2 (q): 7, 5, -13, 14, 16, 15 784 | OL 1 (s|A): 0, 4, 2, 6, 8, 1, 3 | 7, 5, -13, 14, 16, 15 785 | OL 2 (t|I): 17 | 6, 8, 1, 3, 7, 5, -13, 14, 16, 15 786 | 787 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 788 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 789 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 790 | L5b 4 3 6 7 2 -13 8 5 1 -0 12 10 9 14 16 0 15 6 | -11 5 17 7 791 | L5b 4 3 6 7 2 -13 8 5 1 -0 12 10 9 14 16 0 15 6 | -11 -13 17 5 792 | L3 4 3 6 7 2 -13 8 5 1 -0 12 10 9 14 16 0 15 6 | 11 13 17 5 793 | 794 | SL 1 (p): 11, 10, 12, 9 795 | SL 2 (q): 13, 14, 16, 15 796 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | -13, 14, 16, 15 797 | OL 2 (s|A): 17 | 6, 8, 1, 3, 7, 5, -13, 14, 16, 15 798 | 799 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 800 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 801 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 802 | L4a 4 3 6 7 2 -13 8 5 1 -0 12 10 9 14 16 0 15 11* | 11 13 17 5 803 | 804 | SL 1 (p): 11, 10, 12, 9 805 | SL 2 (q): 13, 14, 16, 15 806 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | -13, 14, 16, 15 807 | OL 2 (s|A): 17 | 11, 10, 12, 9 808 | 809 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 810 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 811 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 812 | L4b 4 3 6 7 2 -13 8 5 1 -0 12 10 9 14 16 0 15 11 | 10 13 11 5 813 | L3 4 3 6 7 2 -13 8 5 1 -0 12 10 9 14 16 0 15 11 | 10 13 11 5 814 | 815 | SL 1 (p): 10, 12, 9 816 | SL 2 (q): 13, 14, 16, 15 817 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | -13, 14, 16, 15 818 | OL 2 (s|A): 17, 11 | 10, 12, 9 819 | 820 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 821 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 822 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 823 | L4a 4 3 6 7 2 -13 8 5 1 -0 12 10* 9 14 16 0 15 11 | 10 13 11 5 824 | 825 | SL 1 (p): 10, 12, 9 826 | SL 2 (q): 13, 14, 16, 15 827 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | -13, 14, 16, 15 828 | OL 2 (s|A): 17, 11 | 10, 12, 9 829 | 830 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 831 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 832 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 833 | L4b 4 3 6 7 2 -13 8 5 1 -0 12 10 9 14 16 0 15 11 | 12 13 10 5 834 | L3 4 3 6 7 2 -13 8 5 1 -0 12 10 9 14 16 0 15 11 | 12 13 10 5 835 | 836 | SL 1 (p): 12, 9 837 | SL 2 (q): 13, 14, 16, 15 838 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | -13, 14, 16, 15 839 | OL 2 (s|A): 17, 11, 10 | 12, 9 840 | 841 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 842 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 843 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 844 | L4a 4 3 6 7 2 -13 8 5 1 -0 12* 10 9 14 16 0 15 11 | 12 13 10 5 845 | 846 | SL 1 (p): 12, 9 847 | SL 2 (q): 13, 14, 16, 15 848 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | -13, 14, 16, 15 849 | OL 2 (s|A): 17, 11, 10 | 12, 9 850 | 851 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 852 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 853 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 854 | L4b 4 3 6 7 2 -13 8 5 1 -0 12 10 9 14 16 0 15 11 | 9 13 12 5 855 | L3 4 3 6 7 2 -13 8 5 1 -0 12 10 9 14 16 0 15 11 | 9 13 12 5 856 | 857 | SL 1 (p): 9 858 | SL 2 (q): 13, 14, 16, 15 859 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | -13, 14, 16, 15 860 | OL 2 (s|A): 17, 11, 10, 12 | 9 861 | 862 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 863 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 864 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 865 | L6a 4 3 6 7 2 -13 8 5 1 -0 12 10 13* 14 16 0 15 11 | 9 13 12 5 866 | 867 | SL 1 (p): 9 868 | SL 2 (q): 13, 14, 16, 15 869 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | -13, 14, 16, 15 870 | OL 2 (s|A): 17, 11, 10, 12 | 13, 14, 16, 15 871 | 872 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 873 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 874 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 875 | L6b 4 3 6 7 2 -13 8 5 1 -0 12 10 13 14 16 0 15 11 | 9 14 13 5 876 | L3 4 3 6 7 2 -13 8 5 1 -0 12 10 13 14 16 0 15 11 | 9 14 13 5 877 | 878 | SL 1 (p): 9 879 | SL 2 (q): 14, 16, 15 880 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | -13, 14, 16, 15 881 | OL 2 (s|A): 17, 11, 10, 12, 13 | 14, 16, 15 882 | 883 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 884 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 885 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 886 | L4a 4 3 6 7 2 -13 8 5 1 -0 12 10 13 9* 16 0 15 11 | 9 14 13 5 887 | 888 | SL 1 (p): 9 889 | SL 2 (q): 14, 16, 15 890 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | -13, 9 891 | OL 2 (s|A): 17, 11, 10, 12, 13 | 9 892 | 893 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 894 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 895 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 896 | L4b 4 3 6 7 2 -13 8 5 1 -0 12 10 13 9 16 0 15 11 | 0 14 9 5 897 | L5a 4 3 6 7 2 -13 8 5 1 14* 12 10 13 9 16 0 15 11 | 0 14 9 5 898 | 899 | SL 1 (p): 0 900 | SL 2 (q): 14, 16, 15 901 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | -13, 9, 14, 16, 15 902 | OL 2 (s|A): 17, 11, 10, 12, 13, 9 | 14, 16, 15 903 | 904 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 905 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 906 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 907 | L5b 4 3 6 7 2 -13 8 5 1 14 12 10 13 9 16 0 15 11 | 0 16 5 14 908 | L5b 4 3 6 7 2 -13 8 5 1 14 12 10 13 9 16 0 15 11 | 0 15 5 16 909 | L5b 4 3 6 7 2 -13 8 5 1 14 12 10 13 9 16 0 15 11 | 0 0 5 15 910 | L8a 4 3 6 7 2 -0* 8 5 1 14 12 10 13 9 16 0 15 11 | 0 0 5 15 911 | 912 | SL 1 (p): 0 913 | SL 2 (q): 0 914 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | 915 | OL 2 (s|A): 17, 11, 10, 12, 13, 9, 14, 16, 15 | 916 | 917 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 918 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 919 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 920 | L8b 4 3 6 7 2 -0 8 5 1 14 12 10 13 9 16 0* 15 11 | 0 0 5 15 921 | 922 | SL 1 (p): 0 923 | SL 2 (q): 0 924 | OL 1 (t|I): 0, 4, 2, 6, 8, 1, 3, 7, 5 | 925 | OL 2 (s|A): 17, 11, 10, 12, 13, 9, 14, 16, 15 | 926 | 927 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 928 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 929 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 930 | L2a 4 3 6 7 2 -0 8 5 1 14 12 10 13 9 16 0 15 11 | 4 11 0 17 931 | L3 4 3 6 7 2 -0 8 5 1 14 12 10 13 9 16 0 15 11 | 4 11 0 17 932 | 933 | SL 1 (p): 4, 2, 6, 8, 1, 3, 7, 5 934 | SL 2 (q): 11, 10, 12, 13, 9, 14, 16, 15 935 | OL 1 (s|A): 0 | 4, 2, 6, 8, 1, 3, 7, 5 936 | OL 2 (t|I): 17 | 11, 10, 12, 13, 9, 14, 16, 15 937 | 938 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 939 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 940 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 941 | L4a 4* 3 6 7 2 -0 8 5 1 14 12 10 13 9 16 0 15 11 | 4 11 0 17 942 | 943 | SL 1 (p): 4, 2, 6, 8, 1, 3, 7, 5 944 | SL 2 (q): 11, 10, 12, 13, 9, 14, 16, 15 945 | OL 1 (s|A): 0 | 4, 2, 6, 8, 1, 3, 7, 5 946 | OL 2 (t|I): 17 | 11, 10, 12, 13, 9, 14, 16, 15 947 | 948 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 949 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 950 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 951 | L4b 4 3 6 7 2 -0 8 5 1 14 12 10 13 9 16 0 15 11 | 2 11 4 17 952 | L3 4 3 6 7 2 -0 8 5 1 14 12 10 13 9 16 0 15 11 | 2 11 4 17 953 | 954 | SL 1 (p): 2, 6, 8, 1, 3, 7, 5 955 | SL 2 (q): 11, 10, 12, 13, 9, 14, 16, 15 956 | OL 1 (s|A): 0, 4 | 2, 6, 8, 1, 3, 7, 5 957 | OL 2 (t|I): 17 | 11, 10, 12, 13, 9, 14, 16, 15 958 | 959 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 960 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 961 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 962 | L4a 4 3 6 7 2* -0 8 5 1 14 12 10 13 9 16 0 15 11 | 2 11 4 17 963 | 964 | SL 1 (p): 2, 6, 8, 1, 3, 7, 5 965 | SL 2 (q): 11, 10, 12, 13, 9, 14, 16, 15 966 | OL 1 (s|A): 0, 4 | 2, 6, 8, 1, 3, 7, 5 967 | OL 2 (t|I): 17 | 11, 10, 12, 13, 9, 14, 16, 15 968 | 969 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 970 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 971 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 972 | L4b 4 3 6 7 2 -0 8 5 1 14 12 10 13 9 16 0 15 11 | 6 11 2 17 973 | L3 4 3 6 7 2 -0 8 5 1 14 12 10 13 9 16 0 15 11 | 6 11 2 17 974 | 975 | SL 1 (p): 6, 8, 1, 3, 7, 5 976 | SL 2 (q): 11, 10, 12, 13, 9, 14, 16, 15 977 | OL 1 (s|A): 0, 4, 2 | 6, 8, 1, 3, 7, 5 978 | OL 2 (t|I): 17 | 11, 10, 12, 13, 9, 14, 16, 15 979 | 980 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 981 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 982 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 983 | L6a 4 3 11* 7 2 -0 8 5 1 14 12 10 13 9 16 0 15 11 | 6 11 2 17 984 | 985 | SL 1 (p): 6, 8, 1, 3, 7, 5 986 | SL 2 (q): 11, 10, 12, 13, 9, 14, 16, 15 987 | OL 1 (s|A): 0, 4, 2 | 11, 10, 12, 13, 9, 14, 16, 15 988 | OL 2 (t|I): 17 | 11, 10, 12, 13, 9, 14, 16, 15 989 | 990 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 991 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 992 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 993 | L6b 4 3 11 7 2 -0 8 5 1 14 12 10 13 9 16 0 15 11 | 6 10 11 17 994 | L3 4 3 11 7 2 -0 8 5 1 14 12 10 13 9 16 0 15 11 | 6 10 11 17 995 | 996 | SL 1 (p): 6, 8, 1, 3, 7, 5 997 | SL 2 (q): 10, 12, 13, 9, 14, 16, 15 998 | OL 1 (s|A): 0, 4, 2, 11 | 10, 12, 13, 9, 14, 16, 15 999 | OL 2 (t|I): 17 | 11, 10, 12, 13, 9, 14, 16, 15 1000 | 1001 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1002 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1003 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1004 | L4a 4 3 11 7 2 -0 8 5 1 14 12 6* 13 9 16 0 15 11 | 6 10 11 17 1005 | 1006 | SL 1 (p): 6, 8, 1, 3, 7, 5 1007 | SL 2 (q): 10, 12, 13, 9, 14, 16, 15 1008 | OL 1 (s|A): 0, 4, 2, 11 | 6, 8, 1, 3, 7, 5 1009 | OL 2 (t|I): 17 | 11, 6, 8, 1, 3, 7, 5 1010 | 1011 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1012 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1013 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1014 | L4b 4 3 11 7 2 -0 8 5 1 14 12 6 13 9 16 0 15 11 | 8 10 6 17 1015 | L3 4 3 11 7 2 -0 8 5 1 14 12 6 13 9 16 0 15 11 | 8 10 6 17 1016 | 1017 | SL 1 (p): 8, 1, 3, 7, 5 1018 | SL 2 (q): 10, 12, 13, 9, 14, 16, 15 1019 | OL 1 (s|A): 0, 4, 2, 11, 6 | 8, 1, 3, 7, 5 1020 | OL 2 (t|I): 17 | 11, 6, 8, 1, 3, 7, 5 1021 | 1022 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1023 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1024 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1025 | L4a 4 3 11 7 2 -0 8* 5 1 14 12 6 13 9 16 0 15 11 | 8 10 6 17 1026 | 1027 | SL 1 (p): 8, 1, 3, 7, 5 1028 | SL 2 (q): 10, 12, 13, 9, 14, 16, 15 1029 | OL 1 (s|A): 0, 4, 2, 11, 6 | 8, 1, 3, 7, 5 1030 | OL 2 (t|I): 17 | 11, 6, 8, 1, 3, 7, 5 1031 | 1032 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1033 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1034 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1035 | L4b 4 3 11 7 2 -0 8 5 1 14 12 6 13 9 16 0 15 11 | 1 10 8 17 1036 | L3 4 3 11 7 2 -0 8 5 1 14 12 6 13 9 16 0 15 11 | 1 10 8 17 1037 | 1038 | SL 1 (p): 1, 3, 7, 5 1039 | SL 2 (q): 10, 12, 13, 9, 14, 16, 15 1040 | OL 1 (s|A): 0, 4, 2, 11, 6, 8 | 1, 3, 7, 5 1041 | OL 2 (t|I): 17 | 11, 6, 8, 1, 3, 7, 5 1042 | 1043 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1044 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1045 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1046 | L6a 4 3 11 7 2 -0 8 5 10* 14 12 6 13 9 16 0 15 11 | 1 10 8 17 1047 | 1048 | SL 1 (p): 1, 3, 7, 5 1049 | SL 2 (q): 10, 12, 13, 9, 14, 16, 15 1050 | OL 1 (s|A): 0, 4, 2, 11, 6, 8 | 10, 12, 13, 9, 14, 16, 15 1051 | OL 2 (t|I): 17 | 11, 6, 8, 10, 12, 13, 9, 14, 16, 15 1052 | 1053 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1054 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1055 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1056 | L6b 4 3 11 7 2 -0 8 5 10 14 12 6 13 9 16 0 15 11 | 1 12 10 17 1057 | L3 4 3 11 7 2 -0 8 5 10 14 12 6 13 9 16 0 15 11 | 1 12 10 17 1058 | 1059 | SL 1 (p): 1, 3, 7, 5 1060 | SL 2 (q): 12, 13, 9, 14, 16, 15 1061 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10 | 12, 13, 9, 14, 16, 15 1062 | OL 2 (t|I): 17 | 11, 6, 8, 10, 12, 13, 9, 14, 16, 15 1063 | 1064 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1065 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1066 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1067 | L4a 4 3 11 7 2 -0 8 5 10 14 1* 6 13 9 16 0 15 11 | 1 12 10 17 1068 | 1069 | SL 1 (p): 1, 3, 7, 5 1070 | SL 2 (q): 12, 13, 9, 14, 16, 15 1071 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10 | 1, 3, 7, 5 1072 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 3, 7, 5 1073 | 1074 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1075 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1076 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1077 | L4b 4 3 11 7 2 -0 8 5 10 14 1 6 13 9 16 0 15 11 | 3 12 1 17 1078 | L3 4 3 11 7 2 -0 8 5 10 14 1 6 13 9 16 0 15 11 | 3 12 1 17 1079 | 1080 | SL 1 (p): 3, 7, 5 1081 | SL 2 (q): 12, 13, 9, 14, 16, 15 1082 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1 | 3, 7, 5 1083 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 3, 7, 5 1084 | 1085 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1086 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1087 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1088 | L6a 4 12* 11 7 2 -0 8 5 10 14 1 6 13 9 16 0 15 11 | 3 12 1 17 1089 | 1090 | SL 1 (p): 3, 7, 5 1091 | SL 2 (q): 12, 13, 9, 14, 16, 15 1092 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1 | 12, 13, 9, 14, 16, 15 1093 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 13, 9, 14, 16, 15 1094 | 1095 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1096 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1097 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1098 | L6b 4 12 11 7 2 -0 8 5 10 14 1 6 13 9 16 0 15 11 | 3 13 12 17 1099 | L3 4 12 11 7 2 -0 8 5 10 14 1 6 13 9 16 0 15 11 | 3 13 12 17 1100 | 1101 | SL 1 (p): 3, 7, 5 1102 | SL 2 (q): 13, 9, 14, 16, 15 1103 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12 | 13, 9, 14, 16, 15 1104 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 13, 9, 14, 16, 15 1105 | 1106 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1107 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1108 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1109 | L4a 4 12 11 7 2 -0 8 5 10 14 1 6 3* 9 16 0 15 11 | 3 13 12 17 1110 | 1111 | SL 1 (p): 3, 7, 5 1112 | SL 2 (q): 13, 9, 14, 16, 15 1113 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12 | 3, 7, 5 1114 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 7, 5 1115 | 1116 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1117 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1118 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1119 | L4b 4 12 11 7 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 13 3 17 1120 | L3 4 12 11 7 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 13 3 17 1121 | 1122 | SL 1 (p): 7, 5 1123 | SL 2 (q): 13, 9, 14, 16, 15 1124 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3 | 7, 5 1125 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 7, 5 1126 | 1127 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1128 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1129 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1130 | L6a 4 12 11 13* 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 13 3 17 1131 | 1132 | SL 1 (p): 7, 5 1133 | SL 2 (q): 13, 9, 14, 16, 15 1134 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3 | 13, 9, 14, 16, 15 1135 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15 1136 | 1137 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1138 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1139 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1140 | L6b 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 9 13 17 1141 | L3 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 9 13 17 1142 | 1143 | SL 1 (p): 7, 5 1144 | SL 2 (q): 9, 14, 16, 15 1145 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3, 13 | 9, 14, 16, 15 1146 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15 1147 | 1148 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1149 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1150 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1151 | L6a 4 12 11 13 2 -0 8 5 10 14 1 6 3 9* 16 0 15 11 | 7 9 13 17 1152 | 1153 | SL 1 (p): 7, 5 1154 | SL 2 (q): 9, 14, 16, 15 1155 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3, 13 | 9, 14, 16, 15 1156 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15 1157 | 1158 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1159 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1160 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1161 | L6b 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 14 9 17 1162 | L3 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 14 9 17 1163 | 1164 | SL 1 (p): 7, 5 1165 | SL 2 (q): 14, 16, 15 1166 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3, 13, 9 | 14, 16, 15 1167 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15 1168 | 1169 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1170 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1171 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1172 | L6a 4 12 11 13 2 -0 8 5 10 14* 1 6 3 9 16 0 15 11 | 7 14 9 17 1173 | 1174 | SL 1 (p): 7, 5 1175 | SL 2 (q): 14, 16, 15 1176 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3, 13, 9 | 14, 16, 15 1177 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15 1178 | 1179 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1180 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1181 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1182 | L6b 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 16 14 17 1183 | L3 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 16 14 17 1184 | 1185 | SL 1 (p): 7, 5 1186 | SL 2 (q): 16, 15 1187 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3, 13, 9, 14 | 16, 15 1188 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15 1189 | 1190 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1191 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1192 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1193 | L6a 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16* 0 15 11 | 7 16 14 17 1194 | 1195 | SL 1 (p): 7, 5 1196 | SL 2 (q): 16, 15 1197 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3, 13, 9, 14 | 16, 15 1198 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15 1199 | 1200 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1201 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1202 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1203 | L6b 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 15 16 17 1204 | L3 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 15 16 17 1205 | 1206 | SL 1 (p): 7, 5 1207 | SL 2 (q): 15 1208 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16 | 15 1209 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15 1210 | 1211 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1212 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1213 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1214 | L6a 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 0 15* 11 | 7 15 16 17 1215 | 1216 | SL 1 (p): 7, 5 1217 | SL 2 (q): 15 1218 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16 | 15 1219 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15 1220 | 1221 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1222 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1223 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1224 | L6b 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 0 15 11 | 7 0 15 17 1225 | L7a 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 7* 15 11 | 7 0 15 17 1226 | 1227 | SL 1 (p): 7, 5 1228 | SL 2 (q): 0 1229 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15 | 7, 5 1230 | OL 2 (t|I): 17 | 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15, 7, 5 1231 | 1232 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1233 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1234 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1235 | L7b 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 7 15 11 | 5 0 17 7 1236 | L7b 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 7 15 11 | 0 0 17 5 1237 | L8a 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 7 15 0* | 0 0 17 5 1238 | 1239 | SL 1 (p): 0 1240 | SL 2 (q): 0 1241 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15, 7, 5 | 1242 | OL 2 (t|I): 17 | 1243 | 1244 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1245 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1246 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1247 | L8b 4 12 11 13 2 -0* 8 5 10 14 1 6 3 9 16 7 15 0 | 0 0 17 5 1248 | 1249 | SL 1 (p): 0 1250 | SL 2 (q): 0 1251 | OL 1 (s|A): 0, 4, 2, 11, 6, 8, 10, 1, 12, 3, 13, 9, 14, 16, 15, 7, 5 | 1252 | OL 2 (t|I): 17 | 1253 | 1254 | L/j 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 p q s t 1255 | --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- | --- --- --- --- 1256 | K X 503 87 512 61 908 170 897 275 653 426 154 509 612 677 765 703 X 1257 | L2b 4 12 11 13 2 -0 8 5 10 14 1 6 3 9 16 7 15 0 | 4 0 0 17 1258 | 1259 | --------------------------------------------------------------------------------