Integer.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 28 Dec 2015 08:25:51 +0100
branchjv
changeset 19002 465130ccbe52
parent 18983 9f3e91ff6418
child 19016 48f3fea35b47
permissions -rw-r--r--
Fixed LargeInteger printing on 64bit builds. The Integer>>printOn:radix:... diverged on 64bit builds, i.e., the it run really long while on 32bits it finishes relatively quickly. The culprit seems to be an "optimization" which try double the portion done in each iteration when running 64bit. I do not fully understand the code, but disabling this part seems to fix this. This commit fixes RegressionTests::IntegerTest>>testLargeIntegerHelpers.
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
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
     3
              All Rights Reserved
1
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
"
5435
ad6612cc6848 oops odd/even fallback was wrong
Claus Gittinger <cg@exept.de>
parents: 5238
diff changeset
    12
"{ Package: 'stx:libbasic' }"
ad6612cc6848 oops odd/even fallback was wrong
Claus Gittinger <cg@exept.de>
parents: 5238
diff changeset
    13
17488
9da696f7560f class: Integer
Claus Gittinger <cg@exept.de>
parents: 17248
diff changeset
    14
"{ NameSpace: Smalltalk }"
9da696f7560f class: Integer
Claus Gittinger <cg@exept.de>
parents: 17248
diff changeset
    15
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
Number subclass:#Integer
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    17
	instanceVariableNames:''
18865
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
    18
	classVariableNames:'BCDConversionErrorSignal PrimeCache'
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    19
	poolDictionaries:''
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    20
	category:'Magnitude-Numbers'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
    23
Object subclass:#ModuloNumber
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    24
	instanceVariableNames:'modulus reciprocal shift'
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    25
	classVariableNames:''
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    26
	poolDictionaries:''
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    27
	privateIn:Integer
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
    28
!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
    29
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
    30
!Integer class methodsFor:'documentation'!
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    31
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    32
copyright
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    33
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    34
 COPYRIGHT (c) 1988 by Claus Gittinger
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    35
              All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    37
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    38
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    39
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    40
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    41
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    42
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    43
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    44
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    46
documentation
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    47
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    48
    abstract superclass for all integer numbers.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    49
    See details in concrete subclasses LargeInteger and SmallInteger.
212
3edd10edefaf *** empty log message ***
claus
parents: 202
diff changeset
    50
1892
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1888
diff changeset
    51
    Mixed mode arithmetic:
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    52
        int op int         -> int
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    53
        int op fix         -> fix; scale is fix's scale
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    54
        int op fraction    -> fraction
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    55
        int op float       -> float
1892
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1888
diff changeset
    56
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1210
diff changeset
    57
    [author:]
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    58
        Claus Gittinger
1556
134d96466f5a commentary
Claus Gittinger <cg@exept.de>
parents: 1555
diff changeset
    59
134d96466f5a commentary
Claus Gittinger <cg@exept.de>
parents: 1555
diff changeset
    60
    [see also:]
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    61
        Number
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    62
        LargeInteger SmallInteger
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    63
        Float ShortFloat Fraction FixedPoint
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    64
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    65
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
    67
!Integer class methodsFor:'instance creation'!
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
    68
3044
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    69
byte1:b1 byte2:b2 byte3:b3 byte4:b4
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    70
    "Squeak compatibility:
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    71
     Return an Integer given four value bytes.
15241
735c63d4e41f class: Integer
Claus Gittinger <cg@exept.de>
parents: 15084
diff changeset
    72
     The returned integer is either a Small- or a LargeInteger 
735c63d4e41f class: Integer
Claus Gittinger <cg@exept.de>
parents: 15084
diff changeset
    73
     (on 32bit systems - on 64bit systems, it will be always a SmallInteger)"
3044
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    74
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    75
    |t|
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    76
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    77
    t := b4.
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    78
    t := (t bitShift:8) + b3.
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    79
    t := (t bitShift:8) + b2.
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    80
    ^ (t bitShift:8) + b1.
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    81
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    82
    "
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    83
     (Integer byte1:16r10 byte2:16r32 byte3:16r54 byte4:16r76) hexPrintString
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    84
     (Integer byte1:16r00 byte2:16r11 byte3:16r22 byte4:16r33) hexPrintString
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    85
    "
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    86
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    87
    "Created: 19.10.1997 / 18:08:52 / cg"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    88
    "Modified: 19.10.1997 / 18:09:04 / cg"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    89
!
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    90
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
    91
fastFromString:aString at:startIndex
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
    92
    "return the next unsigned Integer from the string
4610
742650733761 comment
Claus Gittinger <cg@exept.de>
parents: 4609
diff changeset
    93
     as a decimal number, starting at startIndex.
742650733761 comment
Claus Gittinger <cg@exept.de>
parents: 4609
diff changeset
    94
     The number must be in the native machines int range
742650733761 comment
Claus Gittinger <cg@exept.de>
parents: 4609
diff changeset
    95
     (i.e. 63bit on alpha / 31 on all others);
742650733761 comment
Claus Gittinger <cg@exept.de>
parents: 4609
diff changeset
    96
     However, for portability, only use it for 31bit numbers.
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
    97
     No spaces are skipped.
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
    98
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
    99
     This is a specially tuned entry (using a low-level C-call), which
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   100
     returns garbage if the argument string is not a small integer number.
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   101
     It has been added to allow high speed string decomposition into numbers,
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   102
     especially for mass-data."
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   103
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   104
%{   /* NOCONTEXT */
12480
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   105
    if (__isStringLike(aString) && __isSmallInteger(startIndex)) {
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   106
        char *cp = (char *)(__stringVal(aString));
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   107
        int idx = __intVal(startIndex) - 1;
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   108
        unsigned INT val;
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   109
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   110
        if ((unsigned)idx < __stringSize(aString)) {
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   111
            val = atoi(cp + idx);
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   112
            if (val <= _MAX_INT) {
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   113
                RETURN(__mkSmallInteger(val));
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   114
            }
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   115
            RETURN (__MKUINT(val));
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   116
        }
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   117
    }
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   118
%}.
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   119
    self primitiveFailed.
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   120
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   121
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   122
     Integer fastFromString:'12345' at:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   123
     Integer fastFromString:'12345' at:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   124
     Integer fastFromString:'12345' at:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   125
     Integer fastFromString:'12345' at:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   126
     Integer fastFromString:'12345' at:5
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   127
     Integer fastFromString:'1234512345' at:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   128
     Integer fastFromString:'2147483647' at:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   129
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   130
     Integer fastFromString:'4294967295' at:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   131
     Integer fastFromString:'12345' at:6
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   132
     Integer fastFromString:'12345' at:0
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   133
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   134
     Time millisecondsToRun:[
12480
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   135
        100000 timesRepeat:[
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   136
            Integer readFrom:'12345'
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   137
        ]
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   138
     ]
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   139
    "
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   140
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   141
    "
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   142
     Time millisecondsToRun:[
12480
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   143
        100000 timesRepeat:[
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   144
            Integer fastFromString:'12345' at:1
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   145
        ]
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   146
     ]
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   147
    "
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   148
!
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   149
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   150
fromBCDBytes:aByteArray
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   151
    "given a byteArray in BCD format, return an appropriate integer.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   152
     The byteArray must contain the BCD encoded decimal string,
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   153
     starting with the most significant digits.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   154
     This conversion is useful for some communication protocols,
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   155
     or control systems, which represent big numbers this way...
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   156
    "
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   157
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   158
    |val|
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   159
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   160
    val := 0.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   161
    aByteArray do:[:twoDigits |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   162
        |hi lo|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   163
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   164
        hi := (twoDigits bitShift:-4) bitAnd:16r0F.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   165
        lo := twoDigits bitAnd:16r0F.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   166
        val := (val * 100) + (hi * 10) + lo
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   167
    ].
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   168
    ^ val
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   169
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   170
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   171
     Integer fromBCDBytes:#[16r12 16r34 16r56]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   172
     Integer fromBCDBytes:#[16r12 16r34 16r56 16r78]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   173
     Integer fromBCDBytes:#[16r12 16r34 16r56 16r78 16r90]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   174
     Integer fromBCDBytes:#[16r98 16r76 16r54]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   175
     Integer fromBCDBytes:#[16r98 16r76 16r54 16r32]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   176
     Integer fromBCDBytes:#[16r98 16r76 16r54 16r32 16r10]
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   177
     Integer fromBCDBytes:#[16r12 16r34 16r56 16r78 16r90 16r12 16r34 16r56 16r78 16r90]
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   178
    "
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   179
!
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   180
5171
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   181
fromSwappedBCDBytes:aByteArray
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   182
    "given a byteArray in BCD format, return an appropriate integer.
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   183
     The byteArray must contain the BCD encoded decimal string,
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   184
     starting with the LEAST significant digits.
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   185
     This conversion is useful for some communication protocols,
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   186
     or control systems (e.g. SMC), which represent big numbers this way...
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   187
    "
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   188
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   189
    |val|
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   190
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   191
    val := 0.
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   192
    aByteArray do:[:twoDigits |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   193
        |hi lo|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   194
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   195
        lo := (twoDigits bitShift:-4) bitAnd:16r0F.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   196
        hi := twoDigits bitAnd:16r0F.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   197
        lo <= 9 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   198
            val := (val * 100) + (hi * 10) + lo
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   199
        ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   200
            "16rF is used to encode an odd number of digits"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   201
            val := (val * 10) + hi.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   202
        ].
5171
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   203
    ].
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   204
    ^ val
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   205
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   206
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   207
     Integer fromSwappedBCDBytes:#[16r12 16r34 16r56]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   208
     Integer fromSwappedBCDBytes:#[16r12 16r34 16rF6]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   209
     Integer fromSwappedBCDBytes:#[16r12 16r34 16r56 16r78]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   210
     Integer fromSwappedBCDBytes:#[16r12 16r34 16r56 16r78 16r90]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   211
     Integer fromSwappedBCDBytes:#[16r98 16r76 16r54]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   212
     Integer fromSwappedBCDBytes:#[16r98 16r76 16r54 16r32]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   213
     Integer fromSwappedBCDBytes:#[16r98 16r76 16r54 16r32 16r10]
5171
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   214
     Integer fromSwappedBCDBytes:#[16r12 16r34 16r56 16r78 16r90 16r12 16r34 16r56 16r78 16r90]
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   215
    "
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   216
!
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   217
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   218
new:numberOfBytes neg:negative
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   219
    "for ST-80 compatibility:
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   220
     Return an empty Integer (uninitialized value) with space for
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   221
     numberOfBytes bytes (= digitLength). The additional argument
132
ab2cfccd218c *** empty log message ***
claus
parents: 92
diff changeset
   222
     negative specifies if the result should be a negative number.
ab2cfccd218c *** empty log message ***
claus
parents: 92
diff changeset
   223
     The digits can be stored byte-wise into the result, using digitAt:put:"
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   224
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
   225
    ^ LargeInteger basicNew 
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
   226
            numberOfDigits:numberOfBytes
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
   227
            sign:(negative ifTrue:[-1] ifFalse:[1])
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   228
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   229
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   230
readFrom:aStringOrStream
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   231
    "return the next unsigned Integer from the (character-)stream aStream
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   232
     as decimal number.
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   233
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   234
     NOTICE:
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   235
       This behaves different from the default readFrom:, in returning
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   236
       0 (instead of raising an error) in case no number can be read.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   237
       It is unclear, if this is the correct behavior (ST-80 does this)
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   238
       - depending on the upcoming ANSI standard, this may change."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   239
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   240
    ^ self readFrom:aStringOrStream onError:0
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   241
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   242
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   243
     Integer readFrom:(ReadStream on:'foobar')
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   244
     Integer readFrom:(ReadStream on:'foobar') onError:nil
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   245
    "
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   246
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   247
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   248
readFrom:aStringOrStream onError:exceptionBlock
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   249
    "return the next Integer from the (character-)stream aStream,
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   250
     handling initial XXr for arbitrary radix numbers and initial sign.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   251
     Also, all initial whitespace is skipped.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   252
     If the string does not represent a valid integer number,
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   253
     return the value of exceptionBlock."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   254
3995
777470826394 no need for another error-handler blcok in #readFrom:onError:
Claus Gittinger <cg@exept.de>
parents: 3993
diff changeset
   255
    |value|
777470826394 no need for another error-handler blcok in #readFrom:onError:
Claus Gittinger <cg@exept.de>
parents: 3993
diff changeset
   256
7093
60bad14d38fc Convert Object>>errorSignal -> Error
Stefan Vogel <sv@exept.de>
parents: 6907
diff changeset
   257
    Error handle:[:ex |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   258
        ^ exceptionBlock value
1700
25223802076c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1560
diff changeset
   259
    ] do:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   260
        |str nextChar negative|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   261
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   262
        str := aStringOrStream readStream.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   263
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   264
        nextChar := str skipSeparators.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   265
        (nextChar == $-) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   266
            negative := true.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   267
            str next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   268
            nextChar := str peekOrNil
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   269
        ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   270
            negative := false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   271
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   272
        (nextChar isNil or:[nextChar isDigit not]) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   273
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   274
             the string does not represent an integer
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   275
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   276
            ^ exceptionBlock value
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   277
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   278
        value := self readFrom:str radix:10.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   279
        nextChar := str peekOrNil.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   280
        ((nextChar == $r) or:[ nextChar == $R]) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   281
            "-xxr<number> is invalid; should be xxr-<val>"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   282
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   283
            negative ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   284
                'Integer [warning]: invalid (negative) radix ignored' errorPrintCR.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   285
                negative := false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   286
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   287
            str next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   288
            value := self readFrom:str radix:value
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   289
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   290
        negative ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   291
            value := value negated
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   292
        ].
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   293
    ].
3995
777470826394 no need for another error-handler blcok in #readFrom:onError:
Claus Gittinger <cg@exept.de>
parents: 3993
diff changeset
   294
    ^ value
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   295
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   296
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   297
     Integer readFrom:'12345'      onError:['wrong']
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   298
     Integer readFrom:'-12345'     onError:['wrong']
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   299
     Integer readFrom:'+12345'     onError:['wrong']
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   300
     Integer readFrom:'16rFFFF'    onError:['wrong']
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   301
     Integer readFrom:'12345.1234' onError:['wrong']
3995
777470826394 no need for another error-handler blcok in #readFrom:onError:
Claus Gittinger <cg@exept.de>
parents: 3993
diff changeset
   302
     Integer readFrom:'foo'        onError:['wrong']
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   303
     Integer readFrom:'foo'
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   304
    "
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   305
3374
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   306
    "Created: / 16.11.1995 / 22:48:59 / cg"
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   307
    "Modified: / 14.4.1998 / 19:17:28 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   308
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   309
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   310
readFrom:aStringOrStream radix:radix
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   311
    "return the next unsigned Integer from the (character-)stream aStream
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   312
     in radix; (assumes that the initial XXr has already been read).
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   313
     No whitespace-skipping is done.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   314
     Returns 0 if no number available.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   315
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   316
     NOTICE:
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   317
       This behaves different from the default readFrom:, in returning
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   318
       0 (instead of raising an error) in case no number can be read.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   319
       It is unclear, if this is the correct behavior (ST-80 does this)
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   320
       - depending on the upcoming ANSI standard, this may change."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   321
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   322
    ^ self readFrom:aStringOrStream radix:radix onError:0
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   323
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   324
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   325
readFrom:aStringOrStream radix:radix onError:exceptionBlock
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   326
    "return the next unsigned Integer from the (character-)stream aStream
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   327
     in radix; (assumes that the initial XXr has already been read).
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   328
     No whitespace-skipping is done.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   329
     Returns the value of exceptionBlock, if no number is available."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   330
11654
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   331
    |str nextChar nextChar2 nextChar3 nextChar4 value
4169
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   332
     r     "{ Class: SmallInteger }"
11654
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   333
     r2    "{ Class: SmallInteger }"
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   334
     r3    "{ Class: SmallInteger }"
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   335
     r4    "{ Class: SmallInteger }"
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   336
     digit1 digit2 digit3 digit4 |
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   337
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   338
    str := aStringOrStream readStream.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   339
3374
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   340
    nextChar := str peekOrNil.
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   341
    (nextChar notNil and:[nextChar isDigitRadix:radix]) ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   342
        ^ exceptionBlock value
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   343
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   344
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   345
    value := nextChar digitValue.
3374
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   346
    str next.
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   347
    nextChar := str peekOrNil.
4169
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   348
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   349
"/ OLD code
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   350
"/    [nextChar notNil and:[nextChar isDigitRadix:radix]] whileTrue:[
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   351
"/        str next.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   352
"/        value := value * radix + nextChar digitValue.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   353
"/        nextChar := str peekOrNil.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   354
"/    ].
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   355
"/    ^ value.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   356
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   357
    "/ the code below does the same, but is much faster, if the
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   358
    "/ converted number is large
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   359
    "/ (requires only half as many LargeInt multiplications and additions)
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   360
    "/ It should not be slower for smallIntegers.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   361
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   362
    r := radix.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   363
    r2 := r * r.
11654
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   364
    r3 := r2 * r.
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   365
    r4 := r2 * r2.
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   366
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   367
    [nextChar notNil and:[ (digit1 := nextChar digitValueRadix:r) notNil]] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   368
        "/ read 4 chars and pre-compute their value to avoid largeInt operations.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   369
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   370
        str next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   371
        nextChar2 := str peekOrNil.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   372
        (nextChar2 isNil or:[ (digit2 := nextChar2 digitValueRadix:r) isNil]) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   373
            ^ (value * r) + digit1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   374
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   375
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   376
        str next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   377
        nextChar3 := str peekOrNil.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   378
        (nextChar3 isNil or:[ (digit3 := nextChar3 digitValueRadix:r) isNil]) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   379
            ^ (value * r2) + ((digit1*r) + digit2).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   380
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   381
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   382
        str next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   383
        nextChar4 := str peekOrNil.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   384
        (nextChar4 isNil or:[ (digit4 := nextChar4 digitValueRadix:r) isNil]) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   385
            ^ (value * r3) + ((((digit1*r) + digit2)*r) + digit3).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   386
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   387
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   388
        value := (value * r4) + ((((((digit1*r) + digit2)*r) + digit3)*r) + digit4).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   389
        str next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   390
        nextChar := str peekOrNil.
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   391
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   392
    ^ value
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   393
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   394
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   395
     Integer readFrom:(ReadStream on:'12345') radix:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   396
     Integer readFrom:(ReadStream on:'FFFF') radix:16
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   397
     Integer readFrom:(ReadStream on:'1010') radix:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   398
     Integer readFrom:(ReadStream on:'foobar') radix:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   399
     Integer readFrom:(ReadStream on:'foobar') radix:10 onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   400
     Integer readFrom:'gg' radix:10 onError:0
11654
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   401
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   402
     Time millisecondsToRun:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   403
        1000 timesRepeat:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   404
            (String new:1000 withAll:$1) asInteger
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   405
        ]
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   406
     ]
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   407
    "
3374
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   408
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   409
    "Modified: / 14.4.1998 / 19:16:46 / cg"
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   410
!
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   411
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   412
readFromRomanString:aStringOrStream
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   413
    "convert a string or stream containing a roman representation into an integer.
11125
89eb8912ef38 comment
Claus Gittinger <cg@exept.de>
parents: 11095
diff changeset
   414
     Raises a RomanNumberFormatError, if the inputs format is completely wrong.
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   415
     Raises BadRomanNumberFormatError if its wrong, but could be parsed.
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   416
     Notifies via NaiveRomanNumberFormatNotification, if its a bit wrong (naive format).
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   417
     Will read both real and naive roman numbers (see printRomanOn: vs. printRomanOn:naive:),
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   418
     however, a notification is raised for for naive numbers (catch it if you are interested in it)."
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   419
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   420
    |romanValues s c val digitVal prevDigitVal countSame delta
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   421
     stopOnSeparator finish|
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   422
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   423
    romanValues := Dictionary
18230
55511104414b class: Integer
Claus Gittinger <cg@exept.de>
parents: 17488
diff changeset
   424
                    withKeys:'MDCLXVI' "/ #($M $D $C $L $X $V $I)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   425
                    andValues:#(1000 500 100 50 10 5 1).
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   426
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   427
    (stopOnSeparator := aStringOrStream isStream) ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   428
        s := aStringOrStream readStream.
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   429
    ].
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   430
    s atEnd ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   431
        ^ RomanNumberFormatError raiseErrorString:'empty string'
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   432
    ].
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   433
    val := 0.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   434
    prevDigitVal := 99999.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   435
    countSame := 1.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   436
    finish := false.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   437
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   438
    [s atEnd or:[finish]] whileFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   439
        c := s next asUppercase.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   440
        c isSeparator ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   441
            stopOnSeparator ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   442
                ^ RomanNumberFormatError raiseErrorString:'garbage at the end'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   443
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   444
            finish := true.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   445
        ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   446
            digitVal := romanValues at:c ifAbsent:nil.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   447
            digitVal isNil ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   448
                ^ RomanNumberFormatError raiseErrorString:'invalid character'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   449
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   450
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   451
            digitVal = prevDigitVal ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   452
                ( #( 1 10 100 1000) includes:digitVal) ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   453
                    ^ RomanNumberFormatError raiseErrorString:'character may not be repeated'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   454
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   455
                val := val + digitVal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   456
                countSame := countSame + 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   457
                countSame >= 4 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   458
                    digitVal ~= 1000 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   459
                        countSame > 4 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   460
                            "/ this is a bad roman number (such as MCCCCCCCCXXXXXXII);
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   461
                            "/ Its not correct, but sometimes encountered on buildings.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   462
                            "/ If you do not want to be too picky,
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   463
                            "/ provide a proceeding handler in order to proceed the conversion.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   464
                            BadRomanNumberFormatError raiseRequestErrorString:'more than 4 occurrences of same character'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   465
                        ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   466
                            "/ this is a naive roman number (such as VIIII);
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   467
                            "/ Its not correct, but very often encountered (especially as page numbers).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   468
                            "/ The notification below normally goes unnoticed, unless some input validator
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   469
                            "/ wants to be very picky, and treat this as an error.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   470
                            "/ To do so, provide a handler for NaiveRomanNumberFormatNotification.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   471
                            NaiveRomanNumberFormatNotification raiseRequestErrorString:'more than 3 occurrences of same character'.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   472
                        ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   473
                    ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   474
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   475
            ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   476
                digitVal < prevDigitVal ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   477
                    val := val + digitVal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   478
                ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   479
                    countSame == 1 ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   480
                        ^ RomanNumberFormatError raiseErrorString:'invalid character combination'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   481
                    ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   482
                    delta := digitVal - prevDigitVal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   483
                    ( #( 4 9 40 90 400 900) includes:delta) ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   484
                        ^ RomanNumberFormatError raiseErrorString:'invalid character combination'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   485
                    ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   486
                    val := val - prevDigitVal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   487
                    val := val + delta.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   488
                    digitVal := prevDigitVal - 0.1.  "/ trick: prevent prevDigit from arriving again.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   489
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   490
                countSame := 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   491
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   492
            prevDigitVal := digitVal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   493
        ].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   494
    ].
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   495
"/    val > 5000 ifTrue:[
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   496
"/        ^ RomanNumberFormatError raiseErrorStirng:'number out of range (1..5000)'
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   497
"/    ].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   498
    ^ val.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   499
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   500
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   501
     Integer readFromRomanString:'I'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   502
     Integer readFromRomanString:'II'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   503
     Integer readFromRomanString:'III'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   504
     Integer readFromRomanString:'IV'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   505
     Integer readFromRomanString:'clix'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   506
     Integer readFromRomanString:'MIX'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   507
     Integer readFromRomanString:'MCMXCIX'
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   508
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   509
   Naive cases (which are accepted):
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   510
     Integer readFromRomanString:'IIII'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   511
     Integer readFromRomanString:'VIIII'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   512
     Integer readFromRomanString:'CLXXXXVIIII'
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   513
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   514
    Error case (not proceedable):
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   515
     Integer readFromRomanString:'LC'
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   516
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   517
    Error case (proceedable):
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   518
     Integer readFromRomanString:'MCCCCCCCCXXXXXXIIIIII'
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   519
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   520
     BadRomanNumberFormatError ignoreIn:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   521
         Integer readFromRomanString:'MCCCCCCCCXXXXXXIIIIII'
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   522
     ]
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   523
    "
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   524
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   525
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   526
    "naive cases:
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   527
     #(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   528
        'MCMXCIX'           1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   529
        'MCMXCVIIII'        1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   530
        'MCMLXXXXIX'        1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   531
        'MDCCCCXCIX'        1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   532
        'MDCCCCXCVIIII'     1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   533
        'MDCCCCLXXXXIX'     1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   534
        'MDCCCCLXXXXVIIII'  1999
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   535
     ) pairWiseDo:[:goodString :expectedValue |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   536
        (Integer readFromRomanString:goodString onError:nil) ~= expectedValue ifTrue:[self halt].
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   537
     ]
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   538
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   539
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   540
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   541
    "error cases:
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   542
      #(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   543
        'XIIX'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   544
        'VV'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   545
        'VVV'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   546
        'XXL'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   547
        'XLX'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   548
        'LC'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   549
        'LL'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   550
        'DD'
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   551
     ) do:[:badString |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   552
        (Integer readFromRomanString:badString onError:nil) notNil ifTrue:[self halt].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   553
     ]
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   554
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   555
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   556
    "good cases:
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   557
     #( 'I'     1
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   558
        'II'    2
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   559
        'III'   3
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   560
        'IV'    4
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   561
        'V'     5
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   562
        'VI'    6
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   563
        'VII'   7
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   564
        'VIII'  8
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   565
        'IX'    9
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   566
        'X'     10
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   567
        'XI'    11
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   568
        'XII'   12
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   569
        'XIII'  13
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   570
        'XIV'   14
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   571
        'XV'    15
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   572
        'XVI'   16
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   573
        'XVII'  17
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   574
        'XVIII' 18
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   575
        'XIX'   19
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   576
        'XX'    20
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   577
        'XXX'   30
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   578
        'L'     50
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   579
        'XL'    40
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   580
        'LX'    60
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   581
        'LXX'   70
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   582
        'LXXX'  80
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   583
        'CXL'   140
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   584
        'CL'    150
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   585
        'CLX'   160
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   586
        'MMM'                   3000
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   587
        'MMMM'                  4000
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   588
        'MMMMCMXCIX'            4999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   589
        'MMMMMMMMMCMXCIX'       9999
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   590
     ) pairWiseDo:[:goodString :expectedValue |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   591
        (Integer readFromRomanString:goodString onError:nil) ~= expectedValue ifTrue:[self halt].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   592
     ]
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   593
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   594
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   595
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   596
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   597
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   598
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   599
        romanString := String streamContents:[:stream | n printRomanOn:stream].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   600
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   601
     ]
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   602
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   603
!
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   604
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   605
readFromRomanString:aStringOrStream onError:exceptionalValue
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   606
    "convert a string or stream containing a roman representation into an integer.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   607
     Raises an exception, if the inputs format is wrong.
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   608
     Does allow reading of naive (more than 3 in a row) and
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   609
     bad (not using L and D) roman numbers.
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   610
     (Such numbers can be seen on some medevial buildings. "
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   611
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   612
    |val|
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   613
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   614
    RomanNumberFormatError
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   615
        handle:[:ex |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   616
            val := exceptionalValue value
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   617
        ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   618
        do:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   619
            val := self readFromRomanString:aStringOrStream
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   620
        ].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   621
    ^ val
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   622
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   623
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   624
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   625
     Integer readFromRomanString:'I'    onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   626
     Integer readFromRomanString:'II'   onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   627
     Integer readFromRomanString:'III'  onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   628
     Integer readFromRomanString:'IV'   onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   629
     Integer readFromRomanString:'clix' onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   630
     Integer readFromRomanString:'MCMXCIX' onError:nil
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   631
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   632
   Naive cases (which are accepted):
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   633
     Integer readFromRomanString:'IIII' onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   634
     Integer readFromRomanString:'VIIII' onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   635
     Integer readFromRomanString:'CLXXXXVIIII' onError:nil
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   636
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   637
   Error cases:
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   638
\     Integer readFromRomanString:'LC'   onError:nil
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   639
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   640
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   641
    "error cases:
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   642
      #(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   643
        'XIIX'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   644
        'VV'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   645
        'VVV'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   646
        'XXL'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   647
        'XLX'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   648
        'LC'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   649
        'LL'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   650
        'DD'
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   651
     ) do:[:badString |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   652
        (Integer readFromRomanString:badString onError:nil) notNil ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   653
     ]
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   654
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   655
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   656
    "naive (but handled) cases:
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   657
      #(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   658
        'IIII'   4
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   659
        'VIIII'  9
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   660
        'XIIII'  14
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   661
        'XVIIII' 19
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   662
     ) pairWiseDo:[:goodString :expectedValue |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   663
        (Integer readFromRomanString:goodString onError:nil) ~= expectedValue ifTrue:[self halt].
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   664
     ]
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   665
    "
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   666
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   667
    "good cases:
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   668
     #( 'I'     1
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   669
        'II'    2
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   670
        'III'   3
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   671
        'IV'    4
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   672
        'V'     5
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   673
        'VI'    6
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   674
        'VII'   7
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   675
        'VIII'  8
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   676
        'IX'    9
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   677
        'X'     10
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   678
        'XI'    11
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   679
        'XII'   12
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   680
        'XIII'  13
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   681
        'XIV'   14
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   682
        'XV'    15
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   683
        'XVI'   16
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   684
        'XVII'  17
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   685
        'XVIII' 18
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   686
        'XIX'   19
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   687
        'XX'    20
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   688
        'XXX'   30
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   689
        'L'     50
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   690
        'XL'    40
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   691
        'LX'    60
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   692
        'LXX'   70
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   693
        'LXXX'  80
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   694
        'CXL'   140
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   695
        'CL'    150
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   696
        'CLX'   160
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   697
        'MMM'                   3000
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   698
        'MMMM'                  4000
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   699
        'MMMMCMXCIX'            4999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   700
        'MMMMMMMMMCMXCIX'       9999
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   701
     ) pairWiseDo:[:goodString :expectedValue |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   702
        (Integer readFromRomanString:goodString onError:nil) ~= expectedValue ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   703
     ]
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   704
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   705
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   706
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   707
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   708
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   709
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   710
        romanString := String streamContents:[:stream | n printRomanOn:stream].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   711
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   712
     ]
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   713
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   714
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   715
    "reading naive numbers:
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   716
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   717
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   718
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   719
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   720
        romanString := String streamContents:[:stream | n printRomanOn:stream naive:true].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   721
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   722
     ]
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   723
    "
