Soroban
-------
The  Japanese abacus (Soroban) consists of an upper and lower deck, each housing
a number of columns of beads.

        ... ───┬───┬───┬───┐
               O   O   O   │ <- "upper deck"
               │   │   │   │
        ... ───┼───┼───┼───┤ <- "beam".
               │   │   │   │
               O   O   O   │ <- "lower deck"
               O   O   O   │
               O   O   O <-│--- "columns of beads"
               O   O   O   │
        ... ───┴───┴───┴───┘

Beads  in the lower deck represent 1 and those in the upper deck, 5. Numbers are
counted  by  moving  beads  _towards_ the central beam, so the picture above re-
presents ...000.

Here  are  some more numbers. Above each abacus is the decimal equivalent of its
bead arrangement.

               1   2   3               4   5   6               7   8   9
        ... ───┬───┬───┬───┐    ... ───┬───┬───┬───┐    ... ───┬───┬───┬───┐
               O   O   O   │           O   │   │   │           │   │   │   │
               │   │   │   │           │   O   O   │           O   O   O   │
        ... ───┼───┼───┼───┤    ... ───┼───┼───┼───┤    ... ───┼───┼───┼───┤
               O   O   O   │           O   │   O   │           O   O   O   │
               │   O   O   │           O   O   │   │           O   O   O   │
               O   │   O   │           O   O   O   │           │   O   O   │
               O   O   │   │           O   O   O   │           O   │   O   │
               O   O   O   │           │   O   O   │           O   O   │   │
        ... ───┴───┴───┴───┘    ... ───┴───┴───┴───┘    ... ───┴───┴───┴───┘
              0/1.0/2.0/3             0/4.1/0.1/1             1/2.1/3.1/4

The  expression at the base of each soroban corresponds to the bead positions in
the  columns  above.  Characters  0-4 show the number of beads moved towards the
central  beam  '/'  and  adjacent columns are separated by '.'. We will use this
symbolic  representation from here on. Auxiliary functions ⍺ and ⍵ in the script
convert  between  these ⍺bacus and ⍵estern number representations. Whole decimal
numbers  are  represented with a '.' separator between each digit; this is not a
decimal point (see →Overview←).

        ⍺ 3.7.4             ⍝ ⍺bacus from ⍵estern number 374.
    0/3.1/2.0/4

        ⍵ 0/3.1/2.0/4       ⍝ ⍵estern from ⍺bacus.
    3.7.4

Addition is performed with reference to the following small table:

        ┌───┬───┬───┬───┐
      + │ 1 │ 2 │ 3 │ 4 │
    ┌───┼───┼───┼───┼───┤
    │i/0│i/1│i/2│i/3│i/4│   Where: + = i+1
    ├───┼───┼───┼───┼───┤
    │i/1│i/2│i/3│i/4│+/0│   Addends of 5 and above are recast:
    ├───┼───┼───┼───┼───┤
    │i/2│i/3│i/4│+/0│+/1│       i/n + (5+j) => (i+1)/n + j
    ├───┼───┼───┼───┼───┤
    │i/3│i/4│+/0│+/1│+/2│   If i=1, then  (i+1) carries to the next column:
    ├───┼───┼───┼───┼───┤
    │i/4│+/0│+/1│+/2│+/3│       i/m . (1+1)/n =>  i/(m+1) . 0/n
    └───┴───┴───┴───┴───┘

Similarly, subtraction is performed with reference to:

        ┌───┬───┬───┬───┐
      - │ 1 │ 2 │ 3 │ 4 │
    ┌───┼───┼───┼───┼───┤
    │i/0│-/4│-/3│-/2│-/1│   Where: - = i-1
    ├───┼───┼───┼───┼───┤
    │i/1│i/0│-/4│-/3│-/2│   Subtrahends of 5 and above are recast:
    ├───┼───┼───┼───┼───┤
    │i/2│i/1│i/0│-/4│-/3│       i/n - (5+j) => (i-1)/n - j
    ├───┼───┼───┼───┼───┤
    │i/3│i/2│i/1│i/0│-/4│   If i=0, then  (i-1) carries to the next column:
    ├───┼───┼───┼───┼───┤
    │i/4│i/3│i/2│i/1│i/0│       i/m . (0-1)/n =>  i/(m-1) . 1/n
    └───┴───┴───┴───┴───┘

