Japanese abacus and binary arithmetic

Soroban or counting tray is a vertical abacus with 5 beads that is divided into two rows. Higher row has one bead and lower row has 4.

Every column in a soroban signifies a digit. The lone higher bead has a value of 5 and lower beads each has a value of 1. The value of the column is decided by the amount of beads touching the middle bar that divides the Soroban.

Mastering the four basic arithmetic operations on Soroban is said to boost your calculation skill. I think there is a very good reason for this. A physical tool allows you to memorize the arithmetic operations into a mantra that you can apply without thinking about it.

Addition & Subtraction

The use of Soroban for addition relies on the complement of 5 and 10.

1+4 = 2+3 = 3+2 = 4+1 = 5
1+9 = 2+8 = 3+7 = 4+6 = 5+5 = 6+4 = 7+3 = 8+2 = 9+1 = 10

So say you have to add A to B. If complement of A is higher than B, then there is no carry. Otherwise there is a carry.

A+B < 10           when B  < (10-A)
A+B = +10+A-(10-B) when B >= (10-A)

Likewise at subtraction you can also use the complement to ease computation.

A-B >= 0           when B <= A
A-B = -10+A+(10-B) when B >  A

Next consider you have to calculate this:

42933 + 13749
  * *     * *

The stars mark the calculations that produce complements. You can rewrite the number to this:

42933 + 13040
  3 1    1 1

This is a shorthand for 42933 + 13040 - 300 - 1 + 1000 + 10. When you carry out the simpler calculations you end up with no complementary number combinations and you can just sum every number together like this:

42632 + 14050 = 56682

The result is the same as of the original calculation.

You can do the same with the subtraction:

42933 - 26872
 * *     * *

42933 - 20802
 4 3    1 1 

46963 - 30902 = 16061

The logic is similar, but the complementary numbers are added instead of subtracted, and the carry is subtracted instead of added. We mark the numbers that are smaller than the numbers on the another side.

What does happen with adjacent complementaries?

4693 + 5379
!!**     **

4693 + 5300
!!31    11

You can see that the rules work fairly well because we end up subtracting. I intentionally chose a corner case where we get an additional complementary.

4693 + 5000
!631   1 1

4693 + 0000
4631  1  1

0093 + 0000
  31  1  1

0062 +10010 = 10072

Digits that add up to 9 can carry. This may seem like a problem to use of this algorithm, but they clear down to zero if they interfere with the calculation.

In the subtractive case the carrying digits are the same, which makes them easy to recognize.

These rules are practically the same as with ordinary arithmetic that you may have been taught so there should be nothing new for you in this drill.

How do these rules manifest in a soroban? Well practically they should be simpler because the soroban represents digits using fewer digits.

This is how the digits would manifest in a soroban:

 55    5 55
4143 +  324

Now lets try the same algorithm to calculate the sum and mark the carrying digits:

!!*!     *
0550   5055
4143 + 0324
!!**     **

I found this to be a bit tricky because the higher column behaves differently than the lower. In other hand it is much simpler.

!!*!     *
0550   5055
4143 + 0324
!!**     **

!! !    1 
0500   5005
4143 + 0324
!!**     **

The large carry makes it look as if the whole number just collapsed.

   !
0000   0005
0043 + 0024
  **  1  **


0000   0050
0043 + 0010
  31  1    

0000   0050   00050
0012 +10010 = 10022 = 10072

Here we are doing rather clumsy calculations on the paper, but lets do it again as if we were actually using a soroban to calculate the sum:

18233 + 99777

005000   55555
013233 + 44222

055000    5555
013233 + 44222

 05000    5555
103233 +  4222

 05000     555
112233 +   222

 05500      55
112233 +   222

 05500      55
112433 +    22

 05550       5
112433 +    22

 05000       5
113003 +     2

 05005        
113003 +     2

 05000        
113010 = 118010

It is a long sequence of events but it really did not take much time at all. Literally everybody knows how to add and subtract together small numbers and the use of Soroban exploits that fact.

Knowing how Soroban adds numbers together also helps you in understanding how computers add numbers together. Here's the same computation done using the binary numbers:

 !  !!    *!*  !!!! !  * 
00  0100 0111  0011 1001 + 01  1000 0101  1100 0001

The information about the carry and hazard of carrying further already tells us everything we need to know about the result.

01  1100 1100  1111 1010 = 118010

The logic of addition reduces into small pieces that can be implemented in handful of logic gates.

0+0+0 => 0,  0+1+0 => 1,  1+0+0 => 1,  1+1+0 => 2
0+0+1 => 1,  0+1+1 => 2,  1+0+1 => 2,  1+1+1 => 1+2

The additive circuit can also double as subtraction circuit if we use two's complement to represent negative numbers.

Two's complement

When two's complement is used with binary numbers, the most significant digit is interpreted as if it extended infinitely to the left. These four numbers are all the same number:

11110101 = -11
111110101 = -11
1111110101 = -11
11111110101 = -11

To get the negated number value, you flip the bits and add one.

~11110101+1 = 00001010+1 = 11

Therefore our algorithm for adding numbers together remain the same, yet we have obtained a way to subtract numbers and represent a negative sign. We can verify this by observing that the negative and positive number cancels each other out.

!!!!!!!*
11110101 + 00001011 = 0

So Soroban's arithmetic resembles binary arithmetic because the rules to memoize are reduced in count. Can we use this idea of complementary numbers with Soroban? We can try to derive the rules.

42933 - 26872 = 16061

00500   05550   05050
42433 - 21322 = 11011

So what is the negation of 26872 in soroban representation? Observing that the complementary representation must cancel out, we should produce a complementary number with an expectation that the number cancels out.

The complementary number would be:

550005
423122+1

It is as if we subtracted every digit from 9, then added 1.

We can see that this number cancels out with the positive number during negation:

!!!!!!
550005   005550
423123 + 021322 = 0
!!!!!*

Now we can try whether the addition with this complementary produces the result that we wanted:

000500   550005   005050
042433 + 423123 = 011011

500500    50005
442433 +  23123

550500     0005
442433 +  23123

000500      005
012433 +   3123

005500       05
010433 +    123

005000        5
011033 +     23

005050        5
011003 +      3

005055         
011003 +      3

005050         
011011

Therefore complementary number notation does work with a soroban, which means we only need to know how to invert the orientation of the beads and add one to represent negative numbers.

Multiplication

The multiplication of numbers together requires a multiplication table. The multiplication table for decimals goes:

1
2  4
3  6  9
4  8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49
8 16 24 32 40 48 56 64
9 18 27 36 45 54 63 72 81

Low number of digits makes the multiplication easier. For reference, here's the multiplication table for the binary:

0 0
0 1

That is a ridiculous multiplication table. So how does multiplication of two numbers proceed in binary?

00  0100 0111  0011 1001 * 01  1000 0101  1100 0001

                                 011000010111000001
00000000000000000000100011100111001 
000000000000000000000100011100111001 
00000000000000000000000000100011100111001 
0000000000000000000000000000100011100111001 
00000000000000000000000000000100011100111001 
000000000000000000000000000000100011100111001 
000000000000000000000000000000000000100011100111001 

000000000000000000001101010110101011
000000000000000000000 000   00   00  
00000000000000000000000000100011100111001 
0000000000000000000000000000100011100111001 
00000000000000000000000000000100011100111001 
000000000000000000000000000000100011100111001 
000000000000000000000000000000000000100011100111001 

00000000000000000000110101111110010011001
00000000000000000000000000 000   00   00  
0000000000000000000000000000100011100111001 
00000000000000000000000000000100011100111001 
000000000000000000000000000000100011100111001 
000000000000000000000000000000000000100011100111001 

0000000000000000000011011000011100110011101
0000000000000000000000000000 000   00   00  
00000000000000000000000000000100011100111001 
000000000000000000000000000000100011100111001 
000000000000000000000000000000000000100011100111001 

00000000000000000000110110001011101001110011
00000000000000000000000000000 000   00   00  
000000000000000000000000000000100011100111001 
000000000000000000000000000000000000100011100111001 

000000000000000000001101100011011110000011111
000000000000000000000000000000 000   00   00  
000000000000000000000000000000000000100011100111001 

000000000000000000001101100011011110100100011111001
000000000000000000000000000000000000 000   00   00  

0110 1100  0110 1111  0100 1000  1111 1001

What is the multiplication table for the Soroban?

0
1
0  0
2  4
0  5  5
3  1  4
0  5  0  5
4  3 12 11
5  0  5  0  5
0 10 10 20 20

We have 10 numbers to memorize and they all follow some blatantly obvious patterns. The five is ridiculously simple, whereas four is following a similar pattern that 9 follows in decimal. Two-four and Three-one-four are some trivial number sequences for the two and three.

The multiplication follows the exact same rules as multiplication with decimals or binary numbers. So I am not going to show an example of that using Soroban notation. Note that the multiplication also works with the complement numbers.

Division

The division is the most difficult from the four steps, but in binary it's not that difficult when we use the methods that we have used so far to the other operations.

000100011100111001 / 01110, the -01110 is 10010

The strategy usually used for division is to transfer the number being divided into a remainder. Then we start subtracting multiples of the dividing number until we end up with a number that is smaller than the divider.

000000010000000000
000100011100111001
11110010

000000010010000000
000000111100111001
11111110010

000000010100000000
000000100000111001
11111110010

000000010100010000
000000000100111001
11111111110010

000000010100010100
000000000001011001
1111111111110010

000000010100010110
000000000000100001
11111111111110010

000000010100010110
000000000000000101
111111111111110010