8897
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   724
!
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   725
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   726
readFromString:aString radix:base onError:exceptionBlock
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   727
    |str val|
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   728
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   729
    str := ReadStream on:aString.
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   730
    val := self readFrom:str radix:base onError:[^ exceptionBlock value].
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   731
    str atEnd ifFalse:[ ^ exceptionBlock value].
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   732
    ^ val
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   733
! !
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   734
9141
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   735
!Integer class methodsFor:'Compatibility-Squeak'!
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   736
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   737
readFrom:aStringOrStream base:aBase
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   738
    "for squeak compatibility"
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   739
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   740
    ^ self readFrom:aStringOrStream radix:aBase
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   741
! !
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   742
4996
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   743
!Integer class methodsFor:'Signal constants'!
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   744
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   745
bcdConversionErrorSignal
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   746
    "return the signal which is raised when bcd conversion fails
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   747
     (i.e. when trying to decode an invalid BCD number)"
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   748
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   749
    ^ BCDConversionErrorSignal
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   750
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   751
    "Modified: / 15.11.1999 / 20:35:20 / cg"
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   752
! !
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   753
18905
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
   754
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
   755
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   756
!Integer class methodsFor:'class initialization'!
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   757
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   758
initialize
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   759
    BCDConversionErrorSignal isNil ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   760
        BCDConversionErrorSignal := ConversionError newSignal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   761
        BCDConversionErrorSignal nameClass:self message:#bcdConversionErrorSignal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   762
        BCDConversionErrorSignal notifierString:'bcd conversion error'.
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   763
    ].
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   764
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   765
    "Modified: / 15.11.1999 / 20:36:04 / cg"
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   766
! !
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   767
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
   768
!Integer class methodsFor:'constants'!
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   769
7727
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   770
epsilon
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   771
    "return the maximum relative spacing"
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   772
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   773
    "don't know, what to really return here.
8635
38674ba49a14 comment
Claus Gittinger <cg@exept.de>
parents: 8573
diff changeset
   774
     Returning 1 gives stupid values when doing some taylor series approximations
38674ba49a14 comment
Claus Gittinger <cg@exept.de>
parents: 8573
diff changeset
   775
     (although it is correct)"
7727
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   776
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   777
    ^ Float epsilon.
8635
38674ba49a14 comment
Claus Gittinger <cg@exept.de>
parents: 8573
diff changeset
   778
38674ba49a14 comment
Claus Gittinger <cg@exept.de>
parents: 8573
diff changeset
   779
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   780
     2 sqrt_withAccuracy:(Integer epsilon)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   781
     2 sqrt_withAccuracy:1
8635
38674ba49a14 comment
Claus Gittinger <cg@exept.de>
parents: 8573
diff changeset
   782
    "
7727
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   783
!
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   784
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   785
unity
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   786
    "return the neutral element for multiplication (1)"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   787
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   788
    ^ 1
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   789
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   790
    "Modified: 18.7.1996 / 12:26:43 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   791
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   792
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   793
zero
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   794
    "return the neutral element for addition (0)"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   795
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   796
    ^ 0
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   797
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   798
    "Modified: 18.7.1996 / 12:26:38 / cg"
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   799
! !
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   800
18905
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
   801
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   802
!Integer class methodsFor:'prime numbers'!
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   803
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   804
flushPrimeCache
18865
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
   805
    "cleanup after using a primeCache.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
   806
     See comment in initializePrimeCacheUpTo:limit"
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   807
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   808
    PrimeCache := nil.
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   809
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   810
    "
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   811
     Integer initializePrimeCacheUpTo:1000000
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   812
     Integer flushPrimeCache.
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   813
    "
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   814
!
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   815
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   816
initializePrimeCacheUpTo:limit
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   817
    "if many operations are to be done using primes, we can keep them around...
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   818
     You will need n/8/2 bytes to keep fast info about primes up to n
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   819
     (i.e. 100Mb is good for primes up to 1.6*10^9)"
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   820
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   821
    |bits|
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   822
11563
a91c8d348760 could have returned an uncompressed largeint after bitShift
Claus Gittinger <cg@exept.de>
parents: 11521
diff changeset
   823
    PrimeCache := nil.
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   824
    bits := BooleanArray new:limit//2.
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   825
    self primesUpTo:limit do:[:p |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   826
        bits at:p//2 put:true
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   827
    ].
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   828
    PrimeCache := bits.
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   829
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   830
    "
11521
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   831
     Integer initializePrimeCacheUpTo:1000000.
11654
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   832
     Integer initializePrimeCacheUpTo:10000000.
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   833
     Integer initializePrimeCacheUpTo:100000000.
11563
a91c8d348760 could have returned an uncompressed largeint after bitShift
Claus Gittinger <cg@exept.de>
parents: 11521
diff changeset
   834
     Integer initializePrimeCacheUpTo:1000000000.
11521
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   835
     Integer flushPrimeCache.
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   836
    "
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   837
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   838
    "
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   839
     Integer flushPrimeCache.
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   840
     Transcript showCR:(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   841
        Time millisecondsToRun:[ 1 to:100000 do:[:n | n isPrime] ]
11521
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   842
     ).
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   843
     Integer initializePrimeCacheUpTo:100000.
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   844
     Transcript showCR:(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   845
        Time millisecondsToRun:[ 1 to:100000 do:[:n | n isPrime] ]
11521
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   846
     ).
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   847
     Integer flushPrimeCache.
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   848
    "
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   849
!
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   850
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   851
largePrimesUpTo: max do: aBlock
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   852
    "Evaluate aBlock with all primes up and including maxValue.
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   853
     The Algorithm is adapted from http://www.rsok.com/~jrm/printprimes.html
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   854
     It encodes prime numbers much more compactly than #primesUpTo:
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   855
     38.5 integer per byte (2310 numbers per 60 byte) allow for some fun large primes.
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   856
     (all primes up to SmallInteger maxVal can be computed within ~27MB of memory;
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   857
     the regular #primesUpTo: would require 4 *GIGA*bytes).
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   858
     Note: The algorithm could be re-written to produce the first primes (which require
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   859
     the longest time to sieve) faster but only at the cost of clarity."
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   860
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   861
    | limit flags maskBitIndex bitIndex maskBit byteIndex index primesUpTo2310 indexLimit |
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   862
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   863
    limit := max asInteger.
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   864
    indexLimit := max sqrt truncated + 1.
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   865
    "Create the array of flags."
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   866
    flags := ByteArray new: (limit + 2309) // 2310 * 60 + 60.
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   867
    flags atAllPut: 16rFF. "set all to true"
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   868
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   869
    "Compute the primes up to 2310"
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   870
    primesUpTo2310 := self primesUpTo: 2310.
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   871
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   872
    "Create a mapping from 2310 integers to 480 bits (60 byte)"
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   873
    maskBitIndex := Array new: 2310.
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   874
    bitIndex := -1. "for pre-increment"
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   875
    maskBitIndex at: 1 put: (bitIndex := bitIndex + 1).
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   876
    maskBitIndex at: 2 put: (bitIndex := bitIndex + 1).
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   877
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   878
    1 to: 5 do:[:i| aBlock value: (primesUpTo2310 at: i)].
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   879
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   880
    index := 6.
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   881
    2 to: 2309 do:[:n|
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   882
        [(primesUpTo2310 at: index) < n]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   883
            whileTrue:[index := index + 1].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   884
        n = (primesUpTo2310 at: index) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   885
            maskBitIndex at: n+1 put: (bitIndex := bitIndex + 1).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   886
        ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   887
            "if modulo any of the prime factors of 2310, then could not be prime"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   888
            (n \\ 2 = 0 or:[n \\ 3 = 0 or:[n \\ 5 = 0 or:[n \\ 7 = 0 or:[n \\ 11 = 0]]]])
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   889
                    ifTrue:[maskBitIndex at: n+1 put: 0]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   890
                    ifFalse:[maskBitIndex at: n+1 put: (bitIndex := bitIndex + 1)].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   891
        ].
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   892
    ].
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   893
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   894
    "Now the real work begins...
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   895
    Start with 13 since multiples of 2,3,5,7,11 are handled by the storage method;
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   896
    increment by 2 for odd numbers only."
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   897
    13 to: limit by: 2 do:[:n|
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   898
        (maskBit := maskBitIndex at: (n \\ 2310 + 1)) = 0 ifFalse:["not a multiple of 2,3,5,7,11"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   899
            byteIndex := n // 2310 * 60 + (maskBit-1 bitShift: -3) + 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   900
            bitIndex := 1 bitShift: (maskBit bitAnd: 7).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   901
            ((flags at: byteIndex) bitAnd: bitIndex) = 0 ifFalse:["not marked -- n is prime"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   902
                aBlock value: n.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   903
                "Start with n*n since any integer < n has already been sieved
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   904
                (e.g., any multiple of n with a number k < n has been cleared
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   905
                when k was sieved); add 2 * i to avoid even numbers and
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   906
                mark all multiples of this prime. Note: n < indexLimit below
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   907
                limits running into LargeInts -- nothing more."
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   908
                n < indexLimit ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   909
                    index := n * n.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   910
                    (index bitAnd: 1) = 0 ifTrue:[index := index + n].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   911
                    [index <= limit] whileTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   912
                        (maskBit := maskBitIndex at: (index \\ 2310 + 1)) = 0 ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   913
                            byteIndex := (index // 2310 * 60) + (maskBit-1 bitShift: -3) + 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   914
                            maskBit := 255 - (1 bitShift: (maskBit bitAnd: 7)).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   915
                            flags at: byteIndex put: ((flags at: byteIndex) bitAnd: maskBit).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   916
                        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   917
                        index := index + (2 * n)].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   918
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   919
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   920
        ].
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   921
    ].
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   922
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   923
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   924
     Integer largePrimesUpTo:1000000 do:[:i | i > 900000 ifTrue:[self halt] ]
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   925
     (Integer primesUpTo:1000000) inspect
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   926
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   927
!
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   928
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   929
primeCacheSize
18865
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
   930
    "see comment in initializePrimeCacheUpTo:limit"
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
   931
    
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   932
    ^ PrimeCache size * 2
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   933
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   934
    "
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   935
     Integer initializePrimeCacheUpTo:1000.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   936
     Integer initializePrimeCacheUpTo:1000000.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   937
     Integer initializePrimeCacheUpTo:1000000000.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   938
     Integer flushPrimeCache.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   939
    "
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   940
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   941
    "
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   942
     Integer flushPrimeCache.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   943
     Transcript showCR:(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   944
        Time millisecondsToRun:[ 1 to:100000 do:[:n | n isPrime] ]
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   945
     ).
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   946
     Integer initializePrimeCacheUpTo:100000.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   947
     Transcript showCR:(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   948
        Time millisecondsToRun:[ 1 to:100000 do:[:n | n isPrime] ]
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   949
     ).
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   950
     Integer flushPrimeCache.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   951
    "
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   952
!
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   953
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   954
primesUpTo2000
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   955
    "/ primes up to 1000
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   956
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   957
    ^ #(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   958
            2 3   5   7  11  13  17  19  23  29  31  37  41  43  47  53  59  61  67  71
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   959
             73  79  83  89  97 101 103 107 109 113 127 131 137 139 149 151 157 163 167
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   960
            173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   961
            277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   962
            397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   963
            509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   964
            641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   965
            761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   966
            887 907 911 919 929 937 941 947 953 967 971 977 983 991 997
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   967
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   968
            1009 1013 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069 1087 1091 1093
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   969
            1097 1103 1109 1117 1123 1129 1151 1153 1163 1171 1181 1187 1193 1201 1213
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   970
            1217 1223 1229 1231 1237 1249 1259 1277 1279 1283 1289 1291 1297 1301 1303
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   971
            1307 1319 1321 1327 1361 1367 1373 1381 1399 1409 1423 1427 1429 1433 1439
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   972
            1447 1451 1453 1459 1471 1481 1483 1487 1489 1493 1499 1511 1523 1531 1543
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   973
            1549 1553 1559 1567 1571 1579 1583 1597 1601 1607 1609 1613 1619 1621 1627
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   974
            1637 1657 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733 1741 1747 1753
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   975
            1759 1777 1783 1787 1789 1801 1811 1823 1831 1847 1861 1867 1871 1873 1877
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   976
            1879 1889 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987 1993 1997 1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   977
        ).
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   978
!
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   979
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   980
primesUpTo: max
15578
88cefb6e5d94 class: Integer
Stefan Vogel <sv@exept.de>
parents: 15567
diff changeset
   981
    "Return a list of prime integers up to and including the given integer."
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   982
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   983
    ^ Array streamContents:[:s| self primesUpTo: max do:[:prime| s nextPut: prime]]
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   984
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   985
    "
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   986
     Integer primesUpTo: 100
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   987
     Integer primesUpTo: 13
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   988
     (Integer primesUpTo: 100) select:[:p | p between:10 and:99]
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   989
    "
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   990
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   991
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   992
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   993
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   994
     N := 1000.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   995
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   996
     a := (1 to:1000)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   997
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   998
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   999
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1000
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1001
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1002
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1003
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1004
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1005
     N := 1000 nextPrime.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1006
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1007
     a := (1 to:1000)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1008
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1009
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1010
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1011
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1012
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1013
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1014
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1015
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1016
     N := 1000 nextPrime-1.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1017
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1018
     a := (1 to:1000)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1019
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1020
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1021
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1022
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1023
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1024
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1025
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1026
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1027
     N := 100000.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1028
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1029
     a := (1 to:N)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1030
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1031
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1032
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1033
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1034
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1035
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1036
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1037
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1038
     N := 100000 nextPrime.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1039
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1040
     a := (1 to:N)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1041
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1042
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1043
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1044
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1045
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1046
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1047
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1048
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1049
     N := 100000 nextPrime-1.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1050
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1051
     a := (1 to:N)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1052
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1053
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1054
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1055
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1056
    "
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1057
!
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1058
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1059
primesUpTo: max do: aBlock
18865
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  1060
    "Compute aBlock with all prime integers up to and including the given integer.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  1061
     See comment in initializePrimeCacheUpTo:limit"
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  1062
     
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1063
    | limit flags prime k |
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1064
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
  1065
    max <= 2000 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1066
        self primesUpTo2000 do:[:p |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1067
            p > max ifTrue:[^ self].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1068
            aBlock value:p.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1069
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1070
        ^ self.
11521
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
  1071
    ].
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
  1072
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
  1073
    max <= self primeCacheSize ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1074
        aBlock value:2.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1075
        3 to:max by:2 do:[:p |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1076
            (PrimeCache at:p//2) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1077
                aBlock value:p
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1078
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1079
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1080
        ^ self.
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
  1081
    ].
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
  1082
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1083
    limit := max asInteger - 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1084
    "Fall back into #largePrimesUpTo:do: if we'd require more than 100k of memory;
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1085
    the alternative will only requre 1/154th of the amount we need here and is almost as fast."
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1086
    limit > 25000 ifTrue:[^ self largePrimesUpTo: max do: aBlock].
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1087
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1088
    "/ sieve, on the fly
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1089
    flags := (ByteArray new: limit) atAllPut: 1.
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1090
    1 to: limit do: [:i |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1091
        (flags at: i) == 1 ifTrue: [
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1092
            prime := i + 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1093
            k := i + prime.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1094
            [k <= limit] whileTrue: [
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1095
                flags at: k put: 0.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1096
                k := k + prime
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1097
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1098
            aBlock value: prime
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1099
        ]
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1100
    ].
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1101
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1102
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1103
     Integer primesUpTo: 100
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1104
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1105
! !
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1106
4653
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1107
!Integer class methodsFor:'queries'!
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1108
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1109
hasSharedInstances
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1110
    "return true if this class has shared instances, that is, instances
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1111
     with the same value are identical.
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1112
     Although not always shared (LargeIntegers), these should be treated
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1113
     so, to be independent of the number of bits in a SmallInt"
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1114
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1115
    ^ true
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1116
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1117
8892
5d05a7f150a5 +isAbstract
Claus Gittinger <cg@exept.de>
parents: 8635
diff changeset
  1118
!
5d05a7f150a5 +isAbstract
Claus Gittinger <cg@exept.de>
parents: 8635
diff changeset
  1119
5d05a7f150a5 +isAbstract
Claus Gittinger <cg@exept.de>
parents: 8635
diff changeset
  1120
isAbstract
11223
7536833995bb comment
Claus Gittinger <cg@exept.de>
parents: 11125
diff changeset
  1121
    "Return if this class is an abstract class.
7536833995bb comment
Claus Gittinger <cg@exept.de>
parents: 11125
diff changeset
  1122
     True is returned for Integer here; false for subclasses.
7536833995bb comment
Claus Gittinger <cg@exept.de>
parents: 11125
diff changeset
  1123
     Abstract subclasses must redefine again."
7536833995bb comment
Claus Gittinger <cg@exept.de>
parents: 11125
diff changeset
  1124
8892
5d05a7f150a5 +isAbstract
Claus Gittinger <cg@exept.de>
parents: 8635
diff changeset
  1125
    ^ self == Integer
4653
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1126
! !
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1127
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1128
!Integer methodsFor:'*Roe'!
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1129
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1130
acceptRoeVisitor: aVisitor
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1131
	^ aVisitor visitInteger: self
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1132
! !
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1133
7261
f35fc9cee675 method category rename
Claus Gittinger <cg@exept.de>
parents: 7173
diff changeset
  1134
!Integer methodsFor:'Compatibility-Dolphin'!
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1135
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1136
& aNumber
11936
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1137
    "return the bitwise-and of the receiver and the argument, anInteger.
14448
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1138
     Same as bitAnd: - added for compatibility with Dolphin Smalltalk.
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1139
     Notice: 
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1140
        please do not use ^ for integers in new code; it makes the code harder
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1141
        to understand, as it may be not obvious, whether a boolean or a bitWise or is intended.
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1142
        For integers, use bitAnd: to make the intention explicit."
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  1143
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1144
    ^ self bitAnd:aNumber
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1145
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1146
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1147
     14 | 1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1148
     9 & 8
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1149
    "
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1150
!
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1151
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1152
highWord
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1153
    "return the high 16 bits of a 32 bit value"
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1154
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1155
    ^ self bitShift:-16
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1156
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1157
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1158
     (16r12345678 highWord) hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1159
     (16r12345678 lowWord) hexPrintString
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1160
    "
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1161
!
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1162
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1163
lowWord
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1164
    "return the low 16 bits of a 32 bit value"
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1165
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1166
    ^ self bitAnd:16rFFFF
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1167
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1168
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1169
     (16r12345678 lowWord) hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1170
     (16r12345678 highWord) hexPrintString
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1171
    "
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1172
!
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1173
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1174
mask:integerMask set:aBoolean
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1175
    "Answer the result of setting/resetting the specified mask in the receiver."
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1176
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1177
    ^ aBoolean
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1178
            ifTrue:  [self bitOr:integerMask]
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1179
            ifFalse: [self bitClear:integerMask]
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1180
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1181
    "turn on the 1-bit:
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1182
         |v|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1183
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1184
         v := 2r0100.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1185
         v mask:1 set:true
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1186
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1187
     turn off the 1-bit:
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1188
         |v|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1189
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1190
         v := 2r0101.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1191
         v mask:1 set:false
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1192
    "
6875
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1193
!
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1194
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1195
maskClear:aMaskInteger
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1196
    "return an integer with all bits cleared which are set in aMaskInteger.
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1197
     An alias for bitClear: for compatibility."
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1198
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1199
    ^ self bitClear:aMaskInteger
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1200
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1201
    "
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1202
     3 maskClear:1
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1203
    "
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1204
!
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1205
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1206
maskSet:aMaskInteger
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1207
    "return an integer with all bits set which are set in aMaskInteger.
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1208
     An alias for bitSet: for compatibility."
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1209
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1210
    ^ self bitOr:aMaskInteger
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1211
!
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1212
6875
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1213
printStringRadix:aRadix padTo:sz
11936
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1214
    "return a printed representation of the receiver in a given radix,
15765
6edf4f55277d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15578
diff changeset
  1215
     padded with zeros (at the left) up to size.
11936
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1216
     If the printString is longer than size,
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1217
     it is returned unchanged (i.e. not truncated).
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1218
     See also printStringRadix:size:fill:"
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1219
6875
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1220
    ^ self printStringRadix:aRadix size:sz fill:$0
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1221
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1222
    "
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  1223
     1024 printStringRadix:16 padTo:4
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  1224
     16rABCD printStringRadix:16 padTo:3
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  1225
     1024 printStringRadix:2 padTo:16
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  1226
     1024 printStringRadix:16 padTo:8
6875
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1227
    "
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1228
!
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1229
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1230
| aNumber
11936
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1231
    "return the bitwise-or of the receiver and the argument, anInteger.
14448
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1232
     Same as bitOr: - added for compatibility with Dolphin Smalltalk.
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1233
     Notice: 
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1234
        please do not use | for integers in new code; it makes the code harder
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1235
        to understand, as it may be not obvious, whether a boolean or a bitWise or is intended.
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1236
        For integers, use bitOr: to make the intention explicit."
11936
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1237
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1238
    ^ self bitOr:aNumber
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1239
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1240
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1241
     14 | 1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1242
     9 & 8
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1243
    "
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1244
! !
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1245
7261
f35fc9cee675 method category rename
Claus Gittinger <cg@exept.de>
parents: 7173
diff changeset
  1246
!Integer methodsFor:'Compatibility-Squeak'!
4867
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1247
12122
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1248
asByteArray
15937
ff395b64b43a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15911
diff changeset
  1249
    "return my hexBytes in MSB.
ff395b64b43a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15911
diff changeset
  1250
     Do not use:
ff395b64b43a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15911
diff changeset
  1251
        This is a very stupid squeak-compatibility method,
ff395b64b43a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15911
diff changeset
  1252
        as normally, you'd expect the bytes to be ordered in the machine's natve order"
12147
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1253
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1254
    ^ self digitBytesMSB
12122
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1255
!
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1256
12147
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1257
asByteArrayOfSize:size
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1258
    "return my hexBytes in MSB, optionally padded at the left with zeros"
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1259
12122
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1260
    "(((
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1261
        | repeats number | 
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1262
        repeats := 1000000.
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1263
        number := 123456789123456789123456789123456789123456789123456789.
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1264
         [repeats timesRepeat: (number asByteArrayOfSize: 1024) ] timeToRun.
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1265
     )))"
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1266
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1267
    | bytes bytesSize|
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1268
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1269
    bytes := self digitBytesMSB.
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1270
    bytesSize := bytes size.
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1271
    size < bytesSize ifTrue: [
14796
242490a39283 class: Integer
Stefan Vogel <sv@exept.de>
parents: 14767
diff changeset
  1272
        ^ ConversionError raiseRequestWith:self errorString:'number too big for ', size asString
242490a39283 class: Integer
Stefan Vogel <sv@exept.de>
parents: 14767
diff changeset
  1273
    ].
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1274
    ^ (ByteArray new:size)
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1275
            replaceFrom:size-bytesSize+1 to:size with:bytes startingAt:1.
