LargeInt.st
author claus
Fri, 25 Feb 1994 14:00:53 +0100
changeset 56 be0ed17e6f85
parent 54 06dbdeeed4f9
child 68 59faa75185ba
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1988 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
Integer subclass:#LargeInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'sign digitArray'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'Magnitude-Numbers'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
LargeInteger comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
    22
COPYRIGHT (c) 1988 by Claus Gittinger
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
This class provides arbitrary precision integers. These are represented as:
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
  sign (-1/0/+1) and, if sign ~~ 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
  an Array of digits with 4 digits per element; 
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
  least significant 4 digits at index 1 ...
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
This is definitely not a good (fast) implementation -
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
but ok for now, since LargeIntegers are not used very often.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
It will be reimplemented when everything else runs fine and a need arises
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
(or someone rewrites it and sends me the code :-).
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    35
$Header: /cvs/stx/stx/libbasic/Attic/LargeInt.st,v 1.7 1994-02-25 12:58:55 claus Exp $
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
!LargeInteger class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
new:numberOfDigits
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
    "catch creation message"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
    self error:'LargeIntegers cannot be created with new'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
a27a279701f8 Initial revision
claus
parents:
diff changeset
    46
new
a27a279701f8 Initial revision
claus
parents:
diff changeset
    47
    "catch creation message"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
    self error:'LargeIntegers cannot be created with new'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
a27a279701f8 Initial revision
claus
parents:
diff changeset
    52
value:aSmallInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    53
    "create and return a new LargeInteger with value taken from
a27a279701f8 Initial revision
claus
parents:
diff changeset
    54
     the argument, aSmallInteger"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    55
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
    ^ self basicNew value:aSmallInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
    "LargeInteger value:3689"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
a27a279701f8 Initial revision
claus
parents:
diff changeset
    61
valueLow:lowBits hi:hiBits
a27a279701f8 Initial revision
claus
parents:
diff changeset
    62
    "create and return a new LargeInteger with value taken from
2
claus
parents: 1
diff changeset
    63
     the two 16-bit signed args. This method is called from the runtime
claus
parents: 1
diff changeset
    64
     system, when an integer result has to be converted to a Large."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
    hiBits < 0 ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
        ^ ((self value:hiBits negated) * 16r10000 + lowBits) negated
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
    ^ (self value:hiBits) * 16r10000 + lowBits
2
claus
parents: 1
diff changeset
    70
!
claus
parents: 1
diff changeset
    71
claus
parents: 1
diff changeset
    72
unsignedValueLow:lowBits hi:hiBits
claus
parents: 1
diff changeset
    73
    "create and return a new LargeInteger with value taken from
claus
parents: 1
diff changeset
    74
     the two 16-bit unsigned args. This method is called from the runtime
claus
parents: 1
diff changeset
    75
     system, when an integer result has to be converted to a Large."
claus
parents: 1
diff changeset
    76
claus
parents: 1
diff changeset
    77
    ^ (self value:hiBits) * 16r10000 + lowBits
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
!LargeInteger methodsFor:'coercing & converting'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
coerce:aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
    "return the argument as a LargeInteger"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
    ^ aNumber asLargeInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
asLargeInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
    "return a LargeInteger with same value as myself - thats me"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
asSmallInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
    "return a SmallInteger with same value as myself - the result
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
     is invalid if the receivers value cannot be represented
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
     as a SmallInteger"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
    |value|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
    value := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
    (sign == 0) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
        digitArray reverseDo:[:aDigit |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
            value := (value times:10000) + aDigit 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
        (sign < 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
            value := value negated
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
    ^ value
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
asFloat
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
    "return a Float with same value as myself"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
    |newFloat|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
    newFloat := 0.0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
    (sign == 0) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
        digitArray reverseDo:[:aDigit |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
            newFloat := (newFloat * 10000.0) + aDigit asFloat
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
        (sign < 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
            newFloat := newFloat negated
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
    ^ newFloat
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
value:aSmallInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
    "return a new LargeInteger with value taken from a SmallInteger"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
    |absValue 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
     index "{ Class: SmallInteger }"|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
    (aSmallInteger == 0) ifTrue: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
        digitArray := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
        sign := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
        ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
    (aSmallInteger < 0) ifTrue: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
        sign := -1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
        absValue := aSmallInteger negated
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
    ] ifFalse: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
        sign := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
        absValue := aSmallInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
    digitArray := Array new:3.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
    index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
    [absValue == 0] whileFalse: [
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
        digitArray at:index put:(absValue \\ 10000).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
        absValue := absValue // 10000.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
        index := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
    [index <= 3] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
        digitArray at:index put:0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
        index := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
    
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
!LargeInteger methodsFor:'comparing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
= aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
    "return true, if the argument, aNumber has the same value as
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
     the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
    (aNumber class == LargeInteger) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
        aNumber respondsToArithmetic ifFalse:[ ^ false ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
        ^ self retry:#= coercing:aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
    (aNumber sign == sign) ifFalse:[^ false].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
    ^ self absEq:aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
< aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
    "return true, if the argument, aNumber is greater than the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
    |otherSign|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
    (aNumber class == LargeInteger) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
        ^ self retry:#< coercing:aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
    otherSign := aNumber sign.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
    (sign > 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
        "I am positive"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
        (otherSign > 0) ifTrue:[^ self absLess:aNumber].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
        ^ false "aNumber is <= 0"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
    (sign == 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   191
        (otherSign > 0) ifTrue:[^ true].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
        ^ false
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
    "I am negative"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
    (otherSign > 0) ifTrue:[^ true].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
    (otherSign == 0) ifTrue:[^ true].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
    ^ (self absLess:aNumber) not
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
!LargeInteger methodsFor:'arithmetic'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
+ aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
    "return the sum of the receiver and the argument, aNumber"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
    |otherSign|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
    (aNumber class == LargeInteger) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
        ^ self retry:#+ coercing:aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
    otherSign := aNumber sign.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
    (sign > 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
        "I am positive"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
        (otherSign > 0) ifTrue:[^ self absPlus:aNumber].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
        (otherSign < 0) ifTrue:[^ self absMinus:aNumber].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
        ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
    (sign == 0) ifTrue:[^ aNumber].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
    "I am negative"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
    (otherSign > 0) ifTrue:[^ aNumber absMinus:self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
    (otherSign < 0) ifTrue:[^ (self absPlus:aNumber) negated].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
- aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
    "return the difference of the receiver and the argument, aNumber"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
    |otherSign|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
    (aNumber class == LargeInteger) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
        ^ self retry:#- coercing:aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
    otherSign := aNumber sign.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
    (sign > 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
        "I am positive"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
        (otherSign > 0) ifTrue:[^ self absMinus:aNumber].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
        (otherSign < 0) ifTrue:[^ self absPlus:aNumber].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   238
        ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   240
    (sign == 0) ifTrue:[^ aNumber negated].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
    "I am negative"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
    (otherSign > 0) ifTrue:[^ (self absPlus:aNumber) negated].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
    (otherSign < 0) ifTrue:[^ (self absMinus:aNumber) negated].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
a27a279701f8 Initial revision
claus
parents:
diff changeset
   247
* aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   248
    "return the product of the receiver and the argument, aNumber"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   249
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
    |otherSign|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
    (aNumber = 10) ifTrue:[
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   253
        ^ self simpleDeepCopy mul10
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   254
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
    (aNumber class == LargeInteger) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   256
        ^ self retry:#* coercing:aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   257
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
    otherSign := aNumber sign.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
   
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
    (sign == 0) ifTrue:[^ 0].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
    (sign == otherSign) ifTrue:[^ self absMul:aNumber].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
    (otherSign == 0) ifTrue:[^ 0].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
    ^ (self absMul:aNumber) negated
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
/ aNumber
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   267
    "return the quotient of the receivers and the argument, aNumber"
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   268
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   269
    aNumber isInteger ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   270
        ^ (Fraction numerator:self
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   271
                  denominator:aNumber) reduced
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   272
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   273
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
    "this is a q&d hack - we loose lots of precision here ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
    ^ (self asFloat / aNumber asFloat)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
    
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
// aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
    "return the quotient of the receiver and the argument, aNumber"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
44
b262907c93ea *** empty log message ***
claus
parents: 13
diff changeset
   281
    |otherSign|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
    otherSign := aNumber sign.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   285
    (aNumber class == SmallInteger) ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   286
        sign < 0 ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   287
            (sign == otherSign) ifTrue:[^ (self negated absFastDiv:aNumber negated) at:1].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   288
            ^ ((self negated absFastDiv:aNumber) at:1) negated
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   289
        ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   290
        (sign == otherSign) ifTrue:[^ (self absFastDiv:aNumber) at:1].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   291
        ^ ((self absFastDiv:aNumber negated) at:1) negated
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
    ].
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   293
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   294
    (aNumber class == LargeInteger) ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   295
        sign < 0 ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   296
            (sign == otherSign) ifTrue:[^ (self negated absDiv:aNumber negated) at:1].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   297
            ^ ((self negated absDiv:aNumber) at:1) negated
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   298
        ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   299
        (sign == otherSign) ifTrue:[^ (self absDiv:aNumber) at:1].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   300
        ^ ((self absDiv:aNumber negated) at:1) negated
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   301
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   302
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   303
    ^ self retry:#// coercing:aNumber
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
    
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
\\ aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
    "return the remainder of division of the receiver by the argument, aNumber"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
    |otherSign|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   311
    otherSign := aNumber sign.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   312
    (aNumber class == SmallInteger) ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   313
        sign < 0 ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   314
            (sign == otherSign) ifTrue:[^ (self negated absFastDiv:aNumber negated) at:2].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   315
            ^ ((self negated absFastDiv:aNumber) at:2) negated
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   316
        ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   317
        (sign == otherSign) ifTrue:[^ (self absFastDiv:aNumber) at:2].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   318
        ^ ((self absFastDiv:aNumber negated) at:2) negated
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   319
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   320
    (aNumber class == LargeInteger) ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   321
        sign < 0 ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   322
            (sign == otherSign) ifTrue:[^ (self negated absDiv:aNumber negated) at:2].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   323
            ^ ((self negated absDiv:aNumber) at:2) negated
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   324
        ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   325
        (sign == otherSign) ifTrue:[^ (self absDiv:aNumber) at:2].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   326
        ^ ((self absDiv:aNumber negated) at:2) negated
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   329
    ^ self retry:#\\ coercing:aNumber
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
negated
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
    "return a LargeInteger with value negated from receivers value"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
    |newNumber|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
    (sign == 0) ifTrue:[^ 0].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
    newNumber := self shallowCopy.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
    newNumber sign:(sign negated).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
    ^ newNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   342
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
!LargeInteger methodsFor:'bit operations'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
bitAnd:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
    "q & d hack to make Random work;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
     this works only correctly, if my value can be represented
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
     as a SmallInteger"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
    ^ self asSmallInteger bitAnd:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
!LargeInteger methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
sign
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
    "return the sign of the receiver"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
    ^ sign
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
odd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
    "return true if the receiver is odd"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
    ^ (digitArray at:1) even
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
even
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
    "return true if the receiver is even"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   369
a27a279701f8 Initial revision
claus
parents:
diff changeset
   370
    ^ (digitArray at:1) even
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
negative
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
    "return true, if the receiver is < 0"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
    ^ (sign < 0)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   378
a27a279701f8 Initial revision
claus
parents:
diff changeset
   379
positive
a27a279701f8 Initial revision
claus
parents:
diff changeset
   380
    "return true, if the receiver is >= 0"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   381
a27a279701f8 Initial revision
claus
parents:
diff changeset
   382
    ^ (sign >= 0)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   383
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   384
a27a279701f8 Initial revision
claus
parents:
diff changeset
   385
strictlyPositive
a27a279701f8 Initial revision
claus
parents:
diff changeset
   386
    "return true, if the receiver is > 0"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   387
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
    ^ (sign > 0)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
!LargeInteger methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
absEq:aLargeInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
    "return true, if abs(self) = abs(theArgument)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
    |len1 "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
     len2 "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
     d1   "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
     d2   "{ Class: SmallInteger }"
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   400
     otherDigitArray |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
    len1 := digitArray size.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   403
    otherDigitArray := aLargeInteger digits.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   404
    len2 := otherDigitArray size.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
    [(digitArray basicAt:len1) == 0] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
        len1 := len1 - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
    ].
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   409
    [(otherDigitArray basicAt:len2) == 0] whileTrue:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
        len2 := len2 - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   411
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
    (len1 ~~ len2) ifTrue:[^ false].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
    [len1 > 0] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   414
        d1 := digitArray basicAt:len1.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   415
        d2 := otherDigitArray basicAt:len1.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
        (d1 ~~ d2) ifTrue:[^ false].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
        len1 := len1 - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   421
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
absLess:aLargeInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
    "return true, if abs(self) < abs(theArgument)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
    |len1 "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
     len2 "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
     d1   "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
     d2   "{ Class: SmallInteger }"
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   429
     otherDigitArray |
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
    len1 := digitArray size.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   432
    otherDigitArray := aLargeInteger digits.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   433
    len2 := otherDigitArray size.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
    [(digitArray basicAt:len1) == 0] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
        len1 := len1 - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
    ].
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   438
    [(otherDigitArray basicAt:len2) == 0] whileTrue:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
        len2 := len2 - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
    (len1 < len2) ifTrue:[^ true].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
    (len1 > len2) ifTrue:[^ false].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
    [len1 > 0] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
        d1 := digitArray basicAt:len1.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   446
        d2 := otherDigitArray basicAt:len1.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
        (d1 < d2) ifTrue:[^ true].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
        (d1 > d2) ifTrue:[^ false].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   449
        len1 := len1 - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   450
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   451
    ^ false
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   453
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
absPlus:aLargeInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
    "return a LargeInteger representing abs(self) + abs(theArgument)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   456
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   457
    |result done otherDigitArray resultDigitArray
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
     len1  "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   459
     len2  "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   460
     index "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
     carry "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
     sum   "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
    len1 := digitArray size.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   465
    otherDigitArray := aLargeInteger digits.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   466
    len2 := otherDigitArray size.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
    result := LargeInteger basicNew 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   469
                           numberOfDigits:((len1 max: len2) + 1).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   470
    result sign:1.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   471
    resultDigitArray := result digits.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   472
a27a279701f8 Initial revision
claus
parents:
diff changeset
   473
    index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   474
    carry := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
    done := false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   477
    [done] whileFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   478
        sum := carry.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   479
        (index <= len1) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
            sum := sum + (digitArray basicAt:index).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
            (index <= len2) ifTrue:[
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   482
                sum := sum + (otherDigitArray basicAt:index)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   483
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   484
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   485
            (index <= len2) ifTrue:[
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   486
                sum := sum + (otherDigitArray basicAt:index)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   487
            ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   488
                "end reached"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   489
                done := true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   491
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
        (sum > 9999) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   493
            carry := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
            sum := sum - 10000
a27a279701f8 Initial revision
claus
parents:
diff changeset
   495
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   496
            carry := 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   497
        ].
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   498
        resultDigitArray basicAt:index put:sum.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   499
        index := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   500
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   501
    ^ result normalize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   502
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   503
a27a279701f8 Initial revision
claus
parents:
diff changeset
   504
absMinus:aLargeInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   505
    "return a LargeInteger representing abs(self) - abs(theArgument)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   506
a27a279701f8 Initial revision
claus
parents:
diff changeset
   507
    |result done
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   508
     otherDigitArray resultDigitArray
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   509
     len1   "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   510
     len2   "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   511
     index  "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   512
     borrow "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   513
     diff   "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   514
     sum    "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   515
     carry  "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   516
a27a279701f8 Initial revision
claus
parents:
diff changeset
   517
    len1 := digitArray size.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   518
    otherDigitArray := aLargeInteger digits.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   519
    len2 := otherDigitArray size.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   520
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
    result := LargeInteger basicNew 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
                           numberOfDigits:((len1 max: len2) + 1).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
    result sign:1.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   524
    resultDigitArray := result digits.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
    index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
    borrow := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
    done := false.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
    [done] whileFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
        diff := borrow.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
        (index <= len1) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   533
            diff := diff + (digitArray basicAt:index).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
            (index <= len2) ifTrue:[
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   535
                diff := diff - (otherDigitArray basicAt:index)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   537
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   538
            (index <= len2) ifTrue:[
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   539
                diff := diff - (otherDigitArray basicAt:index)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
            ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
                "end reached"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   542
                done := true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   543
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   544
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
        (diff < 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
            borrow := -1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
            diff := diff + 10000
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
            borrow := 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
        ].
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   551
        resultDigitArray basicAt:index put:diff.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
        index := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
    (borrow ~~ 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
        result sign: -1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
        carry := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
        1 to:(index - 1) do:[:i |
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   558
            sum := ((resultDigitArray at:i) + carry - 10000) negated.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   559
            resultDigitArray at:i put:sum.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
            carry := 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
    ^ result normalize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
absMul:aLargeInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
    "return a LargeInteger representing abs(self) * abs(theArgument)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   569
    |result otherDigitArray resultDigitArray
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
     len1     "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
     len2     "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
     dstIndex "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
     carry    "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
     prod     "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
    len1 := digitArray size.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   577
    otherDigitArray := aLargeInteger digits.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   578
    len2 := otherDigitArray size.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   579
a27a279701f8 Initial revision
claus
parents:
diff changeset
   580
    result := LargeInteger basicNew numberOfDigits:(len1 + len2 + 1).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   581
    result sign:1.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   582
    resultDigitArray := result digits.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   583
a27a279701f8 Initial revision
claus
parents:
diff changeset
   584
    "clear result"
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   585
    resultDigitArray atAllPut:0.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   586
a27a279701f8 Initial revision
claus
parents:
diff changeset
   587
    1 to:len1 do:[:index1 |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   588
        1 to:len2 do:[:index2 |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   589
            dstIndex := index1 + index2 - 1.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   590
            prod := (digitArray basicAt:index1) * (otherDigitArray basicAt:index2).
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   591
            prod := prod + (resultDigitArray basicAt:dstIndex).
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   592
            resultDigitArray basicAt:dstIndex put:(prod \\ 10000).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
            carry := prod // 10000.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   594
            (carry ~~ 0) ifTrue:[
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   595
                resultDigitArray basicAt:(dstIndex + 1)
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   596
                                 put:(resultDigitArray basicAt:(dstIndex + 1)) + carry
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   600
    ^ result normalize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   601
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   603
absFastDiv:aSmallInteger
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   604
    "return an array with two LargeIntegers representing
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   605
     abs(self) // aSmallInteger and abs(self) \\ aSmallInteger"
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   606
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   607
    |tmp1 prevRest
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   608
     count "{ Class: SmallInteger }"
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   609
     newDigitArray result|
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   610
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   611
    self == 0 ifTrue:[^ 0].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   612
    aSmallInteger == 0 ifTrue:[^ self divideByZeroError].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   613
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   614
    self < aSmallInteger ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   615
        ^ Array with:0 with:self
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   616
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   617
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   618
    prevRest := 0.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   619
    count := digitArray size.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   620
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   621
    result := LargeInteger basicNew numberOfDigits:count.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   622
    result sign:1.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   623
    newDigitArray := result digits.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   624
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   625
    count to:1 by:-1 do:[:i |
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   626
        tmp1 := digitArray at:i.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   627
        tmp1 := (tmp1 + (prevRest * 10000)).
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   628
        newDigitArray at:i put:tmp1 // aSmallInteger.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   629
        prevRest := (tmp1 \\ aSmallInteger).
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   630
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   631
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   632
    ^ Array with:(result normalize) with:prevRest
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   633
!
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   634
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   635
absDiv:anInteger
a27a279701f8 Initial revision
claus
parents:
diff changeset
   636
    "return an array with two LargeIntegers representing
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   637
     abs(self) // abs(theArgument) and abs(self) \\ abs(theArgument).
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   638
     This needs a rewrite."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   639
a27a279701f8 Initial revision
claus
parents:
diff changeset
   640
    |tmp1 tmp2 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   641
     rem 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   642
     count "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   643
     digit "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   644
a27a279701f8 Initial revision
claus
parents:
diff changeset
   645
    self == 0 ifTrue:[^ 0].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   646
    anInteger == 0 ifTrue:[^ self divideByZeroError].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   647
a27a279701f8 Initial revision
claus
parents:
diff changeset
   648
    self < anInteger ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   649
        ^ Array with:0 with:self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   650
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   651
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   652
    tmp1 := self simpleDeepCopy.
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
   653
    tmp2 := anInteger simpleDeepCopy.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   654
    count := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   655
    [tmp2 < tmp1] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   656
        tmp2 mul10.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   657
        count := count + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   658
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   659
a27a279701f8 Initial revision
claus
parents:
diff changeset
   660
    tmp2 div10.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   661
a27a279701f8 Initial revision
claus
parents:
diff changeset
   662
    rem := 0 asLargeInteger. 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   663
    [count == 0] whileFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   664
        digit := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   665
        [tmp1 >= tmp2] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   666
            digit := digit + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   667
            tmp1 := tmp1 - tmp2
a27a279701f8 Initial revision
claus
parents:
diff changeset
   668
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   669
        rem := rem * 10 + digit.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   670
        tmp2 div10.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
        count := count - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   672
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   673
    ^ Array with:rem with:tmp1 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   674
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   675
a27a279701f8 Initial revision
claus
parents:
diff changeset
   676
mul10
a27a279701f8 Initial revision
claus
parents:
diff changeset
   677
    "destructively multiply the receiver by 10.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   678
     private - used for division only"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   679
a27a279701f8 Initial revision
claus
parents:
diff changeset
   680
    |carry "{ Class: SmallInteger }"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   681
     prod  "{ Class: SmallInteger }"|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   682
a27a279701f8 Initial revision
claus
parents:
diff changeset
   683
    carry := 0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   684
    1 to:(digitArray size) do:[:index |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   685
        prod := (digitArray at:index) * 10 + carry.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   686
        digitArray at:index put:prod \\ 10000.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   687
        carry := prod // 10000
a27a279701f8 Initial revision
claus
parents:
diff changeset
   688
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   689
    carry ~~ 0 ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   690
        digitArray := digitArray copyWith:carry
a27a279701f8 Initial revision
claus
parents:
diff changeset
   691
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   692
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   693
a27a279701f8 Initial revision
claus
parents:
diff changeset
   694
div10
a27a279701f8 Initial revision
claus
parents:
diff changeset
   695
    "destructively divide the receiver by 10.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   696
     private - used for division only"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   697
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   698
    |nDigits "{ Class: SmallInteger }"|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   699
a27a279701f8 Initial revision
claus
parents:
diff changeset
   700
    nDigits := digitArray size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   701
    1 to:(nDigits - 1) do:[:index |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   702
        digitArray at:index put:((digitArray at:index) // 10
a27a279701f8 Initial revision
claus
parents:
diff changeset
   703
                                + ((digitArray at:index + 1) \\ 10 * 1000))
a27a279701f8 Initial revision
claus
parents:
diff changeset
   704
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   705
    digitArray at:nDigits put:(digitArray at:nDigits) // 10
a27a279701f8 Initial revision
claus
parents:
diff changeset
   706
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   707
a27a279701f8 Initial revision
claus
parents:
diff changeset
   708
normalize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   709
    "if the receiver can be represented as a SmallInteger, return
a27a279701f8 Initial revision
claus
parents:
diff changeset
   710
     a SmallInteger with my value; otherwise return self with leading
a27a279701f8 Initial revision
claus
parents:
diff changeset
   711
     zeros removed"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   712
a27a279701f8 Initial revision
claus
parents:
diff changeset
   713
    |index "{ Class: SmallInteger }" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   714
a27a279701f8 Initial revision
claus
parents:
diff changeset
   715
    index := digitArray size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   716
    [(index > 0) and:[(digitArray at:index) == 0]] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   717
        index := index - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   718
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   719
    (index == 1) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   720
        ^ (digitArray at:1) * sign
a27a279701f8 Initial revision
claus
parents:
diff changeset
   721
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   722
    (index == 2) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   723
        ^ ((digitArray at:2) * 10000 + (digitArray at:1)) * sign
a27a279701f8 Initial revision
claus
parents:
diff changeset
   724
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   725
    (index == 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   726
        ^ 0
a27a279701f8 Initial revision
claus
parents:
diff changeset
   727
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   728
    (index ~~ digitArray size) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   729
        digitArray := digitArray copyFrom:1 to:index
a27a279701f8 Initial revision
claus
parents:
diff changeset
   730
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   731
    ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   732
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   733
a27a279701f8 Initial revision
claus
parents:
diff changeset
   734
digits
a27a279701f8 Initial revision
claus
parents:
diff changeset
   735
    ^ digitArray
a27a279701f8 Initial revision
claus
parents:
diff changeset
   736
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   737
a27a279701f8 Initial revision
claus
parents:
diff changeset
   738
numberOfDigits
a27a279701f8 Initial revision
claus
parents:
diff changeset
   739
    ^ digitArray size
a27a279701f8 Initial revision
claus
parents:
diff changeset
   740
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   741
a27a279701f8 Initial revision
claus
parents:
diff changeset
   742
numberOfDigits:nDigits
a27a279701f8 Initial revision
claus
parents:
diff changeset
   743
    digitArray := Array new:nDigits
a27a279701f8 Initial revision
claus
parents:
diff changeset
   744
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   745
a27a279701f8 Initial revision
claus
parents:
diff changeset
   746
sign:aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   747
    sign := aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   748
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   749
a27a279701f8 Initial revision
claus
parents:
diff changeset
   750
!LargeInteger methodsFor:'printing & storing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   751
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   752
storeOn:aStream
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   753
    "append a representation of the receiver to aStream, which can
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   754
     be used to reconstruct the receiver."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   755
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   756
    self printOn:aStream.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   757
    aStream nextPutAll:' asLargeInteger'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   758
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   759
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   760
printStringRadix:aRadix
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   761
    "return a printed representation of the receiver as a string"
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   762
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   763
    |index fourDigits n s|
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   764
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   765
    "this one can handle base10 fast - others are done by general method"
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   766
    aRadix ~~ 10 ifTrue:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   767
        ^ super printStringRadix:aRadix
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   768
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   769
a27a279701f8 Initial revision
claus
parents:
diff changeset
   770
    index := digitArray size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   771
    [(index > 1) and:[(digitArray at:index) == 0]] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   772
        index := index - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   773
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   774
    (sign == 0) ifTrue: [^ '0'].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   775
    (sign == -1) ifTrue: [
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   776
        s := '-'
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   777
    ] ifFalse:[
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   778
        s := ''
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   779
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   780
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   781
    s := s , (digitArray basicAt:index) printString.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   782
    index := index - 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   783
    [index > 0] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   784
        fourDigits := (digitArray basicAt:index) printString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   785
        n := fourDigits size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   786
        (n < 4) ifTrue:[
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   787
            s := s , (String new:(3 - n) withAll:$0)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   788
        ].
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   789
        s := s , fourDigits.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   790
        index := index - 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   791
    ].
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   792
    ^ s
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   793
! !