Version 0 of Remainder orbits

Updated 2004-07-11 19:47:09

if 0 {Richard Suchenwirth 2004-07-10 - When you do integer division, a non-zero remainder may occur, which the modulo operator % gives us:

 10/7 = 1
 10%7 = 3

In manual division, the remainder is multiplied by 10 and again integer-divided by the divisor, until a zero remainder is reached (or the person calculating is exhausted). Periodic decimal fractions are known to never terminate, because no zero remainder ever comes:

 10/7. = 1.42857142857...

The "142857" part will repeat as long as you wish (you'd stop before "forever"), like a circular graph of digits, a ring. Such remainder rings (not sure whether that's the correct term, but searching Mathworld brought me no better one) ...

Lars H interrupts: What you are describing in the rest of this page is rather remainder orbits (they are technically the orbits of the multiply-by-10-modulo-b map). A ring is an algebraic structure which (at least) supports the three operations + (addition), - (subtraction), and * (multiplication).

... have ever again fascinated me a bit, and today I wanted to play with them in Tcl.}

 proc rem-orbit {a b} {
    set res {}
    while 1 {
        set rem [expr {$a % $b}]
        if {$rem==0} {error "aperiodic $b"}
        if [in $res $rem] {return $res}
        lappend res $rem
        set a ${rem}0 ;# fancy multiplication by 10 :-)
    }
 }
 proc in {list element} {expr [lsearch -exact $list $element]>=0}

if 0 {

Lars H again: Reaching $rem==0 does not (as the above procedure claims) mean that the sequence of remainders is aperiodic, but simply that the period length is 1. Compare with decimal fractions: a number has an aperiodic decimal fraction if and only if it is irrational.

Some tests:

 % rem-orbit 1 7
 1 3 2 6 4 5
 % rem-orbit 2 7
 2 6 4 5 1 3

The orbits look different - and yet are the same: if you just rotate the second one so that the smallest element comes first, it equals the first. This normalization can be easily coded:}

 proc normalize ring {
    set pos [lsearch $ring [min $ring]]
    if $pos {
        concat [lrange $ring $pos end] [lrange $ring 0 [expr $pos-1]]
    } else {set ring} ;# return it unchanged
 }
 #-- numeric minimum of a list
 proc min list {lindex [lsort -integer $list] 0}