(
    The  Chinese  abacus, or "Suan-Pan", has an extra bead in both the upper and
    lower deck:

        ... ───┬───┬───┬───┐
               O   O   O   │
               O   O   O   │ <- 2 beads/column in upper deck,
               │   │   │   │
        ... ───┼───┼───┼───┤
               │   │   │   │
               O   O   O   │
               O   O   O   │
               O   O   O   │ <- 5 beads/column in lower deck.
               O   O   O   │
               O   O   O   │
        ... ───┴───┴───┴───┘

    For  decimal calculations, the outermost beads are not used, except to defer
    an overflow-carry operation if desired. The prime purpose of the extra beads
    is  to  provide a total of 3 × 6 = 18 combinations, allowing the possibility
    of hexadecimal arithmetic in calculating weights (1 Jin = 16 Liang).

    The Japanese Soroban evolved from the Chinese Suan Pan by losing a bead from
    its upper deck in the middle of the 19th century and one from its lower deck
    in the middle of the 20th.
)

(
    As  the  Pre-Columbian  people of Central America used their toes as well as
    their  fingers for counting, they wound up with a base 20 number system. The
    digits  were written in columns, each expressed as a series of up to 5 marks
    arranged in up to 4 rows (fingers/toes per hand/foot).

    See: dfns.dws/notes.mayan for further details.

    The  4×5  arrangement of marks suggests an abacus with 3 beads in the upper,
    and  4  in  the lower deck, giving 4×5 combinations. The Mesoamerican abacus
    appears  to  have been invented independently of the Chinese abacus (just as
    their invention of the Zero appears to be independent of the Arab Zero).

        ... ───┬───┬───┬───┐
               O   O   O   │
               O   O   O   │ <- 3 beads/column in upper deck,
               O   O   O   │
               │   │   │   │
        ... ───┼───┼───┼───┤
               │   │   │   │
               O   O   O   │
               O   O   O   │ <- 4 beads/column in lower deck.
               O   O   O   │
               O   O   O   │
        ... ───┴───┴───┴───┘

    An example "Nepohualtzitzin" dates from 900-1000 AD. It was made from maize-
    kernel beads threaded on strings with a fixed central "beam" bead separating
    the  upper  and lower floating ones. Nepohualtzitzin was worn on the forearm
    as a nifty fashion accessory. (It would be interesting to find how ownership
    of  such  abaci  was spread within mesoamerican society; perhaps the average
    market  trader  sported  one, or perhaps they were the exclusive preserve of
    the  Astronomer-Priest. Given that the device itself looks relatively inexp-
    ensive to manufacture, this would say more about the general grasp or avail-
    ability  of  arithmetic within the community, than about the distribution of
    wealth needed to own such a beautiful calculator - JMS).

    Ref: Ifrah, G. "The Universal History of Numbers".
)

(
    A common feature of all of these abaci is that they respect the limit of the
    number  of objects or states that the human recognition system can grasp im-
    mediately  without  explicitly  having to count them. This limit seems to be
    around 4.

    Just for fun and given this constraint, here is a proposal for an abacus for
    a base 60 (sexagesimal) number system, as used by the Babylonians and Sumer-
    ians.

        ... ───┬───┬───┬───┐
               │   │   │   │
               O   O   O   │ <- 2 beads/column in upper deck,
               O   O   O   │
        ... ───┼───┼───┼───┤
               │   │   │   │
               O   O   O   │
               O   O   O   │ <- 3 beads/column in middle deck,
               O   O   O   │
        ... ───┼───┼───┼───┤
               │   │   │   │
               O   O   O   │
               O   O   O   │ <- 4 beads/column in lower deck.
               O   O   O   │
               O   O   O   │
        ... ───┴───┴───┴───┘

    We would see something like:

        ⍺ 12.34.56
    0/2/2.1/2/4.2/3/1

    Here is a function to translate a decimal number into "abacus format":

          enco←{                      ⍝ Encode to ⍺-abacus.
              ⍺←2 5                   ⍝ default to soroban.
              cols←⌈(×/⍺)⍟⍵           ⍝ number of columns to use.
              base←cols/×/⍺           ⍝ encoding base.
              digs←⍺⊤base⊤⍵           ⍝ digits in each column, in each deck.
              nums←⍕¨¨↓⍉digs          ⍝ formatted digits per deck, per column.
              join←{↑⍺{⍺,⍺⍺,⍵}/⍵}     ⍝ ⍺-join function.
              '.'join'/'join¨nums     ⍝ collected abacus representation.
          }

          enco 23           ⍝ encode to soroban.
    0/2.0/3

          enco 87
    1/3.1/2

    For the base-60 "triple-decker" above, we bind a left argument of 3 4 5:

          tridek←3 4 5∘enco

          tridek 20
    1/0/0

          tridek 83
    0/0/1.1/0/3

          tridek 60⊥12 34 56
    0/2/2.1/2/4.2/3/1
)