12147
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1276
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1277
    "
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1278
     123 asByteArrayOfSize:1 #[123]
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1279
     123 asByteArrayOfSize:2 #[0 123]
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1280
     123 asByteArrayOfSize:4 #[0 0 0 123]
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1281
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1282
     255 asByteArrayOfSize:1 #[255]
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1283
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1284
     256 asByteArrayOfSize:1 
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1285
     256 asByteArrayOfSize:2
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1286
     256 asByteArrayOfSize:4
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1287
    "
12122
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1288
!
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1289
4867
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1290
atRandom
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1291
    "return a random number between 1 amd myself"
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1292
8573
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1293
    ^ self atRandom:Random.
8572
3e649d2e3167 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8461
diff changeset
  1294
3e649d2e3167 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8461
diff changeset
  1295
    "
3e649d2e3167 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8461
diff changeset
  1296
     100 atRandom
3e649d2e3167 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8461
diff changeset
  1297
     1000 atRandom
3e649d2e3167 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8461
diff changeset
  1298
    "
4867
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1299
!
4376
8df0935ac5b1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4278
diff changeset
  1300
8573
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1301
atRandom:aRandomGenerator
15456
9535b5c74e85 class: Integer
Stefan Vogel <sv@exept.de>
parents: 15273
diff changeset
  1302
    "return a random number between 1 and myself"
8573
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1303
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1304
    self < 1 ifTrue:[^ self].
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1305
    ^ aRandomGenerator nextIntegerBetween:1 and:self
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1306
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1307
    "
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1308
     100 atRandom:(Random new)
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1309
     1000 atRandom:(Random new)
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1310
    "
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1311
!
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1312
14385
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1313
printLeftPaddedWith:padChar to:size base:base
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1314
    "prints left-padded"
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1315
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1316
    ^ (self printStringRadix:base) leftPaddedTo:size with:padChar
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1317
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1318
    "
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1319
     1234 printPaddedWith:$0 to:4 base:16     
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1320
     1234 printLeftPaddedWith:$0 to:4 base:16 
17488
9da696f7560f class: Integer
Claus Gittinger <cg@exept.de>
parents: 17248
diff changeset
  1321
     128 printLeftPaddedWith:$0 to:2 base:16  
14385
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1322
    "
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1323
!
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1324
11858
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1325
printPaddedWith:padChar to:size base:base
14385
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1326
    "attention: prints right-padded; see printLeftPadded."
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1327
11858
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1328
    ^ (self printStringRadix:base) paddedTo:size with:padChar
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1329
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1330
    "
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1331
     1234 printPaddedWith:$0 to:4 base:16
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1332
    "
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1333
!
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1334
4376
8df0935ac5b1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4278
diff changeset
  1335
printStringBase:base
4867
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1336
    "return my printString in a base;
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1337
     same as printStringRadix:"
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1338
4376
8df0935ac5b1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4278
diff changeset
  1339
    ^ self printStringRadix:base
12284
a6e7b47c08c4 comment/format in: #printStringBase:
Claus Gittinger <cg@exept.de>
parents: 12280
diff changeset
  1340
a6e7b47c08c4 comment/format in: #printStringBase:
Claus Gittinger <cg@exept.de>
parents: 12280
diff changeset
  1341
    "
a6e7b47c08c4 comment/format in: #printStringBase:
Claus Gittinger <cg@exept.de>
parents: 12280
diff changeset
  1342
     1234 printStringBase:16
a6e7b47c08c4 comment/format in: #printStringBase:
Claus Gittinger <cg@exept.de>
parents: 12280
diff changeset
  1343
    "
9068
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1344
!
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1345
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1346
printStringHex
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1347
    "return my printString in base 16;
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1348
     same as printStringRadix:"
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1349
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1350
    ^ self printStringRadix:16
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1351
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1352
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1353
     4096 printStringHex
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1354
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1355
!
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1356
9068
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1357
printStringRoman
9069
e5ba0dc84a53 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9068
diff changeset
  1358
    "return my roman printString;
e5ba0dc84a53 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9068
diff changeset
  1359
     almost the same as romanPrintString:"
e5ba0dc84a53 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9068
diff changeset
  1360
9068
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1361
    "funny - although the romans did not have negative numbers - squeak has"
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1362
    self negative ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1363
        ^ '-' , self negated romanPrintString
9068
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1364
    ].
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1365
    ^ self romanPrintString
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  1366
!
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  1367
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  1368
raisedTo:exp modulo:mod
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  1369
    ^ self raisedTo:exp mod:mod
4376
8df0935ac5b1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4278
diff changeset
  1370
! !
8df0935ac5b1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4278
diff changeset
  1371
7261
f35fc9cee675 method category rename
Claus Gittinger <cg@exept.de>
parents: 7173
diff changeset
  1372
!Integer methodsFor:'Compatibility-V''Age'!
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1373
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1374
<< aNumber
7155
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  1375
    "V'Age compatibility: left shift"
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1376
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1377
    ^ self bitShift:aNumber
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1378
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1379
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1380
     1 << 5
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1381
     64 << -5
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1382
    "
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1383
!
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1384
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1385
>> aNumber
7155
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  1386
    "V'Age compatibility: right shift"
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1387
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1388
    ^ self bitShift:(aNumber negated)
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1389
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1390
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1391
     1 >> -5
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1392
     64 >> 5
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1393
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1394
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1395
18905
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
  1396
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1397
!Integer methodsFor:'bcd conversion'!
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1398
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1399
decodeFromBCD
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1400
    "return a number representing the value of the BCD encoded receiver."
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1401
4424
f0f658ed8995 bcd support
Claus Gittinger <cg@exept.de>
parents: 4423
diff changeset
  1402
    |v rslt multiplier nibble|
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1403
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1404
    v := self.
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1405
    rslt := 0.
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1406
    multiplier := 1.
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1407
    [v > 0] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1408
        nibble := v bitAnd:16r0F.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1409
        nibble > 9 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1410
            ^ BCDConversionErrorSignal
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1411
                    raiseRequestWith:self
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1412
                    errorString:'bad BCD coded value'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1413
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1414
        rslt := rslt + (nibble * multiplier).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1415
        multiplier := multiplier * 10.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1416
        v := v bitShift:-4.
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1417
    ].
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1418
    ^ rslt
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1419
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1420
    "
4949
4c0462bd4d6a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4921
diff changeset
  1421
     16r1234567890123 decodeFromBCD
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1422
     16r1073741823 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1423
     16r1073741824 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1424
     16r1073741825 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1425
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1426
     16r55 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1427
     16r127 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1428
     16r800000 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1429
     16r8000000 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1430
     16r80000000 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1431
     16r800000000 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1432
     16r127567890 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1433
     16r1234567890 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1434
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1435
     16r5A decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1436
     16rFF decodeFromBCD
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1437
    "
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1438
4996
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
  1439
    "Modified: / 15.11.1999 / 20:37:20 / cg"
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1440
!
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1441
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1442
encodeAsBCD
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1443
    "return a BCD encoded number representing the same value as the
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1444
     receiver."
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1445
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1446
    |v rslt shift|
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1447
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1448
    v := self.
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1449
    rslt := shift := 0.
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1450
    [v > 0] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1451
        rslt := rslt + ((v \\ 10) bitShift:shift).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1452
        shift := shift + 4.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1453
        v := v // 10.
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1454
    ].
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1455
    ^ rslt
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1456
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1457
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1458
     55 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1459
     127 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1460
     127 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1461
     8912345 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1462
     89123456 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1463
     891234567 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1464
     900000000 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1465
     1073741823 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1466
     1073741824 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1467
     1073741825 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1468
     1891234567 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1469
     8912345678 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1470
     1234567890 encodeAsBCD hexPrintString
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1471
    "
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1472
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1473
! !
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1474
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1475
!Integer methodsFor:'bit operators'!
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1476
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1477
allMask:aMaskInteger
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1478
    "return true if all 1-bits in aMaskInteger are also 1 in the receiver"
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1479
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1480
    ^ (self bitAnd:aMaskInteger) == aMaskInteger
4643
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1481
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1482
    "2r00001111 allMask:2r00000001"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1483
    "2r00001111 allMask:2r00011110"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1484
    "2r00001111 allMask:2r00000000"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1485
!
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1486
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1487
anyMask:aMaskInteger
4643
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1488
    "return true if any 1-bits in anInteger is also 1 in the receiver.
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1489
     (somewhat incorrect, if the mask is zero)"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1490
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1491
    ^ (self bitAnd:aMaskInteger) ~~ 0
4643
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1492
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1493
    "2r00001111 anyMask:2r00000001"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1494
    "2r00001111 anyMask:2r11110000"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1495
!
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1496
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1497
bitAnd:aMaskInteger
357
claus
parents: 356
diff changeset
  1498
    "return the bitwise-and of the receiver and the argument, anInteger.
claus
parents: 356
diff changeset
  1499
     This is a general and slow implementation, walking over the bytes of
claus
parents: 356
diff changeset
  1500
     the receiver and the argument."
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1501
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1502
    |n "{ Class: SmallInteger }"
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1503
     result byte|
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1504
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1505
    aMaskInteger isInteger ifFalse:[
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1506
        ^ aMaskInteger bitAndFromInteger:self.
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1507
    ].
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1508
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1509
    n := (aMaskInteger digitLength) min:(self digitLength).
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1510
    result := self class basicNew numberOfDigits:n.
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1511
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1512
    1 to:n do:[:index |
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1513
        byte := (aMaskInteger digitAt:index) bitAnd:(self digitAt:index).
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1514
        result digitAt:index put:byte.
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1515
    ].
3162
c7c8af356ff2 dont hardcode the numberof bytes (use maxBytes for alpha);
Claus Gittinger <cg@exept.de>
parents: 3138
diff changeset
  1516
    (byte == 0 or:[n <= SmallInteger maxBytes]) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1517
        ^ result compressed
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1518
    ].
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1519
    ^ result
357
claus
parents: 356
diff changeset
  1520
claus
parents: 356
diff changeset
  1521
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1522
     (16r112233445566778899 bitAnd:16rFF                ) printStringRadix:16
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1523
     (16r112233445566778899 bitAnd:16rFFFFFFFFFFFFFFFF00) printStringRadix:16
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1524
     (16r112233445566778899 bitAnd:16rFF0000000000000000) printStringRadix:16
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1525
     (16r112233445566778899 bitAnd:16r00000000000000FFFF) printStringRadix:16
357
claus
parents: 356
diff changeset
  1526
    "
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  1527
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  1528
    "Modified: 5.11.1996 / 14:06:26 / cg"
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1529
!
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1530
85
claus
parents: 77
diff changeset
  1531
bitAt:index
11499
fa02ab9a83f0 comment
Claus Gittinger <cg@exept.de>
parents: 11496
diff changeset
  1532
    "return the value of the index's bit (index starts at 1) as 0 or 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1533
     Notice: the result of bitAt: on negative receivers is not
15556
ab840a26f63b class: Integer
Stefan Vogel <sv@exept.de>
parents: 15456
diff changeset
  1534
             defined in the language standard (since the implementation
ab840a26f63b class: Integer
Stefan Vogel <sv@exept.de>
parents: 15456
diff changeset
  1535
             is free to choose any internal representation for integers)"
85
claus
parents: 77
diff changeset
  1536
claus
parents: 77
diff changeset
  1537
    |i "{Class: SmallInteger}"|
claus
parents: 77
diff changeset
  1538
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  1539
    i := index - 1.
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  1540
    i < 0 ifTrue:[
15556
ab840a26f63b class: Integer
Stefan Vogel <sv@exept.de>
parents: 15456
diff changeset
  1541
        ^ SubscriptOutOfBoundsError
ab840a26f63b class: Integer
Stefan Vogel <sv@exept.de>
parents: 15456
diff changeset
  1542
                raiseRequestWith:index
ab840a26f63b class: Integer
Stefan Vogel <sv@exept.de>
parents: 15456
diff changeset
  1543
                errorString:'index out of bounds'
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  1544
    ].