if 0 {Test:

 % normalize [rem-orbit 2 7]
 1 3 2 6 4 5

How many distinct remainder orbits does a natural number have? Depends on the number, of course. Here's a routine that for a number n, tries all remainders of dividing from 1 to n-1 by n; normalizes the resulting rings, and keeps only the distinct ones: }

 proc rem-orbits n {
    set res {}
    for {set i 1} {$i<$n} {incr i} {
        ladd res [normalize [rem-orbit $i $n]]
    }
    set res
 }
 #-- add an element to a list, if not contained yet
 proc ladd {listVar element} {
    upvar 1 $listVar list
    if ![in $list $element] {lappend list $element}
 }

if 0 {Here's how to get the period (the sequence of repeating digits) from a remainder orbit:}

 proc period {remorbit n} {
    set res ""
    foreach i $remorbit {append res [expr {(10*$i)/$n}]}
    set res
 }

if 0 {Test again:

 % period [rem-orbit 1 17] 17
 0588235294117647
 % period [rem-orbit 2 17] 17
 1176470588235294
 % period [rem-orbit 3 17] 17
 1764705882352941

And now, let's just look at various numbers and their rem-orbit sets. The most interesting and regular results come from prime numbers. I made the following observations:

  • A number n has n-1 possible non-zero remainders
  • They either form one big orbit, or p orbits of q elements (e.g. 13:
   p=2,q=6) where p*q+1=n
  • If the orbits are not all of equal length, the number is not prime
 % rem-orbits 3
 1 2
 % rem-orbits 5
 aperiodic 5 ;# because it divides 10 without remainder
 % rem-orbits 7
 {1 3 2 6 4 5}
 % rem-orbits 9
 1 2 3 4 5 6 7 8 ;# eight tiny one-element orbits...
 % rem-orbits 11
 {1 10} {2 9} {3 8} {4 7} {5 6} ;# five two-orbits, that all add up to 11
 % rem-orbits 13
 {1 10 9 12 3 4} {2 7 5 11 6 8} ;# two six-orbits
 % rem-orbits 17
 {1 10 15 14 4 6 9 5 16 7 2 3 13 11 8 12}
 % rem-orbits 19
 {1 10 5 12 6 3 11 15 17 18 9 14 7 13 16 8 4 2}
 % rem-orbits 21 ;# this is funny - you see the heritage of factors 7 and 3 
 {1 10 16 13 4 19} {2 20 11 5 8 17} {3 9 6 18 12 15} 7 14
 % rem-orbits 23
 {1 10 8 11 18 19 6 14 2 20 16 22 13 15 12 5 4 17 9 21 3 7}
 % rem-orbits 29
 {1 10 13 14 24 8 22 17 25 18 6 2 20 26 28 19 16 15 5 21 7 12 4 11 23 27 9 3}
 % rem-orbits 31 ;# two 15-orbits
 {1 10 7 8 18 25 2 20 14 16 5 19 4 9 28} {3 30 21 24 23 13 6 29 11 17 15 26 12 27 22}
 % rem-orbits 37 ;# twelve 3-orbits
 {1 10 26} {2 20 15} {3 30 4} {5 13 19} {6 23 8} {7 33 34}
 {9 16 12} {11 36 27} {14 29 31} {17 22 35} {18 32 24} {21 25 28}
 % rem-orbits 39
 {1 10 22 25 16 4} {2 20 5 11 32 8} {3 30 27 36 9 12} {6 21 15 33 18 24}
 {7 31 37 19 34 28} 13 {14 23 35 38 29 17} 26 ;# see? not prime!
 % rem-orbits 41
 {1 10 18 16 37} {2 20 36 32 33} {3 30 13 7 29} {4 40 31 23 25}
 {5 9 8 39 21} {6 19 26 14 17} {11 28 34 12 38} {15 27 24 35 22}
 % rem-orbits 43 ;# two 21-orbits
 {1 10 14 11 24 25 35 6 17 41 23 15 21 38 36 16 31 9 4 40 13}
 {2 20 28 22 5 7 27 12 34 39 3 30 42 33 29 32 19 18 8 37 26}
 % rem-orbits 47 ;# one long orbit
 {1 10 6 13 36 31 28 45 27 35 21 22 32 38 4 40 24 5 3 30 18 39 14
 46 37 41 34 11 16 19 2 20 12 26 25 15 9 43 7 23 42 44 17 29 8 33}
 % rem-orbits 51
 {1 10 49 31 4 40 43 22 16 7 19 37 13 28 25 46}
 {2 20 47 11 8 29 35 44 32 14 38 23 26 5 50 41}
 {3 30 45 42 12 18 27 15 48 21 6 9 39 33 24 36} 17 34 ;# not prime!
 % rem-orbits 53 ;# four 13-orbits
 {1 10 47 46 36 42 49 13 24 28 15 44 16}
 {2 20 41 39 19 31 45 26 48 3 30 35 32}
 {4 40 29 25 38 9 37 52 43 6 7 17 11}
 {5 50 23 18 21 51 33 12 14 34 22 8 27}

}

Lars H: The second of your observations above isn't too hard to prove. What happens is that when n is a prime then the nonzero elements, in the ring Z_n of integers modulo n, form a group under multiplication. The element 10 generates a subgroup of this group, which shows up as the "rem-ring" containing the element 1 in your lists above. The other "rem-rings" are the remaining cosets of this subgroup. It is a fairly basic theorem in group theory that all cosets of a subgroup have the same size. One way to prove it is to observe that multiplication by a suitable group element gives rise to a bijection between the elements of the cosets. q is simply the size of the subgroup generated by 10 and p is the number of its cosets.


Category Mathematics