000100011100111001 / 01110 = 010100010110 + 0101 / 01110

How to do this with a Soroban?

18233 / 14 = 1302 + 5 / 14

05000
13233 % 14

00000
04233 % 14 + 1000

00000
04233 % 14 + 1000

00500
02333 % 14 + 1100

00000
01433 % 14 + 1200

00000
00033 % 14 + 1300

00005
00014 % 14 + 1301

00005
00000 % 14 + 1302

The method of long division can be used without a problem. It is essentially same as used with the binary numbers.

The long division with Soroban can be sped up by calculating a multiplication table for the divider. This is achieved by adding the number to itself five times.

IEEE Floating point soroban

You could create an abacus with pairs of three beads in it, used and organized similar to the Soroban. This "hexadecimal" Soroban could be directly used for representing floating point arithmetic.

Here's a floating point soroban that represents infinity:

+INF
----------------------------------
| | |  * * * *  * * * *  * * * * |
| * *  * * * *  * * * *  * * * * |
- * *  * * * *  * * * *  * * * * |
* * *  | | | |  | | | |  | | | | |
|--------------------------------|
| * *  | | | |  | | | |  | | | | |
- * *  * * * *  * * * *  * * * * |
| * *  * * * *  * * * *  * * * * |
| | |  * * * *  * * * *  * * * * |
----------------------------------

If the significand is not zero, this table would be NaN.

+NaN(0h.4)
----------------------------------
| | |  * * * *  * * * *  * * * * |
| * *  * * * *  * * * *  * * * * |
- * *  | * * *  * * * *  * * * * |
* * *  * | | |  | | | |  | | | | |
|--------------------------------|
| * *  | | | |  | | | |  | | | | |
- * *  * * * *  * * * *  * * * * |
| * *  * * * *  * * * *  * * * * |
| | |  * * * *  * * * *  * * * * |
----------------------------------

Now you can see yourself that floating point format uses a lot of states for representing NaN.

Exponent zero represent denormal numbers. They are numbers that start with zero. The smallest representable number would be shown like this:

+0h0.000000000001*2^(-126)
----------------------------------
| * *  * * * *  * * * *  * * * * |
| * *  * * * *  * * * *  * * * * |
- * *  * * * *  * * * *  * * * * |
* | |  | | | |  | | | |  | | | | |
|--------------------------------|
| | |  | | | |  | | | |  | | | * |
- * *  * * * *  * * * *  * * * | |
| * *  * * * *  * * * *  * * * * |
| * *  * * * *  * * * *  * * * * |
----------------------------------

If the exponent is nonzero, we get normalized values.

+0h1.000000000000*2^(-126)
----------------------------------
| * *  * * * *  * * * *  * * * * |
| * *  * * * *  * * * *  * * * * |
- * |  * * * *  * * * *  * * * * |
* | *  | | | |  | | | |  | | | | |
|--------------------------------|
| | |  | | | |  | | | |  | | | | |
- * *  * * * *  * * * *  * * * * |
| * *  * * * *  * * * *  * * * * |
| * *  * * * *  * * * *  * * * * |
----------------------------------

This is the quantity of 1:

+0h1.000000000000e0*2^(0)
----------------------------------
| * |  * * * *  * * * *  * * * * |
| * *  * * * *  * * * *  * * * * |
- | *  * * * *  * * * *  * * * * |
* * *  | | | |  | | | |  | | | | |
|--------------------------------|
| * *  | | | |  | | | |  | | | | |
- * *  * * * *  * * * *  * * * * |
| * *  * * * *  * * * *  * * * * |
| | |  * * * *  * * * *  * * * * |
----------------------------------

What could you do with this? You could demonstrate how the value underflows if the exponent differs by more than 48 steps. You can also explain why some decimal fractions do not have an exact representation in floating point values. Plus you can explain why the floating point rounding error accumulates or how the error magnifies when values are subtracted from each other.

The computation would involve shifting the beads into the right orientation. This would involve left and right shifts.

1011 0000
---------

  *  
  *  
---------
  *  
  *  
  *

Right shift: If the slot has at least two beads, leave odd number of beads. If the slot has odd number of beads, leave at least two beads to the next slot.

0101 1000
---------

    *
  * *
---------
  *

Left shift: If the slot has odd number of beads, leave more than two beads. If the slot has at least two beads, leave odd number of beads to the previous slot.

0001 0110
---------


    *
---------
  * *
    *

Maybe there will be more ideas later.

Conclusion

Use of a Soroban in training could help to train mechanized rules for basic arithmetic and dramatically speed up the performance of calculating arithmetic by memory.

The speed-up could be used for teaching more of numerical methods for solving problems that would be otherwise infeasible due to lot of computation required to solve the problem.

The knowledge gained from operating with a Soroban can translate to the understanding of computers and computer arithmetic.