85
claus
parents: 77
diff changeset
  1545
    ^ (self digitAt:(i // 8 + 1)) bitAt:(i \\ 8 + 1)
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1546
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1547
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1548
     1 bitAt:1                     => 1
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1549
     1 bitAt:2                     => 0
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1550
     1 bitAt:0                     index error
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1551
     2r1000100010001000100010001000100010001000100010001000 bitAt:48 => 1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1552
     2r1000100010001000100010001000100010001000100010001000 bitAt:47 => 0
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1553
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1554
     (1 bitShift:1000) bitAt:1000  => 0
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1555
     (1 bitShift:1000) bitAt:1001  => 1
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1556
     (1 bitShift:1000) bitAt:1002  => 0
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1557
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1558
     (1 bitShift:30) bitAt:30
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1559
     (1 bitShift:30) bitAt:31
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1560
     (1 bitShift:30) bitAt:32
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1561
     (1 bitShift:31) bitAt:31
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1562
     (1 bitShift:31) bitAt:32
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1563
     (1 bitShift:31) bitAt:33
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1564
     (1 bitShift:32) bitAt:32
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1565
     (1 bitShift:32) bitAt:33
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1566
     (1 bitShift:32) bitAt:34
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1567
     (1 bitShift:64) bitAt:64
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1568
     (1 bitShift:64) bitAt:65
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1569
     (1 bitShift:64) bitAt:66
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1570
    "
85
claus
parents: 77
diff changeset
  1571
!
claus
parents: 77
diff changeset
  1572
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1573
bitClear:aMaskInteger
16379
04f35b0875dc class: Integer
Claus Gittinger <cg@exept.de>
parents: 16347
diff changeset
  1574
    "return the bitwise-and of the receiver and the complement of argument, anInteger,
04f35b0875dc class: Integer
Claus Gittinger <cg@exept.de>
parents: 16347
diff changeset
  1575
     returning the receiver with bits of the argument cleared.
3884
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1576
     This is a general and slow implementation, walking over the bytes of
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1577
     the receiver and the argument."
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1578
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1579
    |n "{ Class: SmallInteger }"
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1580
     result byte|
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  1581
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1582
    n := (aMaskInteger digitLength) max:(self digitLength).
3884
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1583
    result := self class basicNew numberOfDigits:n.
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1584
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1585
    1 to:n do:[:index |
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1586
        byte :=  (self digitAt:index) bitClear:(aMaskInteger digitAt:index).
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1587
        result digitAt:index put:byte.
3884
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1588
    ].
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1589
    (byte == 0 or:[n <= SmallInteger maxBytes]) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1590
        ^ result compressed
3884
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1591
    ].
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1592
    ^ result
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  1593
!
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  1594
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1595
bitCount
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1596
    "return the number of 1-bits in the receiver"
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1597
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1598
    |n "{ Class: SmallInteger }"
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1599
     cnt byte|
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1600
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1601
    n := self digitLength.
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1602
    cnt := 0.
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1603
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1604
    1 to:n do:[:index |
13914
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1605
        byte := self digitAt:index.
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1606
        cnt := cnt + (byte bitCount)
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1607
    ].
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1608
    ^ cnt
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1609
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1610
     "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1611
      2r100000000000000000000000000000000000000000000000000000000001 bitCount
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1612
      2r111111111111111111111111111111111111111111111111111111111111111111 bitCount
13914
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1613
      100 factorial bitCount -> 207
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1614
      1000 factorial bitCount -> 3788
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1615
     "
13914
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1616
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1617
    "Modified (comment): / 09-01-2012 / 19:51:00 / cg"
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1618
!
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1619
11504
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1620
bitIndicesOfOneBitsDo:aBlock
11505
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1621
    "evaluate aBlock for all indices of a 1-bit, starting with the index of the lowest bit.
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1622
     The index for the least significant bit is 1."
11504
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1623
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1624
    1 to:self digitLength do:[:i8 |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1625
        |byte|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1626
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1627
        byte := self digitAt:i8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1628
        byte ~~ 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1629
            1 to:8 do:[:i |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1630
                (byte bitAt:i) == 1 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1631
                    aBlock value:(((i8-1)*8) + i).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1632
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1633
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1634
        ]
11504
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1635
    ].
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1636
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1637
    "
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1638
     1 bitIndicesOfOneBitsDo:[:i | Transcript showCR:i].
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1639
     2 bitIndicesOfOneBitsDo:[:i | Transcript showCR:i]
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1640
     4 bitIndicesOfOneBitsDo:[:i | Transcript showCR:i]
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1641
     12 bitIndicesOfOneBitsDo:[:i | Transcript showCR:i]
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1642
     127 bitIndicesOfOneBitsDo:[:i | Transcript showCR:i]
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1643
    "
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1644
!
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1645
11505
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1646
bitIndicesOfOneBitsReverseDo:aBlock
13367
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1647
    "evaluate aBlock for all indices of a 1-bit, starting with the index of the highest
11505
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1648
     and ending with the lowest bit.
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1649
     The index for the least significant bit is 1."
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1650
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1651
    self digitLength downTo:1 do:[:i8 |
13367
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1652
        |byte|
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1653
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1654
        byte := self digitAt:i8.
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1655
        byte ~~ 0 ifTrue:[
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1656
            8 downTo:1 do:[:i |
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1657
                (byte bitAt:i) == 1 ifTrue:[
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1658
                    aBlock value:(((i8-1)*8) + i).
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1659
                ].
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1660
            ].
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1661
        ]
11505
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1662
    ].
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1663
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1664
    "
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1665
     1 bitIndicesOfOneBitsReverseDo:[:i | Transcript showCR:i].
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1666
     2 bitIndicesOfOneBitsReverseDo:[:i | Transcript showCR:i]
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1667
     4 bitIndicesOfOneBitsReverseDo:[:i | Transcript showCR:i]
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1668
     12 bitIndicesOfOneBitsReverseDo:[:i | Transcript showCR:i]
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1669
     127 bitIndicesOfOneBitsReverseDo:[:i | Transcript showCR:i]
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1670
    "
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1671
!
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1672
3455
2b19e1e70adc added bitInvert for LargeIntegers (positive only)
Claus Gittinger <cg@exept.de>
parents: 3395
diff changeset
  1673
bitInvert
2b19e1e70adc added bitInvert for LargeIntegers (positive only)
Claus Gittinger <cg@exept.de>
parents: 3395
diff changeset
  1674
    "return a new integer, where all bits are complemented.
2b19e1e70adc added bitInvert for LargeIntegers (positive only)
Claus Gittinger <cg@exept.de>
parents: 3395
diff changeset
  1675
     This does not really make sense for negative largeIntegers,
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  1676
     since the digits are stored as absolute value.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  1677
     Q: is this specified in a language standard ?"
3455
2b19e1e70adc added bitInvert for LargeIntegers (positive only)
Claus Gittinger <cg@exept.de>
parents: 3395
diff changeset
  1678
4614
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1679
"/    ^ -1 - self
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1680
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1681
    |n      "{ Class: SmallInteger }"
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1682
     byte   "{ Class: SmallInteger }"
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1683
     result|
4614
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1684
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1685
    n := self digitLength.
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1686
    result := self class basicNew numberOfDigits:n.
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1687
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1688
    1 to:n do:[:index |
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  1689
        byte := self digitAt:index.
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1690
        byte := byte bitInvert bitAnd:16rFF.
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1691
        result digitAt:index put:byte.
4614
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1692
    ].
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1693
    (byte == 0 or:[n <= SmallInteger maxBytes]) ifTrue:[
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1694
        "if last byte is zero we can normalize"
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  1695
        ^ result compressed
4614
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1696
    ].
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1697
    ^ result
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1698
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1699
     "
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1700
      16rff bitInvert bitAnd:16rff
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1701
      16rffffffff bitInvert
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1702
      16rff00ff00 bitInvert hexPrintString
4614
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1703
     "
3455
2b19e1e70adc added bitInvert for LargeIntegers (positive only)
Claus Gittinger <cg@exept.de>
parents: 3395
diff changeset
  1704
!
2b19e1e70adc added bitInvert for LargeIntegers (positive only)
Claus Gittinger <cg@exept.de>
parents: 3395
diff changeset
  1705
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1706
bitOr:aMaskInteger
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1707
    "return the bitwise-or of the receiver and the argument, anInteger.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1708
     This is a general and slow implementation, walking over the bytes of
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1709
     the receiver and the argument."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1710
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1711
    |n "{ Class: SmallInteger }"
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1712
     result byte|
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1713
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1714
    aMaskInteger isInteger ifFalse:[
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1715
        ^ aMaskInteger bitOrFromInteger:self.
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1716
    ].
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1717
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1718
    n := (aMaskInteger digitLength) max:(self digitLength).
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1719
    result := self class basicNew numberOfDigits:n.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1720
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1721
    1 to:n do:[:index |
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1722
        byte := (aMaskInteger digitAt:index) bitOr:(self digitAt:index).
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1723
        result digitAt:index put:byte.
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1724
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1725
"/ no need to normalize - if the operands were correct
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1726
"/    byte == 0 ifTrue:[
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1727
"/        ^ result normalize
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1728
"/    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1729
    ^ result
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1730
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1731
85
claus
parents: 77
diff changeset
  1732
bitShift:shiftCount
claus
parents: 77
diff changeset
  1733
    "return the value of the receiver shifted by shiftCount bits;
claus
parents: 77
diff changeset
  1734
     leftShift if shiftCount > 0; rightShift otherwise.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1735
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1736
     Notice: the result of bitShift: on negative receivers is not
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1737
             defined in the language standard (since the implementation
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1738
             is free to choose any internal representation for integers)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1739
             However, ST/X preserves the sign."
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1740
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1741
    |result
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1742
     prev       "{ Class: SmallInteger }"
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1743
     next       "{ Class: SmallInteger }"
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1744
     byte       "{ Class: SmallInteger }"
359
claus
parents: 357
diff changeset
  1745
     byte2      "{ Class: SmallInteger }"
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1746
     bitShift   "{ Class: SmallInteger }"
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1747
     revShift   "{ Class: SmallInteger }"
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1748
     digitShift "{ Class: SmallInteger }"
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1749
     n          "{ Class: SmallInteger }"
3044
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
  1750
     nn         "{ Class: SmallInteger }"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
  1751
     nDigits    "{ Class: SmallInteger }" |
85
claus
parents: 77
diff changeset
  1752
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1753
    shiftCount isInteger ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1754
        ^ shiftCount bitShiftFromInteger:self.
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1755
    ].
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1756
85
claus
parents: 77
diff changeset
  1757
    shiftCount > 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1758
        "left shift"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1759
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1760
        digitShift := shiftCount // 8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1761
        bitShift := shiftCount \\ 8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1762
        n := self digitLength.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1763
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1764
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1765
         modulo 8 shifts can be done faster ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1766
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1767
        bitShift == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1768
            n := n + digitShift.
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1769
            result := self class basicNew numberOfDigits:n sign:self sign.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1770
            result digitBytes replaceFrom:(digitShift + 1) to:n with:self digitBytes.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1771
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1772
             no normalize needed, since receiver was already normalized
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1773
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1774
            ^ result
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1775
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1776
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1777
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1778
         less-than-8 shifts can be done faster ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1779
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1780
        digitShift == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1781
            nn := n+1.
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1782
            result := self class basicNew numberOfDigits:nn sign:self sign.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1783
            prev := 0.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1784
            1 to:n do:[:index |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1785
                byte := self digitAt:index.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1786
                byte := (byte bitShift:bitShift) bitOr:prev.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1787
                result digitAt:index put:(byte bitAnd:16rFF).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1788
                prev := byte bitShift:-8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1789
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1790
            result digitAt:nn put:prev.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1791
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1792
             might have stored a 0-byte ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1793
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1794
            prev == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1795
                ^ result compressed
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1796
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1797
            ^ result.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1798
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1799
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1800
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1801
         slow case ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1802
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1803
        n := n + digitShift + 1.
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1804
        result := self class basicNew numberOfDigits:n sign:self sign.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1805
        byte := self digitAt:1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1806
        byte := (byte bitShift:bitShift) bitAnd:16rFF.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1807
        result digitAt:(digitShift + 1) put:byte.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1808
        revShift := -8 + bitShift.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1809
        nDigits := self digitLength.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1810
        2 to:nDigits do:[:index |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1811
            byte := self digitAt:index.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1812
            byte2 := self digitAt:index-1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1813
            byte := byte bitShift:bitShift.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1814
            byte2 := byte2 bitShift:revShift.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1815
            byte := (byte bitOr:byte2) bitAnd:16rFF.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1816
            result digitAt:(index + digitShift) put:byte.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1817
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1818
        byte2 := self digitAt:nDigits.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1819
        byte2 := (byte2 bitShift:revShift) bitAnd:16rFF.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1820
        result digitAt:(nDigits + digitShift + 1) put:byte2.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1821
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1822
         might have stored a 0-byte ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1823
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1824
        byte2 == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1825
            ^ result compressed
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1826
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1827
        ^ result
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1828
    ].
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1829
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1830
    shiftCount < 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1831
        "right shift"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1832
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1833
        digitShift := shiftCount negated // 8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1834
        bitShift := shiftCount negated \\ 8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1835
        n := self digitLength.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1836
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1837
        digitShift >= n ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1838
            ^ 0
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1839
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1840
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1841
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1842
         modulo 8 shifts can be done faster ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1843
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1844
        bitShift == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1845
            n := n-digitShift.
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1846
            result := self class basicNew numberOfDigits:n sign:self sign.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1847
            result digitBytes replaceFrom:1 to:n with:self digitBytes startingAt:(digitShift + 1) .
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1848
            n <= SmallInteger maxBytes ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1849
                ^ result compressed
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1850
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1851
            ^ result
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1852
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1853
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1854
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1855
         less-than-8 shifts can be done faster ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1856
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1857
        digitShift == 0 ifTrue:[
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1858
            result := self class basicNew numberOfDigits:n sign:self sign.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1859
            prev := 0.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1860
            bitShift := bitShift negated.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1861
            revShift := 8 + bitShift.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1862
            n to:1 by:-1 do:[:index |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1863
                byte := self digitAt:index.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1864
                next := (byte bitShift:revShift) bitAnd:16rFF.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1865
                byte := (byte bitShift:bitShift) bitOr:prev.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1866
                result digitAt:index put:(byte bitAnd:16rFF).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1867
                prev := next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1868
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1869
            ^ result compressed
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1870
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1871
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1872
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1873
         slow case ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1874
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1875
        nn := n-digitShift.
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1876
        result := self class basicNew numberOfDigits:nn sign:self sign.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1877
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1878
        prev := 0.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1879
        bitShift := bitShift negated.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1880
        revShift := 8 + bitShift.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1881
        nn := digitShift + 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1882
        n to:nn by:-1 do:[:index |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1883
            byte := self digitAt:index.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1884
            next := (byte bitShift:revShift) bitAnd:16rFF.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1885
            byte := (byte bitShift:bitShift) bitOr:prev.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1886
            result digitAt:(index - digitShift) put:byte.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1887
            prev := next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1888
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1889
        "the last stored byte ..."
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1890
        ^ result compressed
85
claus
parents: 77
diff changeset
  1891
    ].
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1892
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1893
    ^ self "no shift"
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  1894
3638
edf314b220d2 fixed #bitShift: (right)
Claus Gittinger <cg@exept.de>
parents: 3455
diff changeset
  1895
    "Modified: / 8.7.1998 / 12:45:24 / cg"
4151
6d6971c27567 Some speedups.
Stefan Vogel <sv@exept.de>
parents: 4142
diff changeset
  1896
    "Modified: / 5.5.1999 / 16:05:05 / stefan"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1897
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1898
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1899
bitTest:aMaskInteger
5782
dcc037e5bdbf comment change
Claus Gittinger <cg@exept.de>
parents: 5496
diff changeset
  1900
    "return true, if any bit from aMask is set in the receiver.
dcc037e5bdbf comment change
Claus Gittinger <cg@exept.de>
parents: 5496
diff changeset
  1901
     I.e. true, if the bitwise-AND of the receiver and the argument, anInteger
1407
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1902
     is non-0, false otherwise.
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1903
     This is a general and slow implementation, walking over the bytes of
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1904
     the receiver and the argument."
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1905
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1906
    |n "{ Class: SmallInteger }"
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  1907
     byte|
1407
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1908
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1909
    n := (aMaskInteger digitLength) min:(self digitLength).
1407
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1910
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1911
    1 to:n do:[:index |
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1912
        byte := (aMaskInteger digitAt:index) bitAnd:(self digitAt:index).
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1913
        byte ~~ 0 ifTrue:[^ true].
1407
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1914
    ].
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1915
    ^ false
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1916
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1917
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1918
     16r112233445566778899 bitTest:16rFF
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1919
     16r112233445566778800 bitTest:16rFF
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1920
     16r112233445566778899 bitTest:16rFFFFFFFFFFFFFFFF00
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1921
     16r112233445566778899 bitTest:16rFF0000000000000000
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1922
     16r112233445566778899 bitTest:16r00000000000000FFFF
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1923
     16r1234567800000000 bitTest:16r8000000000000000
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1924
     16r8765432100000000 bitTest:16r8000000000000000
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1925
     16r12345678 bitTest:16r80000000
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1926
     16r87654321 bitTest:16r80000000
1407
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1927
    "
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1928
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  1929
    "Modified: / 6.6.1999 / 15:10:33 / cg"
1407
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1930
!
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1931
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1932
bitXor:anInteger
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1933
    "return the bitwise-or of the receiver and the argument, anInteger.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1934
     This is a general and slow implementation, walking over the bytes of
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1935
     the receiver and the argument."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1936
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1937
    |n "{ Class: SmallInteger }"
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1938
     result byte|
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1939
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1940
    anInteger isInteger ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1941
        ^ anInteger bitXorFromInteger:self.
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1942
    ].
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1943
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1944
    n := (anInteger digitLength) max:(self digitLength).
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1945
    result := self class basicNew numberOfDigits:n.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1946
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1947
    1 to:n do:[:index |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1948
        byte := (anInteger digitAt:index) bitXor:(self digitAt:index).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1949
        result digitAt:index put:byte.
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1950
    ].
3993
a5a09b2d36cd oops - bitXor: did not always compress the result.
Claus Gittinger <cg@exept.de>
parents: 3908
diff changeset
  1951
    (byte == 0 or:[n <= SmallInteger maxBytes]) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1952
        ^ result compressed
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1953
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1954
    ^ result
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1955
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1956
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1957
     (16r112233445566778899 bitXor:16rFF                ) printStringRadix:16 '112233445566778866'
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1958
     (16r112233445566778899 bitXor:16rFFFFFFFFFFFFFFFF00) printStringRadix:16 'EEDDCCBBAA99887799'
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1959
     (16r112233445566778899 bitXor:16rFF0000000000000000) printStringRadix:16 'EE2233445566778899'
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1960
     (16r112233445566778899 bitXor:16r112233445566778800) printStringRadix:16
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1961
    "
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  1962
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  1963
    "Modified: 5.11.1996 / 14:06:40 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1964
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1965
5210
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1966
changeBit:index to:aBooleanOrNumber
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1967
    "return a new number where the specified bit is on or off,
12670
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1968
     depending on aBooleanOrNumber.
5210
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1969
     Bits are counted from 1 starting with the least significant.
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  1970
     The method's name may be misleading: the receiver is not changed,
12670
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1971
     but a new number is returned. Should be named #withBit:changedTo:"
5210
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1972
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1973
    (aBooleanOrNumber == 0 or:[aBooleanOrNumber == false]) ifTrue:[
12670
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1974
        ^ self clearBit:index
5210
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1975
    ].
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1976
    ^ self setBit:index
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1977
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1978
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1979
     (16r3fffffff changeBit:31 to:1) hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1980
     (16r3fffffff asLargeInteger setBit:31) hexPrintString
5210
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1981
    "
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1982
!
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1983
12670
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1984
changeMask:mask to:aBooleanOrNumber
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1985
    "return a new number where the specified mask-bit is on or off,
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1986
     depending on aBooleanOrNumber.
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  1987
     The method's name may be misleading: the receiver is not changed,
12670
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1988
     but a new number is returned. Should be named #withMask:changedTo:"
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1989
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1990
    (aBooleanOrNumber == 0 or:[aBooleanOrNumber == false]) ifTrue:[
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1991
        ^ self bitClear:mask
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1992
    ].
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1993
    ^ self bitOr:mask
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1994
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1995
    "
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1996
     (16r3fffffff changeMask:16r80 to:0) hexPrintString 
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1997
     (16r3fff0000 changeMask:16r80 to:1) hexPrintString
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1998
    "
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1999
!
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2000
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2001
clearBit:index
8937
4f2508548327 comment
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2002
    "return a new integer where the specified bit is off.
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2003
     Bits are counted from 1 starting with the least significant.
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2004
     The method's name may be misleading: the receiver is not changed,
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2005
     but a new number is returned. Should be named #withBitCleared:"
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2006
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2007
    |n         "{ Class: SmallInteger }"
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2008
     byteIndex "{ Class: SmallInteger }"
8937
4f2508548327 comment
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2009
     bitIndex  "{ Class: SmallInteger }"
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2010
     result byte|
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2011
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2012
    index <= 0 ifTrue:[
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2013
        ^ SubscriptOutOfBoundsSignal
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2014
                raiseRequestWith:index
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2015
                errorString:'bit index out of bounds'
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2016
    ].
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2017
    byteIndex := ((index - 1) // 8) + 1.
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2018
    n := self digitLength.
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2019
    byteIndex > n ifTrue:[
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2020
        ^ self
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2021
    ].
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2022
9057
13bd29f579c6 Bug 343: #clearBit: changed the receiver (shouldn't do that).
Stefan Vogel <sv@exept.de>
parents: 8937
diff changeset
  2023
    result := self simpleDeepCopy.
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2024
    bitIndex := ((index - 1) \\ 8) + 1.
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2025
    byte := (result digitAt:byteIndex) clearBit:bitIndex.
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2026
    result digitAt:byteIndex put:byte.
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2027
    (byte == 0 or:[n == byteIndex and:[n <= SmallInteger maxBytes]]) ifTrue:[
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2028
        ^ result compressed
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2029
    ].
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2030
    ^ result
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2031
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2032
    "
9057
13bd29f579c6 Bug 343: #clearBit: changed the receiver (shouldn't do that).
Stefan Vogel <sv@exept.de>
parents: 8937
diff changeset
  2033
     3111111111 clearBit:1
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2034
    "
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2035
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2036
    "Modified: / 28.7.1998 / 18:35:50 / cg"
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2037
!
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2038
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2039
even
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2040
    "return true if the receiver is even"
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2041
9401
65f884297c68 speed up #even and #odd
Stefan Vogel <sv@exept.de>
parents: 9316
diff changeset
  2042
    ^ (self bitAt:1) == 0
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2043
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2044
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2045
     16r112233445566778899 even
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2046
     16r112233445566778800 even
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2047
     1 even
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2048
     2 even
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2049
    "
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2050
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2051
    "Created: / 6.6.1999 / 15:00:40 / cg"
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2052
!
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2053
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2054
highBit
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2055
    "return the bitIndex of the highest bit set. The returned bitIndex
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2056
     starts at 1 for the least significant bit.
6481
d5c94e93067c highBit now returns 0 if no bit is set.
Claus Gittinger <cg@exept.de>
parents: 6480
diff changeset
  2057
     Returns 0 if no bit is set."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2058
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2059
    |byteNr highByte|
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2060
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2061
    byteNr := self digitLength.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2062
    byteNr == 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2063
        ^ 0
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2064
    ].
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2065
    highByte := self digitAt:byteNr.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2066
    ^ (byteNr - 1) * 8 + highByte highBit
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2067
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2068
    "
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2069
     0 highBit
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2070
     -1 highBit
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2071
     (1 bitShift:1) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2072
     (1 bitShift:30) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2073
     (1 bitShift:31) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2074
     (1 bitShift:32) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2075
     (1 bitShift:33) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2076
     (1 bitShift:64) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2077
     (1 bitShift:1000) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2078
     (1 bitShift:1000) negated highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2079
     ((1 bitShift:64)-1) highBit
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2080
    "
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2081
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2082
    "Modified: / 3.5.1999 / 09:20:57 / stefan"
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2083
!
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2084
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2085
invertBit:index
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2086
    "return a new number where the specified bit is inverted.
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2087
     Bits are counted from 1 starting with the least significant.
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2088
     The method's name may be misleading: the receiver is not changed,
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2089
     but a new number is returned. Should be named #withBitInverted:"
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2090
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2091
    index <= 0 ifTrue:[
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2092
        ^ SubscriptOutOfBoundsSignal
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2093
                raiseRequestWith:index
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2094
                errorString:'index out of bounds'
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2095
    ].
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2096
    ^ self bitXor:(1 bitShift:index-1)
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2097
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2098
    "
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2099
     0 invertBit:3         => 4 (2r100)
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2100
     0 invertBit:48        => 140737488355328 (2r1000.....000)
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2101
     ((0 invertBit:99) invertBit:100) printStringRadix:2
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2102
    "
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2103
!
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2104
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2105
isBitSet:index
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2106
    "return true if the index' bit is set; false otherwise.
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2107
     Bits are counted from 1 starting with the least significant."
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2108
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2109
    ^ (self bitAt:index) ~~ 0
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2110
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2111
    "
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2112
     5 isBitSet:3       => true
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2113
     2r0101 isBitSet:2  => false
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2114
     2r0101 isBitSet:1  => true
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2115
     2r0101 isBitSet:0  index error
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2116
    "
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2117
!
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2118
16071
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2119
leftShift:shiftCount
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2120
    "return the value of the receiver shifted left by shiftCount bits;
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2121
     leftShift if shiftCount > 0; rightShift otherwise.
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2122
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2123
     Notice: the result of bitShift: on negative receivers is not
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2124
             defined in the language standard (since the implementation
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2125
             is free to choose any internal representation for integers)
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2126
             However, ST/X preserves the sign."
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2127
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2128
    ^ self bitShift:shiftCount
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2129
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2130
    "
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2131
     16r100000000 leftShift:1
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2132
     16r100000000 negated leftShift:1
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2133
    "
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2134
!
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2135
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2136
lowBit
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2137
    "return the bitIndex of the lowest bit set. The returned bitIndex
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2138
     starts at 1 for the least significant bit.
6480
4ff7f2af25fc lowBit now returns 0 if no bit is set.
Claus Gittinger <cg@exept.de>
parents: 6358
diff changeset
  2139
     Returns 0 if no bit is set."
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2140
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2141
    |maxBytes "{ Class: SmallInteger }"
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2142
     byte|
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2143
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2144
    maxBytes := self digitLength.
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2145
    1 to:maxBytes do:[:byteIndex |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2146
        byte := self digitAt:byteIndex.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2147
        byte ~~ 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2148
            ^ (byteIndex-1)*8 + (byte lowBit)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2149
        ].
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2150
    ].
6480
4ff7f2af25fc lowBit now returns 0 if no bit is set.
Claus Gittinger <cg@exept.de>
parents: 6358
diff changeset
  2151
    ^ 0 "/ should not happen
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2152
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2153
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2154
     0 lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2155
     1 lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2156
     (1 bitShift:1) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2157
     (1 bitShift:1) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2158
     (1 bitShift:30) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2159
     (1 bitShift:30) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2160
     (1 bitShift:31) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2161
     (1 bitShift:31) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2162
     (1 bitShift:32) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2163
     (1 bitShift:32) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2164
     (1 bitShift:33) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2165
     (1 bitShift:33) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2166
     (1 bitShift:64) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2167
     (1 bitShift:64) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2168
     (1 bitShift:1000) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2169
     (1 bitShift:1000) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2170
     ((1 bitShift:64)-1) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2171
     ((1 bitShift:64)-1) highBit
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2172
    "
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2173
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2174
    "Modified: 1.3.1997 / 16:54:23 / cg"
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2175
!
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2176
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2177
noMask:aMaskInteger
4643
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  2178
    "return true if no 1-bit in anInteger is 1 in the receiver"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  2179
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2180
    ^ (self bitAnd:aMaskInteger) == 0
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2181
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2182
    "
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2183
     2r00001111 noMask:2r00000001
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2184
     2r00001111 noMask:2r11110000
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2185
    "
4643
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  2186
!
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  2187
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2188
odd
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2189
    "return true if the receiver is odd"
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2190
9401
65f884297c68 speed up #even and #odd
Stefan Vogel <sv@exept.de>
parents: 9316
diff changeset
  2191
    ^ (self bitAt:1) == 1
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2192
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2193
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2194
     16r112233445566778899 odd
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2195
     16r112233445566778800 odd
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2196
     1 odd
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2197
     2 odd
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2198
    "
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2199
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2200
    "Created: / 6.6.1999 / 15:00:55 / cg"
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2201
!
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2202
7155
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2203
rightShift:shiftCount
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2204
    "return the value of the receiver shifted right by shiftCount bits;
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2205
     rightShift if shiftCount > 0; leftShift otherwise.
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2206
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2207
     Notice: the result of bitShift: on negative receivers is not
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2208
             defined in the language standard (since the implementation
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2209
             is free to choose any internal representation for integers)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2210
             However, ST/X preserves the sign."
7155
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2211
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2212
    ^ self bitShift:(shiftCount negated)
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2213
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2214
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2215
     16r100000000 rightShift:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2216
     16r100000000 negated rightShift:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2217
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2218
     16r100000000 rightShift:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2219
     16r100000000 negated rightShift:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2220
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2221
     16r100000000 rightShift:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2222
     16r100000000 negated rightShift:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2223
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2224
     ((16r100000000 rightShift:1) rightShift:1) rightShift:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2225
     ((16r100000000 negated rightShift:1) rightShift:1) rightShift:1
7155
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2226
    "
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2227
!
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2228
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2229
setBit:index
8937
4f2508548327 comment
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2230
    "return a new integer, where the specified bit is on.
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2231
     Bits are counted from 1 starting with the least significant.
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2232
     The method's name may be misleading: the receiver is not changed,
11499
fa02ab9a83f0 comment
Claus Gittinger <cg@exept.de>
parents: 11496
diff changeset
  2233
     but a new number is returned. Should be named #withBitSet:"
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2234
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2235
    index <= 0 ifTrue:[
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2236
        ^ SubscriptOutOfBoundsSignal
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2237
                raiseRequestWith:index
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2238
                errorString:'index out of bounds'
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2239
    ].
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2240
    ^ self bitOr:(1 bitShift:index-1)
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2241
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2242
    "
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2243
     0 setBit:3         => 4 (2r100)
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2244
     0 setBit:48        => 140737488355328 (2r1000.....000)
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2245
     ((0 setBit:99) setBit:100) printStringRadix:2
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2246
    "
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2247
! !
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2248
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2249
!Integer methodsFor:'byte access'!
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2250
12784
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2251
byteAt:anIndex
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2252
    "compatibility with ByteArrays etc."
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2253
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2254
    ^ self digitAt:anIndex
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2255
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2256
    "
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2257
        12345678 byteAt:2
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2258
        12345678 digitBytes at:2
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2259
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2260
        -12345678 byteAt:2
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2261
        -12345678 digitBytes at:2
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2262
    "
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2263
!
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2264
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2265
digitByteLength
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2266
    "return the number bytes required for a 2's complement
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2267
     binary representation of this Integer.
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  2268
     For positive receivers, that's the same as the digitLength."
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  2269
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  2270
    |absLen "{ Class: SmallInteger }" |
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2271
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2272
    self >= 0 ifTrue:[^ self digitLength].
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2273
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  2274
    absLen := self negated digitLength.
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  2275
    (self digitByteAt:absLen) == 16rFF ifTrue:[
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  2276
        ^ (absLen - 1) max:1
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2277
    ].
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  2278
    ^ absLen
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2279
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2280
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2281
     -129 digitByteLength
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2282
    "
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2283
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2284
    "Created: / 25.10.1998 / 14:58:09 / cg"
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2285
    "Modified: / 25.10.1998 / 19:20:33 / cg"
10488
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2286
!
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2287
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2288
digitBytes
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  2289
    "return a byteArray filled with the receiver's bits
10488
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2290
     (8 bits of the absolute value per element),
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2291
     least significant byte is first"
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2292
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2293
    ^ self subclassResponsibility
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2294
!
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2295
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2296
digitBytesMSB
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  2297
    "return a byteArray filled with the receiver's bits
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2298
     (8 bits of the absolute value per element),
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2299
     most significant byte is first"
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2300
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2301
    ^ self subclassResponsibility
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2302
!
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2303
10488
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2304
digitBytesMSB:msbFlag
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  2305
    "return a byteArray filled with the receiver's bits
10488
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2306
     (8 bits of the absolute value per element),
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2307
     if msbflag = true, most significant byte is first,
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2308
     otherwise least significant byte is first"
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2309
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2310
    msbFlag ifTrue:[
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2311
        ^ self digitBytesMSB.
10488
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2312
    ].
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2313
    ^ self digitBytes
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2314
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2315
    "
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2316
      16r12 digitBytesMSB:true
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2317
      16r1234 digitBytesMSB:true
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2318
      16r1234 digitBytesMSB:false
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2319
      16r12345678 digitBytesMSB:true
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2320
      16r12345678 digitBytesMSB:false
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2321
    "
14166
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2322
!
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2323
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2324
swapBytes
16886
247352d5de0f class: Integer
Stefan Vogel <sv@exept.de>
parents: 16884
diff changeset
  2325
    "swap bytes pair-wise in a positive integer
247352d5de0f class: Integer
Stefan Vogel <sv@exept.de>
parents: 16884
diff changeset
  2326
     i.e. a.b.c.d -> b.a.d.c
247352d5de0f class: Integer
Stefan Vogel <sv@exept.de>
parents: 16884
diff changeset
  2327
     Swapping of negative integers is undefined and therefore not supported."
16884
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2328
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2329
    |digitBytes|
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2330
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2331
    self negative ifTrue:[
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2332
        RangeError raiseWith:self errorString:'negative numbers are not supported in #swapBytes'.
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2333
    ].
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2334
    digitBytes := self digitBytes.
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2335
    digitBytes size odd ifTrue:[
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2336
        "ByteArray<<#swapBytes needs even number of bytes.
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2337
         Add 0 to the most significant position (the end)"
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2338
        digitBytes := digitBytes copyWith:0.
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2339
        
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2340
    ].
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2341
    ^ (LargeInteger digitBytes:digitBytes swapBytes) compressed
14166
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2342
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2343
    "
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2344
        16rFFEE2211 swapBytes hexPrintString
16884
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2345
        16rFFEEAA2211 swapBytes hexPrintString
16874
0fbfe9ca3f3c class: Integer
Stefan Vogel <sv@exept.de>
parents: 16800
diff changeset
  2346
        16r2211 swapBytes hexPrintString
16884
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2347
        16rFF3FFFFF swapBytes
16874
0fbfe9ca3f3c class: Integer
Stefan Vogel <sv@exept.de>
parents: 16800
diff changeset
  2348
        self assert:(SmallInteger maxVal swapBytes swapBytes == SmallInteger maxVal)
14166
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2349
    "
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2350
! !
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2351
5238
f7a816a660a3 categories
Claus Gittinger <cg@exept.de>
parents: 5210
diff changeset
  2352
!Integer methodsFor:'coercing & converting'!
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2353
1888
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2354
asFixedPoint
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2355
    "return the receiver as a fixedPoint number"
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2356
6640
2de8925ad2cd fixed asFixedPoint (did return int due to reduce).
Claus Gittinger <cg@exept.de>
parents: 6639
diff changeset
  2357
    ^ FixedPoint basicNew
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2358
        setNumerator:self denominator:1 scale:1
1888
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2359
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2360
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2361
     100 asFixedPoint
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2362
     100 asFixedPoint + 0.1 asFixedPoint
1888
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2363
    "
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2364
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2365
    "Modified: 5.11.1996 / 15:13:17 / cg"
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2366
!
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2367
2141
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2368
asFixedPoint:scale
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2369
    "return the receiver as fixedPoint number, with the given number
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2370
     of post-decimal-point digits."
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2371
6639
d88a51b081ae fixed asFixedPoint (did return int due to reduce).
Claus Gittinger <cg@exept.de>
parents: 6635
diff changeset
  2372
    ^ FixedPoint basicNew
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2373
        setNumerator:self denominator:1 scale:scale
2141
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2374
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2375
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2376
     100 asFixedPoint:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2377
     100 asFixedPoint + (0.1 asFixedPoint:2)
2141
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2378
    "
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2379
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2380
    "Modified: 10.1.1997 / 20:00:08 / cg"
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2381
!
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2382
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2383
asFloat
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2384
    "return a Float with same value as myself.
11240
4ce9c8fa3d37 comment
Claus Gittinger <cg@exept.de>
parents: 11223
diff changeset
  2385
     Since floats have a limited precision, you usually loose bits when doing this."
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2386
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2387
    ^ Float fromInteger:self
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2388
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2389
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2390
     1234567890 asFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2391
     1234567890 asFloat asInteger
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2392
     12345678901234567890 asFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2393
     12345678901234567890 asFloat asInteger
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2394
    "
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2395
!
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2396
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2397
asFraction
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2398
    "return a Fraction with same value as receiver"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2399
2794
862ee34a4821 when coercing an integer, do not reduce the result.
Claus Gittinger <cg@exept.de>
parents: 2793
diff changeset
  2400
    ^ Fraction basicNew setNumerator:self denominator:1
862ee34a4821 when coercing an integer, do not reduce the result.
Claus Gittinger <cg@exept.de>
parents: 2793
diff changeset
  2401
862ee34a4821 when coercing an integer, do not reduce the result.
Claus Gittinger <cg@exept.de>
parents: 2793
diff changeset
  2402
    "Modified: 28.7.1997 / 19:26:06 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2403
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2404
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2405
asInteger
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2406
    "return the receiver truncated towards zero -
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2407
     for integers this is self"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2408
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2409
    ^ self
1337
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2410
!
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2411
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2412
asLargeFloat
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2413
    "return a LargeFloat with same value as myself.
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2414
     Since largeFloats have a limited precision, you usually loose bits when
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2415
     doing this."
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2416
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2417
    ^ LargeFloat fromInteger:self
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2418
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2419
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2420
     1234567890 asLargeFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2421
     1234567890 asLargeFloat asInteger
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2422
     12345678901234567890 asLargeFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2423
     12345678901234567890 asLargeFloat asInteger
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2424
    "
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2425
!
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2426
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2427
asLongFloat
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2428
    "return a LongFloat with same value as myself.
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2429
     Since longFloats have a limited precision, you usually loose bits when
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2430
     doing this."
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2431
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2432
    ^ LongFloat fromInteger:self
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2433
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2434
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2435
     1234567890 asFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2436
     1234567890 asFloat asInteger
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2437
     12345678901234567890 asFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2438
     12345678901234567890 asFloat asInteger
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2439
    "
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2440
!
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2441
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2442
asModuloNumber
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2443
    "return a precomputed modulo number"
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2444
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  2445
    ^ ModuloNumber modulus:self.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2446
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2447
    "Created: / 3.5.1999 / 14:48:03 / stefan"
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2448
!
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2449
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2450
asShortFloat
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2451
    "return a ShortFloat with same value as receiver"
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2452
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2453
    ^ ShortFloat fromInteger:self
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2454
!
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2455
14043
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2456
signExtended24BitValue
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2457
    "return a smallInteger from sign-extending the 24'th bit.
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2458
     May be useful for communication interfaces"
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2459
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2460
    ^ (self bitAnd:16rFFFFFF) signExtended24BitValue
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2461
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2462
    "Modified: / 07-05-1996 / 09:31:57 / cg"
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2463
    "Created: / 05-03-2012 / 14:37:55 / cg"
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2464
!
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2465
1337
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2466
signExtendedByteValue
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2467
    "return a smallInteger from sign-extending the 8'th bit.
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2468
     May be useful for communication interfaces"
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2469
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2470
    ^ (self bitAnd:16rFF) signExtendedByteValue
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2471
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2472
    "Created: 7.5.1996 / 09:31:52 / cg"
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2473
!
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2474
15084
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2475
signExtendedLongValue
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2476
    "return a smallInteger from sign-extending the 32'th bit.
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2477
     May be useful for communication interfaces"
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2478
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2479
    ^ (self bitAnd:16rFFFFFFFF) signExtendedLongValue
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2480
!
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2481
1337
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2482
signExtendedShortValue
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2483
    "return a smallInteger from sign-extending the 16'th bit.
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2484
     May be useful for communication interfaces"
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2485
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2486
    ^ (self bitAnd:16rFFFF) signExtendedShortValue
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2487
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2488
    "Modified: 7.5.1996 / 09:31:57 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2489
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2490
1976
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2491
!Integer methodsFor:'comparing'!
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2492
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2493
hash
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2494
    "redefined to return smallInteger hashValues"
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2495
3298
bf837fee7a15 Do not return negative hash values.
Stefan Vogel <sv@exept.de>
parents: 3188
diff changeset
  2496
    ^ self bitAnd:16r3FFFFFFF.
1976
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2497
3298
bf837fee7a15 Do not return negative hash values.
Stefan Vogel <sv@exept.de>
parents: 3188
diff changeset
  2498
    "
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2499
        -20000000000000 hash
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2500
         20000000000000 hash
3298
bf837fee7a15 Do not return negative hash values.
Stefan Vogel <sv@exept.de>
parents: 3188
diff changeset
  2501
    "
1976
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2502
3298
bf837fee7a15 Do not return negative hash values.
Stefan Vogel <sv@exept.de>
parents: 3188
diff changeset
  2503
    "Created: / 14.11.1996 / 12:12:27 / cg"
bf837fee7a15 Do not return negative hash values.
Stefan Vogel <sv@exept.de>
parents: 3188
diff changeset
  2504
    "Modified: / 24.2.1998 / 10:07:29 / stefan"
1976
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2505
! !
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2506
16293
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  2507
12978
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2508
!Integer methodsFor:'dependents access'!
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2509
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2510
addDependent:anObject
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2511
    Transcript show:'*** trying to make dependent on an integer: '.
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2512
    thisContext sender printOn:Transcript. Transcript cr.
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2513
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2514
    "Created: / 28-07-2010 / 20:29:00 / cg"
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2515
! !
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2516
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2517
!Integer methodsFor:'double dispatching'!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2518
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2519
differenceFromFraction:aFraction
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2520
    "sent when a fraction does not know how to subtract the receiver, an integer"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2521
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2522
    |d|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2523
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2524
    d := aFraction denominator.
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2525
    ^ aFraction class
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2526
        numerator:(aFraction numerator - (self * d))
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2527
        denominator:d
2793
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2528
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2529
    "Modified: 28.7.1997 / 19:08:30 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2530
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2531
11517
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2532
differenceFromTimestamp:aTimestamp
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2533
    "I am to be interpreted as seconds, return the timestamp this number of seconds
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2534
     before aTimestamp"
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2535
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2536
    ^ aTimestamp subtractSeconds:self.
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2537
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2538
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2539
     Timestamp now subtractSeconds:100
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2540
     100 differenceFromTimestamp:Timestamp now
11517
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2541
    "
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2542
!
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2543
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2544
equalFromFraction:aFraction
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2545
    "that should never be invoked, as fractions are always normalized to integers
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2546
     if resulting from an arithmetic operation.
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2547
     However, this implementation is for subclasses (i.e. fixed point) and also
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2548
     allows comparing unnormalized fractions as might appear within the fraction class"
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2549
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2550
    |denominator numerator|
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2551
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2552
    denominator := aFraction denominator.
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2553
    numerator := aFraction numerator.
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2554
    (denominator == 1) ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2555
        ^ numerator = (self * denominator)
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2556
    ].
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2557
    ^ numerator = self
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2558
!
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2559
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2560
productFromFraction:aFraction
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2561
    "sent when a fraction does not know how to multiply the receiver, an integer"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2562
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2563
    ^ aFraction class
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2564
        numerator:(self * aFraction numerator)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2565
        denominator:aFraction denominator
2793
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2566
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2567
    "Modified: 28.7.1997 / 19:08:27 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2568
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2569
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2570
quotientFromFraction:aFraction
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2571
    "Return the quotient of the argument, aFraction and the receiver.
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2572
     Sent when aFraction does not know how to divide by the receiver."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2573
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2574
    ^ aFraction class
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2575
        numerator:aFraction numerator
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2576
        denominator:(self * aFraction denominator)
2793
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2577
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2578
    "Modified: 28.7.1997 / 19:08:23 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2579
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2580
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2581
sumFromFraction:aFraction
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2582
    "sent when a fraction does not know how to add the receiver, an integer"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2583
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2584
    |d|
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2585
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2586
    d := aFraction denominator.
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2587
    ^ aFraction class
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2588
        numerator:(aFraction numerator + (self * d))
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2589
        denominator:d
2793
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2590
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2591
    "Modified: 28.7.1997 / 19:08:11 / cg"
10681
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2592
!
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2593
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2594
sumFromTimestamp:aTimestamp
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2595
    "I am to be interpreted as seconds, return the timestamp this number of seconds
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2596
     after aTimestamp"
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2597
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2598
    ^ aTimestamp addSeconds:self.
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2599
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2600
    "
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2601
     Timestamp now addSeconds:100
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2602
     100 sumFromTimestamp:Timestamp now
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2603
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2604
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2605
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2606
!Integer methodsFor:'helpers'!
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2607
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2608
gcd_helper:anInteger
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2609
    "a helper for the greatest common divisor of the receiver and anInteger.
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2610
     Knuth's algorithm for large positive integers, with receiver being
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2611
     larger than the arg."
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2612
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2613
    | a b selfLowBit argLowBit shift t |
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2614
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2615
    a := self.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2616
    b := anInteger.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2617
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2618
    selfLowBit := a lowBit - 1.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2619
    argLowBit := b lowBit - 1.
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2620
    shift := selfLowBit min:argLowBit.
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2621
    b := b bitShift:(argLowBit negated).
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2622
    [a = 0] whileFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2623
        a := a bitShift:(selfLowBit negated).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2624
        a < b ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2625
            t := a. a := b. b := t
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2626
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2627
        a := a - b.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2628
        selfLowBit := a lowBit - 1.
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2629
    ].
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2630
    ^ b bitShift:shift
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2631
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2632
    "Created: 1.3.1997 / 16:38:17 / cg"
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2633
    "Modified: 1.3.1997 / 16:45:17 / cg"
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2634
! !
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2635
10027
36281068b212 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9401
diff changeset
  2636