Examples:

      soroban script until'→'

    ⍺ 1.2.3                         ⍝ abacus representation of decimal 123.
0/1.0/2.0/3

    ⍺ 4.5.6                         ⍝ ditto 456.
0/4.1/0.1/1

    0/0 + 1.2.3                     ⍝ addition into cleared abacus.
0/1.0/2.0/3

    ⍵ 0/0 + 1.2.3                   ⍝ ... reinterpreted into (⍵estern) decimal.
1.2.3

    ⍵ 0/0 + 1.2.3 + 4.5.6           ⍝ sequence of additions.
5.7.9

    ⍵ (⍺ 3.5) - 7                   ⍝ succession of subtractions of 7 ...
2.8

    ⍵ (⍺ 3.5) - 7 - 7
2.1

    ⍵ (⍺ 3.5) - 7 - 7 - 7
1.4

    →                               ⍝ etc.

      soroban trace eval'⍵ 0/0 + 9.9.9 + 1'         ⍝ traced additions.
···0/0+9.9.9 [h/e+q.d → (0/0+q).(h/e+d)] (0/0+9.9).(0/0+9)
····0/0+9.9 [h/e+q.d → (0/0+q).(h/e+d)] (0/0+9).(0/0+9)
·····0/0+9 [h/e+d → (h+1)/e+⌊d] (0+1)/0+⌊9
······(0+1)/0 [(0+1)/e → 1/e] 1/0
······⌊9 [⌊9 → 4] 4
·····1/0+4 [h/0+e → h/e] 1/4
·····0/0+9 [h/e+d → (h+1)/e+⌊d] (0+1)/0+⌊9
······(0+1)/0 [(0+1)/e → 1/e] 1/0
······⌊9 [⌊9 → 4] 4
·····1/0+4 [h/0+e → h/e] 1/4
····0/0+9 [h/e+d → (h+1)/e+⌊d] (0+1)/0+⌊9
·····(0+1)/0 [(0+1)/e → 1/e] 1/0
·····⌊9 [⌊9 → 4] 4
····1/0+4 [h/0+e → h/e] 1/4
··1/4.1/4.1/4+1 [p.h/e+d → p.(h/e+d)] 1/4.1/4.(1/4+1)
···1/4+1 [h/4+1 → (h+1)/0] (1+1)/0
···(1+1)/0 [(1+1)/e → 0/1.0/e] 0/1.0/0
··1/4.1/4.(0/1.0/0) [p.(0/1.q) → (p+1).q] (1/4.1/4+1).0/0
···1/4.1/4+1 [p.h/e+d → p.(h/e+d)] 1/4.(1/4+1)
····1/4+1 [h/4+1 → (h+1)/0] (1+1)/0
····(1+1)/0 [(1+1)/e → 0/1.0/e] 0/1.0/0
···1/4.(0/1.0/0) [p.(0/1.q) → (p+1).q] (1/4+1).0/0
····1/4+1 [h/4+1 → (h+1)/0] (1+1)/0
····(1+1)/0 [(1+1)/e → 0/1.0/e] 0/1.0/0
·⍵0/1.0/0.0/0.0/0 [⍵p.q → (⍵p).⍵q] (⍵0/1.0/0.0/0).⍵0/0
··⍵0/1.0/0.0/0 [⍵p.q → (⍵p).⍵q] (⍵0/1.0/0).⍵0/0
···⍵0/1.0/0 [⍵p.q → (⍵p).⍵q] (⍵0/1).⍵0/0
····⍵0/1 [⍵0/e → e]  1
····⍵0/0 [⍵0/e → e]  0
···⍵0/0 [⍵0/e → e]  0
··⍵0/0 [⍵0/e → e]  0
1.0.0.0

References:

    http://werwolf.ee.ryerson.ca:8080/~elf/abacus
    http://www.soroban.com/link_eng.html
    http://members.aol.com/chineseabacus

See also: →#.soroban