12565
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2637
!Integer methodsFor:'iteration'!
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2638
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2639
to:stop collect:aBlock
16347
ac28cfa26ec2 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16293
diff changeset
  2640
    "syntactic sugar; same as (self to:stop) collect:aBlock"
12565
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2641
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2642
    |n a|
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2643
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2644
    n := stop - self + 1.
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2645
    a := Array new:n.
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2646
    self to:stop do:[:i |
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2647
        a at:(i-self+1) put:(aBlock value:i).
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2648
    ].
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2649
    ^ a.
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2650
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2651
    "
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2652
     1 to:10 collect:[:i | i squared]
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2653
     10 to:20 collect:[:i | i squared]  
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2654
     (10 to:20) collect:[:i | i squared]
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2655
    "
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2656
! !
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2657
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2658
!Integer methodsFor:'misc math'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2659
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2660
acker:n
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2661
    "return the value of acker(self, n).
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  2662
     ;-) Do not try with receivers > 3"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2663
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2664
    (self == 0) ifTrue:[^ n + 1].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2665
    (n == 0) ifTrue:[^ (self - 1) acker: 1].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2666
    ^ (self - 1) acker:(self acker:(n - 1))
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2667
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2668
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2669
     3 acker:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2670
     3 acker:7
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2671
    "
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2672
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2673
    "Modified: 18.7.1996 / 13:08:16 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2674
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2675
11491
4920830c3d9a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11486
diff changeset
  2676
binco:kIn
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2677
    "an alternative name for the binomial coefficient for squeak compatibility"
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2678
11491
4920830c3d9a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11486
diff changeset
  2679
    ^ self binomialCoefficient:kIn
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2680
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2681
    "Modified: / 17-08-2010 / 17:29:07 / cg"
11491
4920830c3d9a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11486
diff changeset
  2682
!
4920830c3d9a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11486
diff changeset
  2683
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2684
binomialCoefficient:kIn
11486
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2685
    "The binomial coefficient
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2686
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2687
      / n \     with self being n, and 0 <= k <= n.
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2688
      \ k /
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2689
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2690
     is the number of ways of picking k unordered outcomes from n possibilities,
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2691
     also known as a combination or combinatorial number.
11486
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2692
     Sometimes also called C(n,k) (for choose k from n)
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2693
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2694
     binCo is defined as:
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2695
        n!!
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2696
     ----------
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2697
     k!! (n-k)!!
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2698
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2699
     but there is a faster, recursive formula:
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2700
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2701
      / n \  = / n - 1 \  + / n - 1 \
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2702
      \ k /    \ k - 1 /    \   k   /
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2703
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2704
     with:
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2705
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2706
      / n \  = / n \  =  1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2707
      \ 0 /    \ n /
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2708
    "
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2709
11486
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2710
    |k acc|
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2711
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2712
    kIn > self ifTrue:[^ 0].
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2713
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2714
    k := kIn.
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2715
    k > (self / 2) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2716
        "/ symmetry
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2717
        k := self - k.
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2718
    ].
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2719
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2720
    acc := 1.
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2721
    1 to:k do:[:i |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2722
        acc := acc * (self - k + i) / i.
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2723
    ].
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2724
    ^ acc
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2725
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2726
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2727
     (7 binomialCoefficient:3)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2728
     (10 binomialCoefficient:5)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2729
     (100 binomialCoefficient:5)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2730
     (1000 binomialCoefficient:5)
11486
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2731
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2732
     TestCase assert: (10 binomialCoefficient:5) = (10 factorial / (5 factorial * 5 factorial))
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2733
     TestCase assert: (100 binomialCoefficient:78) = (100 factorial / (78 factorial * (100-78) factorial))
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2734
     TestCase assert: (1000 binomialCoefficient:5) = (1000 factorial / (5 factorial * (1000-5) factorial))
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2735
     TestCase assert: (10000 binomialCoefficient:78) = (10000 factorial / (78 factorial * (10000-78) factorial))
11486
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2736
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2737
     Time millisecondsToRun:[ (10000 binomialCoefficient:78) ]                            -> 0
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2738
     Time millisecondsToRun:[ (10000 factorial / (78 factorial * (10000-78) factorial)) ] -> 437
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2739
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2740
    "
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2741
!
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2742
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2743
divMod:aNumber
17037
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2744
    "return an array filled with 
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2745
        (self // aNumber) and (self \\ aNumber).
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2746
     The returned remainder has the same sign as aNumber.
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2747
     The following is always true:
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2748
        (receiver // something) * something + (receiver \\ something) = receiver
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2749
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2750
     Be careful with negative results: 9 // 4 -> 2, while -9 // 4 -> -3.
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2751
     Especially surprising:     
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2752
        -1 \\ 10 -> 9  (because -(1/10) is truncated towards next smaller integer, which is -1,
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2753
                        and -1 multiplied by 10 gives -10, so we have to add 9 to get the original -1).
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2754
        -10 \\ 3 -> 2 (because -(10/3) is truncated towards next smaller integer, which is -4,
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2755
                        and -4 * 4 gives -12, so we need to add 2 to get the original -10.
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2756
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2757
     This may be redefined in some integer classes for
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2758
     more performance (where the remainder is generated as a side effect of division)"
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2759
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2760
    ^ Array
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2761
        with:(self // aNumber)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2762
        with:(self \\ aNumber)
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2763
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2764
    "
17037
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2765
     10 divMod:3       -> #(3 1)   because 3*3 + 1 = 10
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2766
     10 divMod:-3      -> #(-4 -2) because -4*-3 + (-2) = 10
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2767
     -10 divMod:3      -> #(-4 2) because -4*-3 + 2 = -10   
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2768
     -10 divMod:-3     -> #(3 -1)  because -3*3 + (-1) = -10
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2769
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2770
     1000000000000000000000 divMod:3   -> #(333333333333333333333 1)
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2771
     1000000000000000000000 divMod:-3  -> #(-333333333333333333334 -2)
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2772
     -1000000000000000000000 divMod:3  -> #(-333333333333333333334 2)
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2773
     -1000000000000000000000 divMod:-3 -> #(333333333333333333333 -1)
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2774
     100 factorial divMod:103
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2775
    "
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2776
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2777
    "Modified: 29.10.1996 / 21:18:58 / cg"
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2778
!
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2779
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2780
extendedEuclid:tb
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2781
    "return the solution of 'ax + by = gcd(a,b)'.
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2782
     An array containing x, y and gcd(a,b) is returned."
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2783
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2784
    |a b gcd gcd1 u u1 v v1 tmp t swap shift "{SmallInteger}"|
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2785
5001
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  2786
    self < tb ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2787
        a := self.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2788
        b := tb.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2789
        swap := false.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2790
    ] ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2791
        a := tb.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2792
        b := self.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2793
        swap := true.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2794
    ].
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2795
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2796
    shift := ((a lowBit) min:(b lowBit))-1.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2797
    shift > 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2798
        tmp := shift negated.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2799
        a := a bitShift:tmp.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2800
        b := b bitShift:tmp.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2801
    ].
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2802
9057
13bd29f579c6 Bug 343: #clearBit: changed the receiver (shouldn't do that).
Stefan Vogel <sv@exept.de>
parents: 8937
diff changeset
  2803
    gcd  := a.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2804
    gcd1 := b.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2805
    u := 1.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2806
    u1 := 0.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2807
    v := 0.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2808
    v1 := 1.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2809
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2810
    [
5001
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  2811
"/      The following condition is true:
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  2812
"/        (a * u1) + (b * v1) ~= gcd1 ifTrue:[self halt].
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2813
        t := gcd1 divMod:gcd.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2814
        gcd1 := gcd.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2815
        gcd := t at:2.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2816
        t := t at:1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2817
        tmp := v.
5003
304be9a3a226 Add some debug in #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 5001
diff changeset
  2818
"/v1 - (v * t) - v1 + (v * t) ~= 0 ifTrue:[self halt].
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2819
        v := v1 - (v * t).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2820
        v1 := tmp.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2821
        tmp := u.
5003
304be9a3a226 Add some debug in #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 5001
diff changeset
  2822
"/u1 - (u * t) - u1 + (u * t) ~= 0 ifTrue:[self halt].
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2823
        u := u1 - (u * t).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2824
        u1 := tmp.
9057
13bd29f579c6 Bug 343: #clearBit: changed the receiver (shouldn't do that).
Stefan Vogel <sv@exept.de>
parents: 8937
diff changeset
  2825
    gcd > 0] whileTrue.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2826
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2827
    shift > 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2828
        gcd1 := gcd1 bitShift:shift.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2829
    ].
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2830
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2831
    swap ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2832
        ^ Array with:v1 with:u1 with:gcd1.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2833
    ].
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2834
    ^ Array with:u1 with:v1 with:gcd1.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2835
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2836
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2837
    "
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2838
     14 extendedEuclid:5
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2839
     14 extendedEuclid:2
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2840
     25 extendedEuclid:15
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2841
    "
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2842
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2843
    "Created: / 27.4.1999 / 15:19:22 / stefan"
5001
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  2844
    "Modified: / 18.11.1999 / 16:19:24 / stefan"
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2845
!
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2846
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2847
factorial
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2848
    "return fac(self) (i.e. 1*2*3...*self) using an iterative algorithm.
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2849
     This is slightly faster than the recursive algorithm, and does not
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2850
     suffer from stack overflow problems (with big receivers)"
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2851
2745
bdf76e380d27 errorString to DomainError
Claus Gittinger <cg@exept.de>
parents: 2458
diff changeset
  2852
    |p i|
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2853
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2854
    (self < 2) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2855
        self < 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2856
            "/
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2857
            "/ requested factorial of a negative number
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2858
            "/
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2859
            ^ self class
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2860
                raise:#domainErrorSignal
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2861
                receiver:self
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2862
                selector:#factorial
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2863
                arguments:#()
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2864
                errorString:'factorial of negative number'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2865
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2866
        ^ 1
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2867
    ].
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2868
    p := 2.
2745
bdf76e380d27 errorString to DomainError
Claus Gittinger <cg@exept.de>
parents: 2458
diff changeset
  2869
    i := 3.
bdf76e380d27 errorString to DomainError
Claus Gittinger <cg@exept.de>
parents: 2458
diff changeset
  2870
    [i <= self] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2871
        p := p * i.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2872
        i := i + 1.
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2873
    ].
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2874
    ^ p
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2875
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2876
    "
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2877
     10 factorial
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2878
     1000 factorial
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2879
     10000 factorial
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2880
     10000 factorialR
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2881
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2882
     Time millisecondsToRun:[2000 factorial]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2883
     Time millisecondsToRun:[2000 factorialR]
2745
bdf76e380d27 errorString to DomainError
Claus Gittinger <cg@exept.de>
parents: 2458
diff changeset
  2884
     -1 factorial
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2885
    "
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2886
10027
36281068b212 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9401
diff changeset
  2887
    "Modified: / 04-10-2006 / 14:31:12 / cg"
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2888
!
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2889
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2890
factorialR
3908
b893f399f517 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3890
diff changeset
  2891
    "return fac(self) (i.e. 1*2*3...*self) using a recursive algorithm.
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2892
3908
b893f399f517 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3890
diff changeset
  2893
     This is included to demonstration purposes - if you really need
b893f399f517 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3890
diff changeset
  2894
     factorial numbers, use the iterative #factorial, which is slightly
b893f399f517 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3890
diff changeset
  2895
     faster and does not suffer from stack overflow problems (with big receivers)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2896
356
claus
parents: 345
diff changeset
  2897
    (self >= 2) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2898
        ^ self * (self - 1) factorialR
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2899
    ].
356
claus
parents: 345
diff changeset
  2900
    ^ 1
212
3edd10edefaf *** empty log message ***
claus
parents: 202
diff changeset
  2901
3edd10edefaf *** empty log message ***
claus
parents: 202
diff changeset
  2902
    "
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2903
     10 factorialR
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2904
     1000 factorialR
4158
e04b61500e51 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4151
diff changeset
  2905
     Time millisecondsToRun:[10000 factorial]
212
3edd10edefaf *** empty log message ***
claus
parents: 202
diff changeset
  2906
    "
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2907
3908
b893f399f517 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3890
diff changeset
  2908
    "Created: / 18.7.1996 / 12:48:36 / cg"
4158
e04b61500e51 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4151
diff changeset
  2909
    "Modified: / 8.5.1999 / 18:40:13 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2910
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2911
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2912
fib
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2913
    "compute the fibionacci number for the receiver.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2914
        fib(0) := 0
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2915
        fib(1) := 1
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2916
        fib(n) := fib(n-1) + fib(n-2)"
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2917
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2918
    self <= 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2919
        self == 0 ifTrue:[^ 0].
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2920
    ].
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2921
    ^ self fib_helper
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2922
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2923
    "
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  2924
     30 fib
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2925
     60 fib
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2926
     1000 fib
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2927
    "
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2928
!
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2929
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2930
fib_helper
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2931
    "compute the fibionacci number for the receiver.
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2932
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2933
        Fib(n) = Fib(n-1) + Fib(n-2)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2934
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2935
     Knuth:
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2936
        Fib(n+m) = Fib(m) * Fib(n+1) + Fib(m-1) * Fib(n)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2937
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2938
     This is about 3 times faster than fib_iterative.
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2939
    "
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2940
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2941
    |fibUsingDict dict|
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2942
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2943
    dict := Dictionary new:100.
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2944
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2945
    fibUsingDict := [:x |
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2946
        |n fib fibN fibNp1 fibNm1 fibXm1 fibXm2 fibXp1|
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2947
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2948
        x <= 30 ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2949
                "/ 0 1 2 3 4 5 6  7  8  9 10 11  12  13  14  15  16   17   18   19   20    21    22    23    24    25     26     27     28     29     30
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2950
            fib := #(1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2951
                     ) at:x
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2952
        ] ifFalse:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2953
            fib := dict at:x ifAbsent:nil.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2954
            fib isNil ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2955
                fibXm1 := dict at:(x-1) ifAbsent:nil.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2956
                fibXm1 notNil ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2957
                    fibXm2 := dict at:(x-2) ifAbsent:nil.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2958
                    fibXm2 notNil ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2959
                        fib := fibXm1 + fibXm2.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2960
                    ] ifFalse:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2961
                        fibXp1 := dict at:(x+1) ifAbsent:nil.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2962
                        fibXp1 notNil ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2963
                            fib := fibXp1 - fibXm1.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2964
                        ]
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2965
                    ]
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2966
                ].
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2967
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2968
                fib isNil ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2969
                    n := x // 2.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2970
                    x odd ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2971
                        "/ m is set to n+1; therefore:
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2972
                        "/ Fib(x) = Fib(n+n+1)      ; x odd; setting n = (x-1)/2
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2973
                        "/ using Knuth:
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2974
                        "/ Fib(n+n+1) = Fib(n+1) * Fib(n+1) + Fib(n+1-1) * Fib(n)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2975
                        "/            = (Fib(n+1) ^ 2) + (Fib(n) ^ 2)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2976
                        fibN   := fibUsingDict value:n.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2977
                        fibNp1 := fibUsingDict value:(n+1).
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2978
                        fib := fibN squared + fibNp1 squared
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2979
                    ] ifFalse:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2980
                        "/ as
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2981
                        "/    Fib(n+1) = Fib(n) + Fib(n-1)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2982
                        "/ therefore:
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2983
                        "/    Fib(n) = Fib(n+1) - Fib(n-1)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2984
                        "/ and, since n is even, n+1 and n-1 are odd, and can be computed as above.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2985
                        "/ This gives us:
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2986
                        "/    Fib(x) = Fib(x+1) - Fib(x-1)      ; x even; setting n = x/2
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2987
                        "/           = Fib(n+n+1) - Fib(n+n-1)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2988
                        "/           = Fib(n+n+1) - Fib((n-1)+(n-1)+1)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2989
                        "/           = ((Fib(n+1)^2) + (Fib(n)^2)) - ((Fib((n-1)+1)^2) + (Fib((n-1))^2))
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2990
                        "/           = (Fib(n+1)^2) + (Fib(n)^2) - (Fib(n)^2) - (Fib((n-1))^2)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2991
                        "/           = (Fib(n+1)^2) - (Fib((n-1))^2)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2992
                        fibNm1 := fibUsingDict value:(n-1).
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2993
                        fibNp1 := fibUsingDict value:(n+1).
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2994
                        fib := fibNp1 squared - fibNm1 squared
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2995
                    ].
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2996
                ].
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2997
                dict at:x put:fib.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2998
            ]
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2999
        ].
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3000
        fib
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3001
    ].
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3002
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3003
    ^ fibUsingDict value:self
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3004
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3005
    "the running time is mostly dictated by the LargeInteger multiplication performance...
18981
7a7c47446e9c #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 18905
diff changeset
  3006
     (therefore, we get O(n²) execution times, even for a linear number of multiplications)
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3007
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3008
     Time millisecondsToRun:[50000 fib_iterative]  312    (DUO 1.7Ghz CPU)
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3009
     Time millisecondsToRun:[50000 fib_helper]     109
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3010
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  3011
     Time millisecondsToRun:[100000 fib_iterative] 1248
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3012
     Time millisecondsToRun:[100000 fib_helper]    374
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3013
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  3014
     Time millisecondsToRun:[200000 fib_iterative] 4758
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3015
     Time millisecondsToRun:[200000 fib_helper]    1544
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3016
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  3017
     Time millisecondsToRun:[400000 fib_iterative] 18892
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3018
     Time millisecondsToRun:[400000 fib_helper]    6084
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3019
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3020
     1 to:100 do:[:i | self assert:(i fib_iterative = i fib_helper) ]
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3021
     1 to:100 do:[:i | self assert:(i fib_iterative = i fib) ]
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3022
    "
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3024
    "Modified: / 17-08-2010 / 17:29:34 / cg"
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3025
!
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3026
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3027
gcd:anInteger
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  3028
    "return the greatest common divisor of the receiver and anInteger.
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  3029
     Euclids & Knuths algorithm."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3030
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3031
    |a b t|
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3032
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3033
    a := self abs.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3034
    b := anInteger abs.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3035
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3036
    a < b ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3037
        t := a.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3038
        a := b.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3039
        b := t.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3040
    ].
52
cf23b8901602 *** empty log message ***
claus
parents: 49
diff changeset
  3041
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3042
    b = 0 ifTrue: [^ a].
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3043
    a := a \\ b.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3044
    a = 0 ifTrue:[^ b].
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3045
    ^ b gcd_helper:a
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  3046
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3047
    "
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3048
     3141589999999999 gcd:1000000000000000
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3049
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3050
     Time millisecondsToRun:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3051
        10000 timesRepeat:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3052
           123456789012345678901234567890 gcd: 9876543210987654321
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3053
        ]
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3054
     ]
3060
0faf242e1142 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  3055
    "
0faf242e1142 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  3056
0faf242e1142 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  3057
    "Modified: / 25.10.1997 / 16:08:45 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3058
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3059
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3060
integerLog2
14491
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3061
    "return the floor of log2 of the receiver.
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3062
     This is the same as (self log:2) floor."
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3063
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3064
    self <= 0 ifTrue:[
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3065
        ^ self class
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3066
            raise:#domainErrorSignal
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3067
            receiver:self
14491
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3068
            selector:#integerLog2
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3069
            arguments:#()
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3070
            errorString:'logarithm of negative integer'
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3071
    ].
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3072
    ^ self highBit - 1.
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3073
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3074
    "
14491
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3075
      2  log:2  
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3076
      2  integerLog2  
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3077
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3078
      3  log:2       
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3079
      3  integerLog2  
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3080
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3081
      4  log:2          
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3082
      4  integerLog2    
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3083
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3084
      64  integerLog2  
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3085
      100 integerLog2
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3086
      100 log:2
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3087
      999 integerLog2
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3088
      999 log:2
14767
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3089
      120000 integerLog2 
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3090
      120000 log:2       
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3091
      -1 integerLog2
14767
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3092
      50 factorial integerLog2   
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3093
      50 factorial log:2
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3094
      1000 factorial integerLog2   
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3095
      1000 factorial log:2       -- float error!!
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3096
    "
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3097
!
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3098
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3099
integerReciprocal
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3100
    "return an integer representing 1/self * 2**n.
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3101
     Where an integer is one bit longer than self.
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3102
     This is a helper for modulu numbers"
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3103
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3104
    |b rem result|
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3105
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3106
    b := self highBit.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3107
    rem := 1 bitShift:b.
10488
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  3108
    result := LargeInteger basicNew numberOfDigits:(b // 8)+1.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3109
    b := b+1.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3110
    [b > 0] whileTrue:[
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3111
        rem >= self ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3112
            rem := rem -= self.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3113
            result digitBytes bitSetAt:b.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3114
        ].
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3115
        rem := rem mul2.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3116
        b := b - 1.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3117
    ].
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3118
    ^ result compressed.
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3119
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3120
    "
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3121
     333 integerReciprocal                (2 raisedTo:18) // 333
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3122
     393 integerReciprocal
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  3123
     8 integerReciprocal
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  3124
     15 integerReciprocal
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3125
     15112233445566 integerReciprocal
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3126
     10239552311579 integerReciprocal
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3127
   "
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3128
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3129
    "Modified: / 03-05-1999 / 14:27:18 / stefan"
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3130
    "Modified: / 17-08-2010 / 17:30:22 / cg"
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3131
!
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3132
12588
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3133
integerSqrt
18865
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  3134
    "return the largest integer which is less or equal to the
12586
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3135
     receiver's square root. 
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3136
     This might be needed for some number theoretic problems with large numbers
18865
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  3137
     (and also in cryptography). Uses Newton's method"
12586
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3138
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3139
    |guess prevGuess guessSquared|
12581
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3140
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3141
    self negative ifTrue:[
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3142
        ^ self class
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3143
            raise:#imaginaryResultSignal
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3144
            receiver:self
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3145
            selector:#integerSqrt
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3146
            arguments:#()
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3147
            errorString:'bad (negative) receiver in sqrt'
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3148
    ].
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3149
    
12582
7afa0bb19bbe comment/format in: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12581
diff changeset
  3150
    guess := (1 bitShift:(self highBit // 2)).
12581
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3151
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3152
    [ 
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3153
        prevGuess ~= guess
12586
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3154
        and:[ ((guessSquared := guess squared) - self) abs >= guess ]
12581
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3155
    ] whileTrue:[
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3156
        prevGuess := guess.
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3157
        guess := (guess + (self / guess)) // 2.
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3158
    ].
12586
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3159
    guessSquared > self ifTrue:[
12581
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3160
        guess := guess - 1.
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3161
    ].
12585
e8ce2be6049a changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12582
diff changeset
  3162
    "/ self assert:(guess squared <= self).
e8ce2be6049a changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12582
diff changeset
  3163
    "/ self assert:((guess + 1) squared > self).
12581
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3164
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3165
    ^ guess.
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3166
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3167
    "
12588
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3168
     333 integerSqrt          
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3169
     325 integerSqrt          
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3170
     324 integerSqrt          
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3171
     323 integerSqrt          
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3172
     10239552311579 integerSqrt
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3173
     5397346292805549782720214077673687806275517530364350655459511599582614290 integerSqrt
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3174
     1000 factorial integerSqrt
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3175
     
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3176
     1000 factorial - 1000 factorial integerSqrt squared
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3177
     1000 factorial - (1000 factorial integerSqrt + 1) squared
12581
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3178
   "
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3179
!
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3180
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3181
inverseMod:n
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3182
    "find the modular inverse for myself to n.
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3183
     This is defined as the solution of: '1 = (self * x) mod n.
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3184
     This is a helper for modulu numbers"
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3185
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3186
    |e ret|
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3187
5001
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  3188
    "the following expression returns #(x y (self gcd:n)), the solution of the equation
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  3189
     (self * x) + (n * y) = self gcd:n"
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  3190
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3191
    e := self extendedEuclid:n.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3192
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3193
    (e at:3) == 1 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3194
        ret := e at:1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3195
        ret negative ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3196
            ^ ret + n
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3197
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3198
        ^ ret.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3199
    ].
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3200
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3201
    ^ 0
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3202
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3203
    "
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3204
     14 inverseMod:5      -> 4
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3205
     5 inverseMod:14      -> 3
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3206
     14 inverseMod:11     -> 4                (4 * 14) \\ 11
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3207
     11 inverseMod:14     -> 9                (9 * 11) \\ 14
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3208
     79 inverseMod:3220   -> 1019
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3209
     3220 inverseMod:79   -> 54               (54 * 3220) \\ 79
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3210
     1234567891 inverseMod:1111111111119
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3211
                          -> 148726663534     (148726663534*1234567891) \\ 1111111111119
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3212
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3213
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3214
     14 extendedEuclid:11
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3215
     5 extendedEuclid:14
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3216
     14 extendedEuclid:2
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3217
     3220 extendedEuclid:79
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3218
    "
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3219
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3220
    "Created: / 27.4.1999 / 15:19:22 / stefan"
5001
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  3221
    "Modified: / 18.11.1999 / 16:21:37 / stefan"
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3222
!
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3223
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3224
lcm:anInteger
52
cf23b8901602 *** empty log message ***
claus
parents: 49
diff changeset
  3225
    "return the least common multiple (using gcd:)"
cf23b8901602 *** empty log message ***
claus
parents: 49
diff changeset
  3226
cf23b8901602 *** empty log message ***
claus
parents: 49
diff changeset
  3227
    ^ (self * anInteger) abs // (self gcd: anInteger)
cf23b8901602 *** empty log message ***
claus
parents: 49
diff changeset
  3228
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3229
    "
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3230
     65 lcm:15
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3231
     3 lcm:15
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3232
    "
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3233
!
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3234
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3235
primeFactors
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3236
    "return a collection of prime factors of the receiver.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3237
     For prime numbers, an empty collection is returned.
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3238
     Can take a long time for big numbers"
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3239
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3240
    ^ self primeFactorsUpTo:nil
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3241
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3242
    "
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3243
     2 to:10000 do:[:n |
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3244
        self assert:((n isPrime and:[ n primeFactors isEmpty])
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3245
                    or:[ n isPrime not and:[n primeFactors product = n]])
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3246
     ]
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3247
     3 to:10000 do:[:n |
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3248
        self assert:(n factorial primeFactors product = n factorial)
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3249
     ]
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3250
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3251
     13195 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3252
     12 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3253
     2 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3254
     3 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3255
     5 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3256
     14 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3257
     13423453625634765 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3258
     13423453625634765 isPrime
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3259
     13423453625634765 gcd:(3 * 5 * 19 * 29)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3260
     13423453625634765 / 8265
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3261
     1624132320101 isPrime
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3262
     1624132320101 gcd: 8265
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3263
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3264
     1000000 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3265
     100000000 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3266
     1000000000 primeFactors
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3267
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3268
     Time millisecondsToRun:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3269
        1000 timesRepeat:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3270
            10000000000000000000000000000000000000 primeFactors
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3271
        ]
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3272
     ]   421
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3273
    "
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3274
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3275
    "Modified: / 17-08-2010 / 17:27:33 / cg"
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3276
!
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3277
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3278
primeFactorsUpTo:limitArgOrNil
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3279
    "return a collection of prime factors of the receiver.
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3280
     For prime numbers, an empty collection is returned.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3281
     Can take a long time for big numbers
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3282
     (win a nobel price, if you find something quick (*)
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3283
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3284
     (*):which does not mean that the code below is optimal - far from it !!"
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3285
18865
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  3286
    "See comment in initializePrimeCacheUpTo:limit"
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  3287
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
  3288
    |rest n factors limit lastPrime checkThisFactor nextTry|
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3289
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3290
    factors := Bag new.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3291
    rest := self.
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3292
    limit := (rest // 2).
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3293
    limitArgOrNil notNil ifTrue:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3294
        limit := limit min:limitArgOrNil.
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3295
    ].
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3296
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3297
    "/ try to get the number down fast:
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3298
    n := rest lowBit.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3299
    n ~~ 1 ifTrue:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3300
        self == 2 ifTrue:[^ #() ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3301
        factors add:2 withOccurrences:(n-1).
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3302
        rest := rest rightShift:(n-1).
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3303
    ].
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3304
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3305
    checkThisFactor := [:prime |
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3306
            prime*prime > rest ifTrue:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3307
                (rest ~~ 1 and:[factors notEmpty]) ifTrue:[ factors add:rest ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3308
                ^ factors.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3309
            ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3310
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3311
            [rest \\ prime == 0] whileTrue:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3312
                factors add:prime.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3313
                rest := rest // prime.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3314
                rest == 1 ifTrue:[^ factors].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3315
            ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3316
            lastPrime := prime.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3317
        ].
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3318
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3319
    limit <= 2000 ifTrue:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3320
        Integer primesUpTo2000 do:checkThisFactor.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3321
        ^ factors
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3322
    ].
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3323
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3324
    "/ actually, all of the code is duplicated; once for primes from a table,
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3325
    "/ and then primes as generated on the fly. The prime generation involves a prime-test,
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3326
    "/ which may slow things down quite a bit.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3327
    "/ (the primesUpTo uses a faster sieve, but can only represent primes to upTo (say)
13022
43a439f72615 comment/format
Claus Gittinger <cg@exept.de>
parents: 13021
diff changeset
  3328
    "/ a few millions).
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3329
11938
79dcaf7ae7ad changed #primeFactorsUpTo:
Claus Gittinger <cg@exept.de>
parents: 11936
diff changeset
  3330
    Integer primesUpTo:(limit min:(1000000 max:Integer primeCacheSize)) do:checkThisFactor.
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3331
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3332
    nextTry := lastPrime + 2.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3333
    [ nextTry <= limit ] whileTrue:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3334
        "/ now, we are beyond the list of pre-generated primes.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3335
        "/ change our strategy to: see if it divides an odd number;
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3336
        "/ if so, add the divisor's prime factors.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3337
        nextTry*nextTry > rest ifTrue:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3338
            (rest ~~ 1 and:[factors notEmpty]) ifTrue:[ factors add:rest ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3339
            ^ factors.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3340
        ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3341
        [(rest \\ nextTry) == 0] whileTrue:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3342
            "/ can only happen relatively late after the last prime,
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3343
            "/ because otherwise, the primeFactors of nextTry would already have
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3344
            "/ been found as divisors.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3345
            "/ first chance is: (lastPrime + 2) squared
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3346
            nextTry < lastPrime squared ifTrue:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3347
                "/ nextTry is a prime !!
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3348
                factors add:nextTry
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3349
            ] ifFalse:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3350
                factors addAll:(nextTry primeFactors).
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3351
            ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3352
            rest := rest // nextTry.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3353
        ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3354
        nextTry := nextTry + 2.
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3355
    ].
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3356
    ^ factors
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3357
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3358
    "
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3359
     2 to:10000 do:[:n |
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3360
        self assert:((n isPrime and:[ n primeFactors isEmpty])
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3361
                    or:[ n isPrime not and:[n primeFactors product = n]])
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3362
     ]
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3363
     3 to:10000 do:[:n |
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3364
        self assert:(n factorial primeFactors product = n factorial)
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3365
     ]
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3366
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3367
     13195 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3368
     12 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3369
     2 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3370
     3 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3371
     5 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3372
     14 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3373
     13423453625634765 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3374
     13423453625634765 isPrime
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3375
     13423453625634765 gcd:(3 * 5 * 19 * 29)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3376
     13423453625634765 / 8265
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3377
     1624132320101 isPrime
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3378
     1624132320101 gcd: 8265
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3379
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3380
     1000000 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3381
     100000000 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3382
     1000000000 primeFactors
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3383
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3384
     Time millisecondsToRun:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3385
        1000 timesRepeat:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3386
            10000000000000000000000000000000000000 primeFactors
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3387
        ]
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3388
     ]   421
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3389
    "
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3390
13022
43a439f72615 comment/format
Claus Gittinger <cg@exept.de>
parents: 13021
diff changeset
  3391
    "Modified: / 17-08-2010 / 17:28:05 / cg"
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3392
!
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3393
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3394
raisedTo:exp mod:mod
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3395
    "return the modulo (remainder) of
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3396
     the receiver raised to exp (an Integer) and mod (another Integer)"
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3397
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3398
    |result m t
5816
ce15ce5294b4 Cleanup unused method vars
Stefan Vogel <sv@exept.de>
parents: 5799
diff changeset
  3399
"/     eI   "{Class: SmallInteger}"
ce15ce5294b4 Cleanup unused method vars
Stefan Vogel <sv@exept.de>
parents: 5799
diff changeset
  3400
     bits "{Class: SmallInteger}"|
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3401
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3402
    "use the addition chaining algorithm"
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3403
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3404
    exp == 0 ifTrue:[
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3405
        ^ 1
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3406
    ].
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3407
    exp == 1 ifTrue:[
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3408
        mod isNumber ifTrue:[
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3409
            ^ self \\ mod.
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3410
        ]
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3411
    ].
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3412
    exp negative ifTrue:[
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3413
        ^ self class
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3414
            raise:#domainErrorSignal
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3415
            receiver:self
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3416
            selector:#raisedTo:mod:
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3417
            arguments:(Array with:exp with:mod)
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3418
            errorString:'modulo arithmethic with negative exponent'
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3419
    ].
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3420
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3421
    m := mod asModuloNumber.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3422
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3423
    result := 1.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3424
    t := m modulusOf:self.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3425
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3426
    "/ to be validated ...
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3427
"/    (exp class == SmallInteger) ifTrue:[
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3428
"/        eI := exp.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3429
"/        [eI ~~ 0] whileTrue:[
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3430
"/            (eI bitAnd:1) == 1 ifTrue:[
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3431
"/                result := m modulusOf:(result * t).
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3432
"/            ].
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3433
"/            t := m modulusOf:(t * t).
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3434
"/            eI := eI bitShift:-1.
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3435
"/        ].
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3436
"/        ^ result.
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3437
"/    ].
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3438
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3439
    bits := exp highBit.
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3440
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3441
    1 to:bits-1 do:[:i|
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3442
        (exp bitAt:i) == 1 ifTrue:[
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3443
            result := m modulusOf:(result * t).
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3444
        ].
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3445
        t := m modulusOf:(t * t).
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3446
    ].
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3447
    result := m modulusOf:(result * t).
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3448
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3449
    ^ result
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3450
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3451
    "
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3452
     2 raisedTo:2 mod:3
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3453
      20000000000000 raisedTo:200 mod:190  ->  30
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3454
     (20000000000000 raisedTo:200) \\ 190
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3455
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3456
      Time millisecondsToRun:[10000 timesRepeat:[
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3457
                                20000000000000 raisedTo:200 mod:190
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3458
                              ]
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3459
                             ]
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3460
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3461
     Time millisecondsToRun:[1000 timesRepeat:[
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3462
                                (20000000000000 raisedTo:200) \\ 190
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3463
                             ]
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3464
                            ]
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3465
    "
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3466
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3467
    "Created: / 27.4.1999 / 15:19:22 / stefan"
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3468
    "Modified: / 5.5.1999 / 11:18:20 / stefan"
6195
9e60c38d1d61 #raise:receiver:selector...
Claus Gittinger <cg@exept.de>
parents: 6055
diff changeset
  3469
    "Modified: / 16.11.2001 / 14:15:21 / cg"
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3470
!
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3471
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3472
raisedToCrtModP:p q:q ep:ep eq:eq u:u
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3473
    "Application of the Chinese Remainder Theorem (CRT).
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3474
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3475
     This is a faster modexp for moduli with a known factorisation into two
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3476
     relatively prime factors p and q, and an input relatively prime to the
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3477
     modulus, the Chinese Remainder Theorem to do the computation mod p and
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3478
     mod q, and then combine the results.  This relies on a number of
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3479
     precomputed values, but does not actually require the modulus n or the
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3480
     exponent e.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3481
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3482
     expout = expin ^ e mod (p*q).
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3483
     We form this by evaluating
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3484
     p2 = (expin ^ e) mod p and
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3485
     q2 = (expin ^ e) mod q
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3486
     and then combining the two by the CRT.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3487
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3488
     Two optimisations of this are possible.  First, we can reduce expin
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3489
     modulo p and q before starting.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3490
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3491
     Second, since we know the factorisation of p and q (trivially derived
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3492
     from the factorisation of n = p*q), and expin is relatively prime to
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3493
     both p and q, we can use Euler's theorem, expin^phi(m) = 1 (mod m),
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3494
     to throw away multiples of phi(p) or phi(q) in e.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3495
     Letting ep = e mod phi(p) and
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3496
              eq = e mod phi(q)
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3497
     then combining these two speedups, we only need to evaluate
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3498
     p2 = ((expin mod p) ^ ep) mod p and
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3499
     q2 = ((expin mod q) ^ eq) mod q.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3500
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3501
     Now we need to apply the CRT.  Starting with
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3502
     expout = p2 (mod p) and
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3503
     expout = q2 (mod q)
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3504
     we can say that expout = p2 + p * k, and if we assume that 0 <= p2 < p,
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3505
     then 0 <= expout < p*q for some 0 <= k < q.  Since we want expout = q2
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3506
     (mod q), then p*k = q2-p2 (mod q).  Since p and q are relatively prime,
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3507
     p has a multiplicative inverse u mod q.  In other words, u = 1/p (mod q).
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3508
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3509
     Multiplying by u on both sides gives k = u*(q2-p2) (mod q).
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3510
     Since we want 0 <= k < q, we can thus find k as
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3511
     k = (u * (q2-p2)) mod q.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3512
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3513
     Once we have k, evaluating p2 + p * k is easy, and
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3514
     that gives us the result
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3515
    "
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3516
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3517
    |result t mp mq|
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3518
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3519
    mp := p asModuloNumber.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3520
    t := mp modulusOf:self.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3521
    result := t raisedTo:ep mod:mp.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3522
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3523
    mq := q asModuloNumber.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3524
    t := mq modulusOf:self.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3525
    t := t raisedTo:eq mod:mq.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3526
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3527
    "now p2 is in result, q2 in t"
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3528
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3529
    t := t -= result.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3530
    t < 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3531
        t := t + q.
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3532
    ].
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3533
    t := t *= u.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3534
    t := mq modulusOf:t.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3535
    t := t *= p.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3536
    result := result += t.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3537
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3538
    ^ result.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3539
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3540
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3541
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3542
    "
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3543
     2 raisedTo:2 mod:3
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3544
      20000000000000 raisedTo:200 mod:190
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3545
     (20000000000000 raisedTo:200) \\ 190
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3546
    "
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3547
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3548
    "Created: / 30.4.1999 / 15:53:15 / stefan"
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3549
    "Modified: / 5.5.1999 / 11:01:15 / stefan"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3550
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3551
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3552
!Integer methodsFor:'printing & storing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3553
16038
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3554
asBCD
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3555
    "return an integer which represents the BCD encoded value of the receiver;
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3556
     that is: each digit of its decimal representation is placed into a nibble
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3557
     of the result. (aka 162 -> 0x162).
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3558
     This conversion is useful for some communication protocols,
16040
4708e4544528 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16038
diff changeset
  3559
     or control systems, which represent numbers this way...
4708e4544528 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16038
diff changeset
  3560
     This fallback code is not particularily tuned or optimized for speed."
16038
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3561
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3562
    |rest twoDigits hi lo shift out|
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3563
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3564
    out := 0. shift := 0.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3565
    rest := self.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3566
    [rest > 0] whileTrue:[
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3567
        twoDigits := rest \\ 100.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3568
        rest := rest // 100.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3569
        hi := twoDigits // 10.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3570
        lo := twoDigits \\ 10.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3571
        out := out bitOr:(((hi bitShift:4)+lo) bitShift:shift).
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3572
        shift := shift + 8.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3573
    ].
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3574
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3575
    ^ out
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3576
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3577
    "
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3578
     (100 factorial) asBCD
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3579
     999999999 asBCD 
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3580
     100000000 asBCD   
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3581
     123456789 asBCD   
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3582
     99999999 asBCD  
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3583
     12345678 asBCD
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3584
     12345678 asBCD 
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3585
     12345678 asBCD hexPrintString
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3586
     12345678901234567890 asBCD
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3587
    "
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3588
!
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3589
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3590
asBCDBytes
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3591
    "return a byteArray containing the receiver in BCD encoding.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3592
     The byteArray will contain the BCD encoded decimal string,
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3593
     starting with the most significant digits first.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3594
     This conversion is useful for some communication protocols,
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3595
     or control systems, which represent big numbers this way...
16038
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3596
     This is not particularily tuned or optimized for speed."
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3597
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3598
    |s rest twoDigits hi lo|
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3599
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3600
    self == 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3601
        ^ #[ 16r00 ]
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3602
    ].
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3603
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3604
    "/ a very rough estimate on the final size ...
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3605
    s := (ByteArray new:(self digitLength * 2)) writeStream.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3606
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3607
    rest := self.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3608
    [rest > 0] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3609
        twoDigits := rest \\ 100.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3610
        rest := rest // 100.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3611
        hi := twoDigits \\ 10.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3612
        lo := twoDigits // 10.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3613
        s nextPut:(lo bitShift:4)+hi
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3614
    ].
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3615
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3616
    ^ s contents reverse
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3617
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3618
    "
16038
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3619
     12345678 asBCDBytes 
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3620
     12345678 asBCDBytes hexPrintString
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3621
     12345678901234567890 asBCDBytes
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3622
    "
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3623
!
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3624
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3625
errorPrintHex
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3626
    "print the receiver as a hex number on the standard error stream"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3627
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3628
     (self printStringRadix:16) errorPrint
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3629
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3630
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3631
hexPrintString
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3632
    "return a hex string representation of the receiver"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3633
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3634
    ^ self printStringRadix:16
3874
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3635
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3636
    "
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3637
     127 hexPrintString
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3638
     -1 hexPrintString
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3639
    "
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3640
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3641
    "Modified: / 11.10.1998 / 01:15:43 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3642
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3643
2408
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3644
hexPrintString:size
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3645
    "return a hex string representation of the receiver,
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3646
     padded to size characters"
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3647
5799
547c417b23cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5782
diff changeset
  3648
"/    ^ (self printStringRadix:16) leftPaddedTo:size with:$0
547c417b23cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5782
diff changeset
  3649
    ^ self printStringRadix:16 size:size fill:$0
547c417b23cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5782
diff changeset
  3650
547c417b23cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5782
diff changeset
  3651
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3652
     12345 hexPrintString:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3653
     123 hexPrintString:4
5799
547c417b23cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5782
diff changeset
  3654
    "
2408
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3655
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3656
    "Created: 18.2.1997 / 13:32:33 / cg"
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3657
!
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3658
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3659
printHex
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3660
    "print the receiver as a hex number on the standard output stream"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3661
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3662
     (self printStringRadix:16) print
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3663
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3664
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3665
printOn:aStream base:b showRadix:showRadix
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3666
    "append a string representation of the receiver in the specified numberBase to aStream
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3667
     (if showRadix is true, with initial XXr)
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3668
     The radix argument should be between 2 and 36."
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3669
4522
29a6625dc7b1 error: vs. error:mayProceed:
Claus Gittinger <cg@exept.de>
parents: 4424
diff changeset
  3670
    |base num s divMod mod r r2 r4 nD numN|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3671
4522
29a6625dc7b1 error: vs. error:mayProceed:
Claus Gittinger <cg@exept.de>
parents: 4424
diff changeset
  3672
    base := b.
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3673
    (base isInteger and:[ base between:2 and:36 ]) ifFalse:[
14967
0f7cf85949b2 class: Integer
Stefan Vogel <sv@exept.de>
parents: 14796
diff changeset
  3674
        ConversionError raiseRequestWith:self errorString:' - invalid base: ', base printString.
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3675
        base := 10.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 52
diff changeset
  3676
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 52
diff changeset
  3677
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3678
    showRadix ifTrue:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3679
        base printOn:aStream.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3680
        aStream nextPut:$r.
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3681
    ].
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3682
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3683
    (self = 0) ifTrue:[aStream nextPut:$0. ^ self].
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3684
    (self negative) ifTrue:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3685
        aStream nextPut:$- .
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3686
        num := self negated.
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3687
    ] ifFalse:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3688
        num := self.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3689
    ].
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3690
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3691
    "
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3692
     claus: changed it from a recursive algorithm;
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3693
     (it used to trigger stack-overflow exceptions when printing 3000 factorial ...)
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3694
    "
18865
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  3695
    "/    leftPart := num // base.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  3696
    "/    (leftPart ~= 0) ifTrue:[
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  3697
    "/        leftPart printOn:aStream base:base.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  3698
    "/        aStream nextPut:(Character digitValue:(num \\ base).
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  3699
    "/        ^ self
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  3700
    "/    ].
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  3701
    "/    aStream nextPut:(Character digitValue:num).
2951
256e90eee7f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2816
diff changeset
  3702
3121
91de0211651c even faster largeInt printString, by doing it in bigger junks (8digits a time)
Claus Gittinger <cg@exept.de>
parents: 3060
diff changeset
  3703
    "/ instead of computing the quotient and remainder
3136
91dbf1ea13a6 print in junks of 6 digits (instead of 8 digits)
Claus Gittinger <cg@exept.de>
parents: 3135
diff changeset
  3704
    "/ against radix, do it in junks of 5 or 6 digits.
3121
91de0211651c even faster largeInt printString, by doing it in bigger junks (8digits a time)
Claus Gittinger <cg@exept.de>
parents: 3060
diff changeset
  3705
    "/ This reduces the number of LargeInt-divisions
91de0211651c even faster largeInt printString, by doing it in bigger junks (8digits a time)
Claus Gittinger <cg@exept.de>
parents: 3060
diff changeset
  3706
    "/ by that factor (turning them into smallInt divisions
91de0211651c even faster largeInt printString, by doing it in bigger junks (8digits a time)
Claus Gittinger <cg@exept.de>
parents: 3060
diff changeset
  3707
    "/ within that junk) and speeds up the conversions noticably.
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  3708
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3709
    r2 := base*base.   "/ radix^2
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3710
    r4 := r2*r2.        "/ radix^4
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3711
    base <= 10 ifTrue:[
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3712
        r := r4*r2.     "/ radix^6 (chunks of 6 digits)
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3713
        nD := 6.
3121
91de0211651c even faster largeInt printString, by doing it in bigger junks (8digits a time)
Claus Gittinger <cg@exept.de>
parents: 3060
diff changeset
  3714
    ] ifFalse:[
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3715
        r := r4*base.    "/ radix^5 (chunks of 5 digits)
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3716
        nD := 5.
3121
91de0211651c even faster largeInt printString, by doing it in bigger junks (8digits a time)
Claus Gittinger <cg@exept.de>
parents: 3060
diff changeset
  3717
    ].
19002
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3718
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3719
    "/ JV@2015-12-28: I have to admit I don't understand this code,
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3720
    "/ however, the following if made printing with base of 16 to
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3721
    "/ diverge on 64bit builds (causing RegressionTests::IntegerTest>>testLargeIntegerHelpers
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3722
    "/ to fail). When disabled, everything seems to be OK.
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3723
    "/ Therefore I disabled the code, even though it might slower.
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3724
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3725
"/    SmallInteger maxBits >= 63 ifTrue:[
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3726
"/        r := r*r.    "/ radix^10 / radix^12 (chunks of 10/12 digits)
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3727
"/        nD := nD * 2.
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3728
"/    ].
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3729
   
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3730
    "get a Stream with space for the digits we are going to print.
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3731
     We need ((num log:base) ceiling) digits, which is equivalent
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3732
     to ((num log:2)/(base log:2) ceiling)
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3733
    "
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3734
    s := WriteStream on:(String new:10).
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3735
3121
91de0211651c even faster largeInt printString, by doing it in bigger junks (8digits a time)
Claus Gittinger <cg@exept.de>
parents: 3060
diff changeset
  3736
    [num >= r] whileTrue:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3737
        "/
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3738
        "/ chop off nD digits.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3739
        "/
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3740
        divMod := num divMod:r.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3741
        num := divMod at:1.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3742
        numN := divMod at:2.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3743
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3744
        "/ process them
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3745
        nD timesRepeat:[
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3746
            divMod := numN divMod:base.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3747
            numN := divMod at:1.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3748
            mod := divMod at:2.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3749
            s nextPut:(Character digitValue:mod).
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3750
        ].
2951
256e90eee7f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2816
diff changeset
  3751
    ].
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  3752
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3753
    [num ~= 0] whileTrue:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3754
        divMod := num divMod:base.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3755
        num := divMod at:1.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3756
        mod := divMod at:2.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3757
        s nextPut:(Character digitValue:mod).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3758
    ].
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3759
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3760
    aStream nextPutAll:(s contents reverse).
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3761
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3762
    "
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3763
        3000 factorial printOn:Transcript base:10
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3764
        10 printOn:Transcript base:3
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3765
        31 printOn:Transcript base:3
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3766
        10 printOn:Transcript base:2
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3767
        31 printOn:Transcript base:2
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3768
        -20  printOn:Transcript base:16
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3769
        -20  printOn:Transcript base:10
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  3770
        Time millisecondsToRun:[10000 factorial printString] 610  7650
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3771
    "
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3772
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3773
    "Modified: / 20-01-1998 / 18:05:02 / stefan"
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3774
    "Created: / 07-09-2001 / 13:51:33 / cg"
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3775
    "Modified: / 02-08-2010 / 12:24:14 / cg"
19002
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  3776
    "Modified (comment): / 28-12-2015 / 08:23:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3777
!
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3778
15775
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3779
printOn:aStream base:baseInteger size:sz 
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3780
    "print a string representation of the receiver in the specified
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3781
     base. The string is padded on the left with fillCharacter to make
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3782
     its size as specified in sz."
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3783
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3784
    self printOn:aStream base:baseInteger size:sz fill:$0
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3785
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3786
    "
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3787
     1024 printOn:Transcript base:16 size:4
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3788
     1024 printOn:Transcript base:2 size:16.
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3789
     1024 printOn:Transcript base:16 size:8.
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3790
    "
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3791
!
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3792
7173
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3793
printOn:aStream base:baseInteger size:sz fill:fillCharacter
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3794
    "print a string representation of the receiver in the specified
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3795
     base. The string is padded on the left with fillCharacter to make
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3796
     its size as specified in sz."
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3797
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3798
    |stream string actualSize|
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3799
11793
87abb9669c47 changed #printOn:based:showRadix:
Stefan Vogel <sv@exept.de>
parents: 11654
diff changeset
  3800
    stream := WriteStream on:(String new:sz).
7173
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3801
    self printOn:stream base:baseInteger showRadix:false.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3802
    string := stream contents.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3803
    actualSize := string size.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3804
    actualSize < sz ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3805
        aStream next:sz-actualSize put:fillCharacter.
7173
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3806
    ].
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3807
    aStream nextPutAll:string.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3808
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3809
    "
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3810
     1024 printOn:Transcript base:16 size:4 fill:$0
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3811
     1024 printOn:Transcript base:2 size:16 fill:$.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3812
     1024 printOn:Transcript base:16 size:8 fill:Character space.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3813
    "
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3814
!
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3815
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3816
printOn:aStream radix:base
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3817
    "append a printed description of the receiver to aStream.
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3818
     The receiver is printed in radix base (instead of the default, 10).
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3819
     This method is obsoleted by #printOn:base:, which is ST-80 & ANSI compatible."
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3820
8897
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
  3821
    <resource: #obsolete>
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
  3822
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3823
    self printOn:aStream base:base
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3824
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3825
    "Modified: / 20.1.1998 / 14:10:45 / stefan"
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3826
    "Modified: / 7.9.2001 / 13:58:29 / cg"
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3827
!
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3828
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3829
printRomanOn:aStream
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3830
    "print the receiver as roman number to the receiver, aStream.
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3831
     This converts correct (i.e. prefix notation for 4,9,40,90, etc.)."
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3832
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3833
    ^ self printRomanOn:aStream naive:false
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3834
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3835
    "
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3836
     1 to:10 do:[:i | i printRomanOn:Transcript. Transcript cr.].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3837
     1999 printRomanOn:Transcript. Transcript cr.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3838
     Date today year printRomanOn:Transcript. Transcript cr.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3839
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3840
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3841
    "test all between 1 and 9999:
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3842
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3843
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3844
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3845
        romanString := String streamContents:[:stream | n printRomanOn:stream].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3846
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3847
     ]
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3848
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3849
!
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3850
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3851
printRomanOn:aStream naive:naive
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3852
    "print the receiver as roman number to the receiver, aStream.
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3853
     The naive argument controls if the conversion is
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
  3854
     correct (i.e. subtracting prefix notation for 4,9,40,90, etc.),
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
  3855
     or naive (i.e. print 4 as IIII and 9 as VIIII); also called simple.
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3856
     The naive version is often used for page numbers in documents."
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3857
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3858
    |restValue spec|
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3859
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3860
    restValue := self.
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3861
    restValue > 0 ifFalse:[self error:'negative roman'].
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3862
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3863
    naive ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3864
        spec := #(
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3865
                " value string repeat "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3866
                   1000 'M'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3867
                    500 'D'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3868
                    100 'C'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3869
                     50 'L'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3870
                     10 'X'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3871
                      5 'V'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3872
                      1 'I'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3873
                 ).
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3874
    ] ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3875
        spec := #(
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3876
                " value string repeat "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3877
                   1000 'M'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3878
                    900 'CM'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3879
                    500 'D'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3880
                    400 'CD'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3881
                    100 'C'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3882
                     90 'XC'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3883
                     50 'L'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3884
                     40 'XL'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3885
                     10 'X'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3886
                      9 'IX'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3887
                      5 'V'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3888
                      4 'IV'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3889
                      1 'I'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3890
                 ).
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3891
    ].
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3892
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3893
    spec
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3894
        inGroupsOf:3
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3895
        do:[:rValue :rString :repeatFlag |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3896
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3897
            [
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3898
                (restValue >= rValue) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3899
                    aStream nextPutAll:rString.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3900
                    restValue := restValue - rValue.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3901
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3902
            ] doWhile:[ repeatFlag and:[ restValue >= rValue] ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3903
        ].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3904
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3905
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3906
     1 to:10 do:[:i | i printRomanOn:Transcript naive:false. Transcript cr.].
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3907
     1 to:10 do:[:i | i printRomanOn:Transcript naive:true. Transcript cr.].
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3908
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3909
     1999 printRomanOn:Transcript. Transcript cr.
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3910
     Date today year printRomanOn:Transcript. Transcript cr.
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3911
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3912
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3913
    "test all between 1 and 9999:
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3914
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3915
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3916
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3917
        romanString := String streamContents:[:stream | n printRomanOn:stream naive:false].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3918
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3919
     ]
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3920
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3921
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3922
    "test naive all between 1 and 9999:
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3923
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3924
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3925
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3926
        romanString := String streamContents:[:stream | n printRomanOn:stream naive:true].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3927
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3928
     ]
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3929
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3930
!
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3931
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3932
printStringRadix:base
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3933
    "return a string representation of the receiver in the specified
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3934
     base; does NOT prepend XXr to the string.
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3935
     See also: radixPrintStringRadix:
13718
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3936
               printOn:base:showRadix:"
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3937
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3938
    ^ self printStringRadix:base showRadix:false
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3939
15558
16088b17994a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15556
diff changeset
  3940
    "
16088b17994a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15556
diff changeset
  3941
     10 printStringRadix:16   
16088b17994a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15556
diff changeset
  3942
    "
16088b17994a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15556
diff changeset
  3943
13718
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3944
    "Created: / 19-01-1998 / 17:20:58 / stefan"
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3945
    "Modified: / 20-01-1998 / 14:10:54 / stefan"
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3946
    "Modified: / 23-09-2011 / 13:59:36 / cg"
15558
16088b17994a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15556
diff changeset
  3947
    "Modified (comment): / 26-07-2013 / 12:55:18 / cg"
13718
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3948
!
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3949
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3950
printStringRadix:aRadix size:sz fill:fillCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3951
    "return a string representation of the receiver in the specified
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3952
     radix. The string is padded on the left with fillCharacter to make
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3953
     its size as specified in sz."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3954
2951
256e90eee7f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2816
diff changeset
  3955
    |s actualSize|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3956
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3957
    s := self printStringRadix:aRadix.
2951
256e90eee7f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2816
diff changeset
  3958
    actualSize := s size.
256e90eee7f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2816
diff changeset
  3959
    actualSize < sz ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3960
        s := ((String new:(sz - actualSize)) atAllPut:fillCharacter) , s
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3961
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3962
    ^ s
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3963
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3964
    "
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3965
     1024 printStringRadix:16 size:4 fill:$0
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3966
     1024 printStringRadix:2 size:16 fill:$.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3967
     1024 printStringRadix:16 size:8 fill:(Character space)
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3968
    "
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  3969
!
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  3970
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3971
romanPrintString
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3972
    "return a roman number representation of the receiver as a string"
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3973
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3974
    ^ String streamContents:[:stream | self printRomanOn:stream].
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3975
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3976
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3977
     1999 romanPrintString.
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3978
     Date today year romanPrintString.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3979
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3980
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3981
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3982
!Integer methodsFor:'queries'!
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  3983
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3984
digitAt:n
6055
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3985
    "return the n-th byte of the binary representation."
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3986
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3987
    self subclassResponsibility
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3988
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3989
    "This is a very stupid implementation, and should be redefined in
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3990
     concrete subclasses."
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  3991
6055
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3992
"/    |num count|
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3993
"/
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3994
"/    num := self.
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3995
"/    count := n.
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3996
"/    [count > 1] whileTrue:[
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3997
"/        num := num // 256.
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3998
"/        count := count - 1
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  3999
"/    ].
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4000
"/    ^ num \\ 256
159
514c749165c3 *** empty log message ***
claus
parents: 132
diff changeset
  4001
514c749165c3 *** empty log message ***
claus
parents: 132
diff changeset
  4002
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4003
     16r44332211 digitAt:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4004
     16r44332211 digitAt:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4005
     16r44332211 digitAt:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4006
     16r44332211 digitAt:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4007
     16r44332211 digitAt:5
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4008
     16r00332211 digitAt:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4009
     16r00332211 digitAt:5
159
514c749165c3 *** empty log message ***
claus
parents: 132
diff changeset
  4010
    "
6055
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4011
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4012
    "Modified: / 26.9.2001 / 21:21:21 / cg"
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4013
!
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4014
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4015
digitByteAt:n
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4016
    "return 8 bits of my signed value, starting at byte index.
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4017
     For positive receivers, this is the same as #digitAt:;
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4018
     for negative ones, the actual bit representation is returned."
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4019
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4020
    self subclassResponsibility
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4021
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4022
    "Created: / 26.9.2001 / 21:18:43 / cg"
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4023
    "Modified: / 26.9.2001 / 21:20:19 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4024
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4025
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4026
digitLength
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4027
    "return the number of bytes needed for the binary representation
2816
62edd11b5e66 commentary
Claus Gittinger <cg@exept.de>
parents: 2794
diff changeset
  4028
     of the receiver.
62edd11b5e66 commentary
Claus Gittinger <cg@exept.de>
parents: 2794
diff changeset
  4029
     This method is redefined in concrete classes - the fallback here is
62edd11b5e66 commentary
Claus Gittinger <cg@exept.de>
parents: 2794
diff changeset
  4030
     never really used."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4031
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4032
    ^ (self log:256) ceiling asInteger
2816
62edd11b5e66 commentary
Claus Gittinger <cg@exept.de>
parents: 2794
diff changeset
  4033
62edd11b5e66 commentary
Claus Gittinger <cg@exept.de>
parents: 2794
diff changeset
  4034
    "Modified: 31.7.1997 / 13:19:06 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4035
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4036
13725
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4037
exponent
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4038
    "return what would be the normalized float's exponent if I were a float.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4039
     This is not for general use - it has been added for dolphin (soap) compatibility.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4040
     This assumes that the mantissa is normalized to
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4041
     0.5 .. 1.0 and the number's value is: mantissa * 2^exp"
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4042
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4043
    ^ self abs highBit
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4044
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4045
    "
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4046
     self assert:( 1.0 exponent = 1 exponent ).
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4047
     self assert:( 2.0 exponent = 2 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4048
     self assert:( 3.0 exponent = 3 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4049
     self assert:( 4.0 exponent = 4 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4050
     self assert:( 12345.0 exponent = 12345 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4051
     self assert:( 0.0 exponent = 0 exponent ).   
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4052
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4053
     self assert:( -1.0 exponent = -1 exponent ).
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4054
     self assert:( -2.0 exponent = -2 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4055
     self assert:( -3.0 exponent = -3 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4056
     self assert:( -4.0 exponent = -4 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4057
     self assert:( -12345.0 exponent = -12345 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4058
    "
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4059
!
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4060
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4061
isInteger
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4062
    "return true, if the receiver is some kind of integer number"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4063
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4064
    ^ true
3036
f2d332547db7 added #isPowerOf2
Claus Gittinger <cg@exept.de>
parents: 2951
diff changeset
  4065
!
f2d332547db7 added #isPowerOf2
Claus Gittinger <cg@exept.de>
parents: 2951
diff changeset
  4066
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4067
isLiteral
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4068
    "return true, if the receiver can be used as a literal constant in ST syntax
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4069
     (i.e. can be used in constant arrays)"
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4070
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4071
    ^ true
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4072
!
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4073
18865
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4074
isPerfectSquare
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4075
    "return true if I am a perfect square.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4076
     That is a number for which the square root is an integer."
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4077
     
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4078
    |intSqrt realSqrt|
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4079
    
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4080
    self strictlyPositive ifFalse:[
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4081
        "/ should we raise a domain error for negative receivers?
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4082
        ^ false
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4083
    ].
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4084
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4085
    "/ q&d check for common small squares
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4086
    self < 400 ifTrue:[    
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4087
        ^ #(1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 ) includes:self.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4088
    ].        
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4089
    self < 1024 ifTrue:[    
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4090
        ^ #(400 441 484 529 576 625 676 729 784 841 900 961) includes:self.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4091
    ].        
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4092
    "/ try powers of 2
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4093
    self isPowerOfTwo ifTrue:[
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4094
        ^ self lowBit odd
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4095
    ].
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4096
    
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4097
    "/ guess
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4098
    realSqrt := self sqrt.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4099
    realSqrt isFinite ifTrue:[
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4100
        realSqrt = realSqrt truncated ifTrue:[
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4101
            "/ still have to check due to rounding errors.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4102
            intSqrt := realSqrt truncated asInteger.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4103
            ^ intSqrt squared = self
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4104
        ].    
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4105
    ].
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4106
    
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4107
    "/ slow code
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4108
    intSqrt := self integerSqrt.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4109
    ^ intSqrt squared = self
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4110
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4111
    "
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4112
     (1 to:1000000) count:[:n | n isPerfectSquare] 1000
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4113
     12345678987654321234567 isPerfectSquare
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4114
     123123123432 squared isPerfectSquare
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4115
     (123123123432 raisedTo:7) isPerfectSquare
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4116
     ((123456789123456789 raisedTo:7)) isPerfectSquare
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4117
     ((123456789123456789 raisedTo:7)-1) isPerfectSquare
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4118
     Time microsecondsToRun:[12345678987654321234567 isPerfectSquare]
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4119
    "
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4120
!
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4121
9134
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4122
isPowerOf:p
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4123
    "return true, if the receiver is a power of p"
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4124
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4125
    p == 2 ifTrue:[ ^ self isPowerOfTwo].
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4126
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4127
    "/ the following is a q&d hack, using existing code.
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4128
    ^ (Integer
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4129
        readFromString:(self printStringRadix:p)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4130
        radix:2
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4131
        onError:-1) isPowerOfTwo
9134
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4132
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4133
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4134
     16r0000000000000000 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4135
     16r0000004000000000 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4136
     16r0000004000000001 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4137
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4138
     16r0000000000000001 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4139
     16r0000000000000002 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4140
     16r0000000000000004 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4141
     16r0000000000000008 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4142
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4143
     16r0000000000000001 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4144
     16r0000000000000002 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4145
     16r0000000000000004 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4146
     16r0000000000000008 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4147
     16r0000000000000010 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4148
     16r0000000000000020 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4149
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4150
     3r0000000000000001 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4151
     3r0000000000000010 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4152
     3r0000000000000100 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4153
     3r0000000000001000 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4154
     3r0000000000001001 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4155
     3r0000000000002000 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4156
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4157
     10 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4158
     20 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4159
     100 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4160
     110 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4161
     200 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4162
     1000 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4163
     10000 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4164
     100000 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4165
     100001 isPowerOf:10
9134
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4166
 "
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4167
!
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4168
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4169
isPowerOfTwo
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4170
    "return true, if the receiver is a power of 2"
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4171
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4172
    "redefined, because the hacker's algorithm in smallInt is much slower for large numbers"
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4173
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4174
    |maxBytes "{ Class: SmallInteger }"|
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4175
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4176
    maxBytes := self digitLength.
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4177
    (self digitAt:maxBytes) isPowerOfTwo ifFalse:[^ false].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4178
    1 to:maxBytes-1 do:[:byteIndex |
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4179
        (self digitAt:byteIndex) ~~ 0 ifTrue:[^ false].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4180
    ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4181
    ^ true
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4182
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4183
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4184
     10000 factorial isPowerOfTwo  
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4185
     |n| n := 10000 factorial. Time millisecondsToRun:[1000 timesRepeat:[ n isPowerOfTwo]] 
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4186
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4187
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4188
     (2 raisedTo:10000) isPowerOfTwo  
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4189
     |n| n := (2 raisedTo:10000). Time millisecondsToRun:[1000 timesRepeat:[ n isPowerOfTwo]] 
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4190
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4191
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4192
    "Modified: / 20-06-2011 / 12:43:05 / cg"
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4193
!
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4194
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4195
isPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4196
    "return true if I am a prime Number.
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4197
     This is a q&d hack, which may need optimization if heavily used."
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4198
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4199
    |limit firstFewPrimes|
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4200
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4201
    self even ifTrue:[^ self == 2 ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4202
    self == 1 ifTrue:[^ false ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4203
18865
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4204
    "/ See comment in initializePrimeCacheUpTo:limit
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4205
    "/      Integer initializePrimeCacheUpTo:(10 raisedTo:7)
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4206
    "/      Integer flushPrimeCache
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4207
    "/
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4208
    "/ by default, no primeCache is used.
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4209
    "/ if you do lots of number-stuff with primes, you may want to enable it with
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4210
    "/      Integer initializePrimeCacheUpTo:1000000
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4211
    "/ and when done, cleanup with flushPrimeCache
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4212
    self <= (PrimeCache size*2) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4213
        ^ PrimeCache at:self//2.
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4214
    ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4215
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4216
    limit := self sqrt.
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4217
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4218
    firstFewPrimes := self class primesUpTo2000.
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4219
    firstFewPrimes do:[:p |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4220
        p > limit ifTrue:[^ true].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4221
        (self \\ p) == 0 ifTrue:[ ^ false ].
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4222
    ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4223
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4224
    (firstFewPrimes last+2) to:limit by:2 do:[:i |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4225
        (self \\ i) == 0 ifTrue:[ ^ false ].
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4226
    ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4227
    ^ true
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4228
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4229
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4230
     Integer primesUpTo:1000
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4231
     (1 to:1000000) count:[:n | n isPrime] 78498
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4232
     Time millisecondsToRun:[ (1 to:1000000) count:[:n | n isPrime]] 1295   w.o firstFewPrimes
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4233
     Time millisecondsToRun:[ (1 to:1000000) count:[:n | n isPrime]] 936    with firstFewPrimes (less tests)
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4234
     Time millisecondsToRun:[ (1 to:1000000) count:[:n | n isPrime]] 343    with primeCache
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4235
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4236
!
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4237
14677
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4238
nextMultipleOf: n
14680
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4239
    "return the multiple of n at or above the receiver.
16800
45ef192ee95f class: Integer
Claus Gittinger <cg@exept.de>
parents: 16723
diff changeset
  4240
     Useful for padding, aligning or rounding,
45ef192ee95f class: Integer
Claus Gittinger <cg@exept.de>
parents: 16723
diff changeset
  4241
     expecially when reading aligned binary data."
14677
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4242
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4243
    |rest|
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4244
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4245
    rest := self \\ n.
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4246
    rest == 0 ifTrue:[ ^ self ].
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4247
    ^ self + (n - rest)
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4248
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4249
    "
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4250
     1 nextMultipleOf: 4  
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4251
     2 nextMultipleOf: 4  
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4252
     3 nextMultipleOf: 4  
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4253
     4 nextMultipleOf: 4  
16800
45ef192ee95f class: Integer
Claus Gittinger <cg@exept.de>
parents: 16723
diff changeset
  4254
     5 nextMultipleOf: 4  
14677
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4255
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4256
     22 nextMultipleOf: 4 
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4257
    "
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4258
!
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4259
14680
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4260
nextPowerOf2
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4261
    "return the power of 2 at or above the receiver.
18769
Claus Gittinger <cg@exept.de>
parents: 18380
diff changeset
  4262
     Useful for padding.
18905
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
  4263
     Notice, that for a powerOf2, the receiver is returned."
14680
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4264
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4265
    |x t sh|
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4266
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4267
    x := self - 1.
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4268
    x := x bitOr: (x bitShift: -1).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4269
    x := x bitOr: (x bitShift: -2).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4270
    x := x bitOr: (x bitShift: -4).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4271
    x := x bitOr: (x bitShift: -8).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4272
    x := x bitOr: (t := x bitShift: -16).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4273
    t == 0 ifFalse:[
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4274
        sh := -32.
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4275
        [
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4276
            x := x bitOr: (t := x bitShift: sh).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4277
            sh := sh + sh. 
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4278
        ] doWhile: [t ~~ 0]
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4279
    ].
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4280
    ^ x + 1 
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4281
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4282
    "
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4283
     1 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4284
     2 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4285
     3 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4286
     4 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4287
     5 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4288
     6 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4289
     7 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4290
     8 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4291
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4292
     22 nextPowerOf2
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4293
     12 factorial nextPowerOf2  isPowerOf:2  
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4294
     100 factorial nextPowerOf2  isPowerOf:2  
18905
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
  4295
     1000 factorial nextPowerOf2  isPowerOf:2
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
  4296
     Time millisecondsToRun:[
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
  4297
         |v|
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
  4298
         v := 1000 factorial.
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
  4299
         1000 timesRepeat:[
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
  4300
            v nextPowerOf2    
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
  4301
         ]    
256565ff9803 #BUGFIX
Claus Gittinger <cg@exept.de>
parents: 18865
diff changeset
  4302
     ]    
14680
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4303
    "
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4304
!
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4305
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4306
nextPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4307
    "return the next prime after the receiver"
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4308
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4309
    |num|
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4310
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4311
    num := self + 1.
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4312
    num even ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4313
        num == 2 ifTrue:[^ num].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4314
        num := num + 1
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4315
    ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4316
    [num isPrime] whileFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4317
        num := num + 2
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4318
    ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4319
    ^ num
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4320
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4321
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4322
     1 nextPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4323
     22 nextPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4324
     37 nextPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4325
     36 nextPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4326
     3456737 nextPrime
18865
1e6e937f7cf0 #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 18851
diff changeset
  4327
     1000 factorial nextPrime
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4328
    "
13905
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4329
!
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4330
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4331
parityOdd
13914
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  4332
    "return true, if an odd number of bits are set in the receiver, false otherwise.
13905
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4333
     (i.e. true for odd parity)
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4334
     Undefined for negative values (smalltalk does not require the machine to use 2's complement)"
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4335
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4336
    ^ self bitCount odd
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4337
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4338
    "
13907
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4339
     0 parityOdd    
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4340
     1 parityOdd    
13907
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4341
     2 parityOdd    
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4342
     4 parityOdd    
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4343
     5 parityOdd    
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4344
     7 parityOdd    
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4345
     33 parityOdd   
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4346
     6 parityOdd    
13905
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4347
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4348
     1 to:1000000 do:[:n |
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4349
        self assert:(n parityOdd = ((n printStringRadix:2) occurrencesOf:$1) odd).
13905
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4350
     ]
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4351
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4352
     0 to:255 do:[:n |
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4353
        |p|
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4354
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4355
        p := 
13907
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4356
            (((((((((n rightShift: 7) 
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4357
            bitXor: (n rightShift: 6)) 
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4358
                bitXor: (n rightShift: 5))
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4359
                    bitXor: (n rightShift: 4))
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4360
                        bitXor: (n rightShift: 3))
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4361
                            bitXor: (n rightShift: 2))
13907
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4362
                                bitXor: (n rightShift: 1))
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4363
                                    bitXor: n) bitAnd:1) == 1.
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4364
        self assert:(n parityOdd = p).
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4365
     ]
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4366
    "
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4367
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4368
    "Created: / 09-01-2012 / 17:18:06 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4369
! !
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  4370
16293
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4371
!Integer methodsFor:'special modulo arithmetic'!
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4372
12605
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4373
add_32:anInteger
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4374
    "return a C-semantic 32bit sum of the receiver and the argument. 
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4375
     Both must be either Small- or LargeIntegers.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4376
     Returns a signed 32bit number.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4377
     This (nonstandard) specialized method is provided to allow simulation of
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4378
     modulu operations with C semantics."
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4379
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4380
%{  /* NOCONTEXT */
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4381
    int val1, val2, rslt;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4382
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4383
    if (__isSmallInteger(self)) {
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4384
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4385
    } else {
12605
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4386
        val1 = __longIntVal(self);
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4387
        if (!val1) goto bad;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4388
    }
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4389
    if (__isSmallInteger(anInteger)) {
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4390
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4391
    } else {
12605
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4392
        val2 = __longIntVal(anInteger);
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4393
        if (!val2) goto bad;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4394
    }
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4395
    rslt = val1 + val2;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4396
    RETURN(__MKINT(rslt));
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4397
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4398
  bad: ;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4399
%}.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4400
    self primitiveFailed.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4401
!
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4402
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4403
add_32u:anInteger
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4404
    "return a C-semantic 32bit unsigned sum of the receiver and the argument. 
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4405
     Both must be either Small- or LargeIntegers.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4406
     Returns an unsigned 32bit number.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4407
     This (nonstandard) specialized method is provided to allow simulation of
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4408
     modulu operations with C semantics."
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4409
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4410
%{  /* NOCONTEXT */
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4411
    int val1, val2, rslt;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4412
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4413
    if (__isSmallInteger(self)) {
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4414
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4415
    } else {
12605
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4416
        val1 = __longIntVal(self);
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4417
        if (!val1) goto bad;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4418
    }
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4419
    if (__isSmallInteger(anInteger)) {
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4420
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4421
    } else {
12605
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4422
        val2 = __longIntVal(anInteger);
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4423
        if (!val2) goto bad;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4424
    }
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4425
    rslt = val1 + val2;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4426
    RETURN(__MKUINT((unsigned)rslt));
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4427
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4428
  bad: ;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4429
%}.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4430
    self primitiveFailed.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4431
!
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4432
13725
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4433
mul_32:anInteger
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4434
    "return a C-semantic 32bit product of the receiver and the argument. 
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4435
     Both must be either Small- or LargeIntegers.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4436
     Returns a signed 32bit number.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4437
     This (nonstandard) specialized method is provided to allow simulation of
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4438
     modulu operations with C semantics."
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4439
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4440
%{  /* NOCONTEXT */
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4441
    int val1, val2, rslt;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4442
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4443
    if (__isSmallInteger(self)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4444
        val1 = __intVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4445
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4446
        val1 = __longIntVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4447
        if (!val1) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4448
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4449
    if (__isSmallInteger(anInteger)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4450
        val2 = __intVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4451
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4452
        val2 = __longIntVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4453
        if (!val2) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4454
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4455
    rslt = val1 * val2;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4456
    RETURN(__MKINT(rslt));
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4457
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4458
  bad: ;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4459
%}.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4460
    self primitiveFailed.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4461
!
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4462
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4463
mul_32u:anInteger
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4464
    "return a C-semantic 32bit unsigned product of the receiver and the argument. 
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4465
     Both must be either Small- or LargeIntegers.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4466
     Returns an unsigned 32bit number.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4467
     This (nonstandard) specialized method is provided to allow simulation of
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4468
     modulu operations with C semantics."
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4469
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4470
%{  /* NOCONTEXT */
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4471
    int val1, val2, rslt;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4472
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4473
    if (__isSmallInteger(self)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4474
        val1 = __intVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4475
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4476
        val1 = __longIntVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4477
        if (!val1) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4478
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4479
    if (__isSmallInteger(anInteger)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4480
        val2 = __intVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4481
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4482
        val2 = __longIntVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4483
        if (!val2) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4484
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4485
    rslt = val1 * val2;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4486
    RETURN(__MKUINT((unsigned)rslt));
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4487
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4488
  bad: ;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4489
%}.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4490
    self primitiveFailed.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4491
!
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4492
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4493
sub_32:anInteger
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4494
    "return a C-semantic 32bit difference of the receiver and the argument. 
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4495
     Both must be either Small- or LargeIntegers.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4496
     Returns a signed 32bit number.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4497
     This (nonstandard) specialized method is provided to allow simulation of
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4498
     modulu operations with C semantics."
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4499
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4500
%{  /* NOCONTEXT */
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4501
    int val1, val2, rslt;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4502
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4503
    if (__isSmallInteger(self)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4504
        val1 = __intVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4505
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4506
        val1 = __longIntVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4507
        if (!val1) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4508
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4509
    if (__isSmallInteger(anInteger)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4510
        val2 = __intVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4511
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4512
        val2 = __longIntVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4513
        if (!val2) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4514
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4515
    rslt = val1 - val2;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4516
    RETURN(__MKINT(rslt));
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4517
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4518
  bad: ;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4519
%}.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4520
    self primitiveFailed.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4521
!
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4522
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4523
sub_32u:anInteger
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4524
    "return a C-semantic 32bit unsigned difference of the receiver and the argument. 
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4525
     Both must be either Small- or LargeIntegers.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4526
     Returns an unsigned 32bit number.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4527
     This (nonstandard) specialized method is provided to allow simulation of
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4528
     modulu operations with C semantics."
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4529
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4530
%{  /* NOCONTEXT */
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4531
    int val1, val2, rslt;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4532
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4533
    if (__isSmallInteger(self)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4534
        val1 = __intVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4535
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4536
        val1 = __longIntVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4537
        if (!val1) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4538
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4539
    if (__isSmallInteger(anInteger)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4540
        val2 = __intVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4541
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4542
        val2 = __longIntVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4543
        if (!val2) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4544
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4545
    rslt = val1 - val2;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4546
    RETURN(__MKUINT((unsigned)rslt));
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4547
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4548
  bad: ;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4549
%}.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4550
    self primitiveFailed.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4551
! !
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4552
16293
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4553
!Integer methodsFor:'special modulo bit operators'!
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4554
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4555
asSigned32
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4556
    "return a 32-bit integer with my bit-pattern. For protocol completeness."
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4557
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4558
    ^ self
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4559
!
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4560
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4561
asUnsigned32
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4562
    "return a 32-bit integer with my bit-pattern, but positive.
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4563
     May be required for bit operations on the sign-bit and/or to
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4564
     convert C/Java numbers."
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4565
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4566
    self < 0 ifTrue:[
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4567
        ^ 16r100000000 + self
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4568
    ].
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4569
    ^ self
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4570
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4571
    "
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4572
     (-1 asUnsigned32) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4573
     1 asUnsigned32
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4574
     (SmallInteger minVal asUnsigned32) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4575
     (SmallInteger maxVal asUnsigned32) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4576
    "
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4577
!
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4578
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4579
asUnsigned64
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4580
    "return a 64-bit integer with my bit-pattern, but positive.
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4581
     May be required for bit operations on the sign-bit and/or to
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4582
     convert C/Java numbers."
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4583
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4584
    self < 0 ifTrue:[
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4585
        ^ 16r10000000000000000 + self
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4586
    ].
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4587
    ^ self
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4588
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4589
    "
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4590
     (-1 asUnsigned64) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4591
     1 asUnsigned64
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4592
     (SmallInteger minVal asUnsigned64) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4593
     (SmallInteger maxVal asUnsigned64) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4594
    "
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4595
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4596
    "Created: / 26-07-2013 / 13:45:11 / cg"
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4597
!
13725
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4598
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4599
bitAnd_32:anInteger
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4600
    "return a C-semantic 32bit locical-and of the receiver and
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4601
     the argument. Both must be either Small- or LargeIntegers.
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4602
     Returns a signed 32bit number.
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4603
     This (nonstandard) specialized method is provided to allow simulation of
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4604
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4605
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4606
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4607
    int val1, val2, rslt;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4608
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4609
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4610
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4611
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4612
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4613
        if (!val1) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4614
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4615
    if (__isSmallInteger(anInteger)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4616
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4617
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4618
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4619
        if (!val2) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4620
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4621
    rslt = val1 & val2;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4622
    RETURN(__MKINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4623
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4624
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4625
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4626
    self primitiveFailed.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4627
!
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4628
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4629
bitAnd_32u:anInteger
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4630
    "return a C-semantic 32bit locical-and of the receiver and
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4631
     the argument. Both must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4632
     Returns an unsigned 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4633
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4634
     bit operations with C semantics."
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4635
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4636
%{  /* NOCONTEXT */
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4637
    int val1, val2, rslt;
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4638
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4639
    if (__isSmallInteger(self)) {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4640
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4641
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4642
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4643
        if (!val1) goto bad;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4644
    }
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4645
    if (__isSmallInteger(anInteger)) {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4646
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4647
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4648
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4649
        if (!val2) goto bad;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4650
    }
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4651
    rslt = val1 & val2;
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4652
    RETURN(__MKUINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4653
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4654
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4655
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4656
    self primitiveFailed.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4657
!
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4658
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4659
bitInvert_32
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4660
    "return a C-semantic 32bit complement of the receiver,
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4661
     which must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4662
     Returns a signed 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4663
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4664
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4665
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4666
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4667
    int val, rslt;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4668
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4669
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4670
        val = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4671
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4672
        val = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4673
        if (!val) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4674
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4675
    rslt = ~val;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4676
    RETURN(__MKINT(rslt));
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4677
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4678
  bad: ;
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4679
%}.
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4680
    self primitiveFailed.
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4681
!
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4682
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4683
bitInvert_32u
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4684
    "return a C-semantic 32bit complement of the receiver,
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4685
     which must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4686
     Returns an unsigned 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4687
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4688
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4689
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4690
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4691
    int val, rslt;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4692
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4693
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4694
        val = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4695
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4696
        val = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4697
        if (!val) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4698
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4699
    rslt = ~val;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4700
    RETURN(__MKUINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4701
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4702
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4703
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4704
    self primitiveFailed.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4705
!
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4706
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4707
bitOr_32:anInteger
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4708
    "return a C-semantic 32bit locical-or of the receiver and
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4709
     the argument. Both must be either Small- or LargeIntegers.
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4710
     Returns a signed 32bit number.
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4711
     This (nonstandard) specialized method is provided to allow simulation of
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4712
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4713
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4714
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4715
    int val1, val2, rslt;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4716
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4717
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4718
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4719
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4720
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4721
        if (!val1) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4722
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4723
    if (__isSmallInteger(anInteger)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4724
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4725
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4726
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4727
        if (!val2) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4728
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4729
    rslt = val1 | val2;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4730
    RETURN(__MKINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4731
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4732
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4733
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4734
    self primitiveFailed.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4735
!
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4736
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4737
bitOr_32u:anInteger
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4738
    "return a C-semantic 32bit locical-or of the receiver and
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4739
     the argument. Both must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4740
     Returns an unsigned 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4741
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4742
     bit operations with C semantics."
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4743
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4744
%{  /* NOCONTEXT */
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4745
    int val1, val2, rslt;
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4746
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4747
    if (__isSmallInteger(self)) {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4748
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4749
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4750
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4751
        if (!val1) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4752
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4753
    if (__isSmallInteger(anInteger)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4754
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4755
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4756
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4757
        if (!val2) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4758
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4759
    rslt = val1 | val2;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4760
    RETURN(__MKUINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4761
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4762
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4763
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4764
    self primitiveFailed.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4765
!
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4766
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4767
bitXor_32:anInteger
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4768
    "return a C-semantic 32bit locical-xor of the receiver and
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4769
     the argument. Both must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4770
     Returns a signed 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4771
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4772
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4773
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4774
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4775
    int val1, val2, rslt;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4776
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4777
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4778
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4779
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4780
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4781
        if (!val1) goto bad;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4782
    }
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4783
    if (__isSmallInteger(anInteger)) {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4784
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4785
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4786
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4787
        if (!val2) goto bad;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4788
    }
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4789
    rslt = val1 ^ val2;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4790
    RETURN(__MKINT(rslt));
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4791
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4792
  bad: ;
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4793
%}.
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4794
    self primitiveFailed.
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4795
!
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4796
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4797
bitXor_32u:anInteger
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4798
    "return a C-semantic 32bit locical-xor of the receiver and
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4799
     the argument. Both must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4800
     Returns an unsigned 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4801
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4802
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4803
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4804
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4805
    int val1, val2, rslt;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4806
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4807
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4808
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4809
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4810
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4811
        if (!val1) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4812
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4813
    if (__isSmallInteger(anInteger)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4814
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4815
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4816
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4817
        if (!val2) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4818
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4819
    rslt = val1 ^ val2;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4820
    RETURN(__MKUINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4821
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4822
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4823
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4824
    self primitiveFailed.
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4825
! !
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4826
4653
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4827
!Integer methodsFor:'tracing'!
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4828
4682
4158042a9c8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4653
diff changeset
  4829
traceInto:aRequestor level:level from:referrer
4653
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4830
    "double dispatch into tracer, passing my type implicitely in the selector"
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4831
4682
4158042a9c8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4653
diff changeset
  4832
    ^ aRequestor traceInteger:self level:level from:referrer
4653
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4833
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4834
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4835
! !
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4836
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4837
!Integer methodsFor:'truncation & rounding'!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4838
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4839
ceiling
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4840
    "return the smallest integer which is larger or equal to the receiver.
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4841
     For integers, this is the receiver itself."
345
claus
parents: 328
diff changeset
  4842
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4843
    ^ self
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4844
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4845
    "Modified: 18.7.1996 / 12:44:06 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4846
!
345
claus
parents: 328
diff changeset
  4847
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4848
compressed
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4849
    "if the receiver can be represented as a SmallInteger, return
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4850
     a SmallInteger with my value; otherwise return self with leading
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4851
     zeros removed. This method is redefined in LargeInteger."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4852
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4853
    ^ self
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4854
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4855
    "Modified: 5.11.1996 / 14:07:41 / cg"
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  4856
!
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  4857
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4858
floor
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4859
    "return the largest integer which is smaller or equal to the receiver.
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4860
     For integers, this is the receiver itself."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4861
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4862
    ^ self
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4863
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4864
    "Modified: 18.7.1996 / 12:44:00 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4865
!
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  4866
1866
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4867
fractionPart
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4868
    "return a number with value from digits after the decimal point.
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4869
     (i.e. the receiver minus its truncated value)
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4870
     Since integers have no fraction, return 0 here."
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4871
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4872
    ^ 0
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4873
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4874
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4875
     1234.56789 fractionPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4876
     1.2345e6 fractionPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4877
     1000 fractionPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4878
     10000000000000000 fractionPart
1866
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4879
    "
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4880
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4881
    "Modified: 4.11.1996 / 20:27:44 / cg"
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4882
!
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4883
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4884
integerPart
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4885
    "return a number with value from digits before the decimal point.
18851
11fd28f8c61e #FEATURE
Claus Gittinger <cg@exept.de>
parents: 18769
diff changeset
  4886
     (i.e. the receiver's truncated value)
1866
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4887
     Since integers have no fraction, return the receiver here."
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4888
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4889
    ^ self
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4890
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4891
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4892
     1234.56789 integerPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4893
     1.2345e6 integerPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4894
     1000 integerPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4895
     10000000000000000 integerPart
1866
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4896
    "
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4897
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4898
    "Modified: 4.11.1996 / 20:28:22 / cg"
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4899
!
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4900
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4901
normalize
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4902
    "if the receiver can be represented as a SmallInteger, return
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4903
     a SmallInteger with my value; otherwise return self with leading
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4904
     zeros removed.
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4905
     This method is left for backward compatibility - it has been
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4906
     renamed to #compressed for ST-80 compatibility."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4907
9261
275c3c6392ed mark obsolete method
Stefan Vogel <sv@exept.de>
parents: 9141
diff changeset
  4908
    <resource: #obsolete>
275c3c6392ed mark obsolete method
Stefan Vogel <sv@exept.de>
parents: 9141
diff changeset
  4909
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4910
    ^ self compressed
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4911
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4912
    "Modified: 5.11.1996 / 14:08:24 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4913
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4914
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4915
rounded
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4916
    "return the receiver rounded toward the next Integer -
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4917
     for integers this is the receiver itself."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4918
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4919
    ^ self
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4920
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4921
    "Modified: 18.7.1996 / 12:44:24 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4922
!
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  4923
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4924
truncated
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4925
    "return the receiver truncated towards zero as Integer
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4926
     for integers this is the receiver itself."
159
514c749165c3 *** empty log message ***
claus
parents: 132
diff changeset
  4927
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4928
    ^ self
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4929
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4930
    "Modified: 18.7.1996 / 12:44:33 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4931
! !
569
7134eb78cf48 readFrom:onError: can now also read from a string
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  4932
8394
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4933
!Integer methodsFor:'visiting'!
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4934
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4935
acceptVisitor:aVisitor with:aParameter
16723
12737e7310ae comment/format only
Claus Gittinger <cg@exept.de>
parents: 16379
diff changeset
  4936
    "dispatch for visitor pattern; send #visitInteger:with: to aVisitor"
8394
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4937
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4938
    ^ aVisitor visitInteger:self with:aParameter
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4939
! !
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4940
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4941
!Integer::ModuloNumber class methodsFor:'documentation'!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4942
4803
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4943
copyright
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4944
"
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4945
 COPYRIGHT (c) 1999 by eXept Software AG
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4946
              All Rights Reserved
4803
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4947
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4948
 This software is furnished under a license and may be used
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4949
 only in accordance with the terms of that license and with the
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4950
 inclusion of the above copyright notice.   This software may not
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4951
 be provided or otherwise made available to, or used by, any
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4952
 other person.  No title to or ownership of the software is
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4953
 hereby transferred.
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4954
"
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4955
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4956
!
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4957
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4958
documentation
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4959
"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4960
    This is a helper class to perform fast computation of the modulus.
4609
6a1819c7a743 comment
Claus Gittinger <cg@exept.de>
parents: 4522
diff changeset
  4961
    (with big numbers, this does make a difference)
4803
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4962
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4963
    WARNING: this does only work with numbers which have no common
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4964
             divisor (which is true for cryptographic applications).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4965
             So, use this only if you know what you are doing ...
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4966
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4967
    [author:]
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4968
        Stefan Vogel
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4969
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4970
    [see also:]
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4971
        Integer SmallInteger LargeInsteger
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4972
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4973
    [instance variables:]
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4974
        modulus       the modulus
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4975
        reciprocal    reciprocal of the modulus
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4976
        shift         shift count to cut off some bits
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4977
"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4978
!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4979
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4980
examples
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4981
"
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4982
                                                                [exBegin]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4983
        17 asModuloNumber modulusOf:38
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4984
                                                                [exEnd]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4985
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4986
                                                                [exBegin]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4987
        38 \\ 17
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4988
                                                                [exEnd]
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4989
"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4990
! !
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4991
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4992
!Integer::ModuloNumber class methodsFor:'instance creation'!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4993
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  4994
modulus:anInteger
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  4995
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  4996
    ^ self new modulus:anInteger
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4997
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4998
    "Created: / 3.5.1999 / 11:13:15 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4999
    "Modified: / 3.5.1999 / 11:18:37 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5000
! !
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5001
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5002
!Integer::ModuloNumber methodsFor:'accessing'!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5003
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5004
modulus
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5005
    "return the modulus"
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5006
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5007
    ^ modulus
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5008
!
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5009
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5010
modulus:n
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5011
    "set the modulus"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5012
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5013
    modulus := n.
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5014
    reciprocal := n integerReciprocal.
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5015
    shift := n highBit negated.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5016
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5017
    "Created: / 3.5.1999 / 10:02:39 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5018
    "Modified: / 3.5.1999 / 14:30:49 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5019
! !
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5020
5238
f7a816a660a3 categories
Claus Gittinger <cg@exept.de>
parents: 5210
diff changeset
  5021
!Integer::ModuloNumber methodsFor:'arithmetic'!
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5022
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5023
modulusOf:aNumber
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5024
    "compute the aNumber modulo myself.
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5025
     The shortcut works only, if aNumber is < modulo * modulo
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5026
     (When doing arithmethic modulo something).
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5027
     Otherwise do it the long way"
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5028
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5029
    |e t cnt|
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5030
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5031
    "throw off low nbits(modulus)"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5032
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  5033
    e := aNumber bitShift:shift.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5034
    e := e * reciprocal.
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  5035
    e := e bitShift:shift.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5036
    e := e * modulus.
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5037
    e := aNumber - e.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5038
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5039
    "this subtract is done max 2 times"
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5040
    cnt := 2.
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5041
    [(t := e - modulus) >= 0] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5042
        e := t.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5043
        cnt == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5044
            "shortcut didn't work, do it the long way"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5045
            ^ e \\ modulus.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5046
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5047
        cnt := cnt - 1.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5048
    ].
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5049
    ^ e.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5050
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5051
    "
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5052
     |m|
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5053
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5054
     m := self new modulus:7.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5055
     m modulusOf:55.
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5056
    "
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5057
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5058
    "Shortcut does not work: (size of divisor vs. dividend):
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5059
     |m|
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5060
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5061
     m := self new modulus:7.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5062
     m modulusOf:123456789901398721398721931729371293712943794254034548369328469438562948623498659238469234659823469823658423659823658.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5063
    "
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5064
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5065
    "SLOW (using standard \\ operation):
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5066
     |m|
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5067
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5068
     m := 123456789901398721398721931729371293712943794254034548369328469438562948623498659238469234659823469823658423659823658.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5069
     Time millisecondsToRun:[
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  5070
        100000 timesRepeat:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5071
            874928459437598375937451931729371293712943794254034548369328469438562948623498659238469234659823469823658423659823658 \\ m
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5072
        ]
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5073
     ]
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  5074
    "
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5075
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5076
    "fast (using moduloNumber with almost same-sized dividend and divisor):
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5077
     |m|
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5078
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5079
     m := self new modulus:123456789901398721398721931729371293712943794254034548369328469438562948623498659238469234659823469823658423659823658.
15902
873997dcf4cf AbortSignal -> AbortOperationRequest
Stefan Vogel <sv@exept.de>
parents: 15841
diff changeset
  5080
    m modulusOf:874928459437598375937451931729371293712943794254034548369328469438562948623498659238469234659823469823658423659823658.
873997dcf4cf AbortSignal -> AbortOperationRequest
Stefan Vogel <sv@exept.de>
parents: 15841
diff changeset
  5081
10730930127807326146398409623772237722337234475792709784029183368622308259008044569184592041059181058049458041058052     ]
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  5082
    "
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5083
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5084
    "Modified: / 3.5.1999 / 14:30:32 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5085
! !
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5086
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5087
!Integer::ModuloNumber methodsFor:'converting'!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5088
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5089
asModuloNumber
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5090
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5091
    ^ self
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5092
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5093
    "Created: / 3.5.1999 / 14:48:27 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5094
! !
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5095
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  5096
!Integer class methodsFor:'documentation'!
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  5097
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  5098
version
18769
Claus Gittinger <cg@exept.de>
parents: 18380
diff changeset
  5099
    ^ '$Header$'
12122
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  5100
!
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  5101
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  5102
version_CVS
18769
Claus Gittinger <cg@exept.de>
parents: 18380
diff changeset
  5103
    ^ '$Header$'
19002
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  5104
!
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  5105
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  5106
version_HG
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  5107
465130ccbe52 Fixed LargeInteger printing on 64bit builds.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 18983
diff changeset
  5108
    ^ '$Changeset: <not expanded> $'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  5109
! !
6858
13919a7544b6 raisedToInteger pushed up
Claus Gittinger <cg@exept.de>
parents: 6682
diff changeset
  5110
14677
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  5111
4996
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
  5112
Integer initialize!