Integer.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 22 Sep 2015 16:28:42 +0100
branchjv
changeset 18759 c1217211909c
parent 18383 3a40da3624b7
child 18773 4f6a5cbce3a9
permissions -rw-r--r--
Changed identification strings to contain jv-branch ...to make explicit that this distribution is not the official one used by eXept and therefore that eXept is not to be blamed in case of any problem.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18230
55511104414b class: Integer
Claus Gittinger <cg@exept.de>
parents: 17488
diff changeset
     1
"{ Encoding: utf8 }"
55511104414b class: Integer
Claus Gittinger <cg@exept.de>
parents: 17488
diff changeset
     2
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     4
 COPYRIGHT (c) 1988 by Claus Gittinger
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
     5
              All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
"
5435
ad6612cc6848 oops odd/even fallback was wrong
Claus Gittinger <cg@exept.de>
parents: 5238
diff changeset
    14
"{ Package: 'stx:libbasic' }"
ad6612cc6848 oops odd/even fallback was wrong
Claus Gittinger <cg@exept.de>
parents: 5238
diff changeset
    15
17488
9da696f7560f class: Integer
Claus Gittinger <cg@exept.de>
parents: 17248
diff changeset
    16
"{ NameSpace: Smalltalk }"
9da696f7560f class: Integer
Claus Gittinger <cg@exept.de>
parents: 17248
diff changeset
    17
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
Number subclass:#Integer
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    19
	instanceVariableNames:''
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    20
	classVariableNames:'DefaultDisplayRadix BCDConversionErrorSignal PrimeCache'
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    21
	poolDictionaries:''
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    22
	category:'Magnitude-Numbers'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
    25
Object subclass:#ModuloNumber
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    26
	instanceVariableNames:'modulus reciprocal shift'
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    27
	classVariableNames:''
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    28
	poolDictionaries:''
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
    29
	privateIn:Integer
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
    30
!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
    31
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
    32
!Integer class methodsFor:'documentation'!
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    33
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    34
copyright
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    35
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    36
 COPYRIGHT (c) 1988 by Claus Gittinger
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    37
              All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    39
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    40
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    41
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    42
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    43
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    44
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    45
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    46
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    47
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    48
documentation
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    49
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    50
    abstract superclass for all integer numbers.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    51
    See details in concrete subclasses LargeInteger and SmallInteger.
212
3edd10edefaf *** empty log message ***
claus
parents: 202
diff changeset
    52
1892
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1888
diff changeset
    53
    Mixed mode arithmetic:
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    54
        int op int         -> int
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    55
        int op fix         -> fix; scale is fix's scale
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    56
        int op fraction    -> fraction
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    57
        int op float       -> float
1892
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1888
diff changeset
    58
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1210
diff changeset
    59
    [Class variables:]
212
3edd10edefaf *** empty log message ***
claus
parents: 202
diff changeset
    60
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    61
        DefaultDisplayRadix     the radix in which integers present their
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    62
                                displayString (which is used in inspectors)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    63
                                If you are to look at many hex numbers, bitmasks
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    64
                                etc. you may set this to 2 or 16.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    65
                                (avoids typing printStringRadix:.. all the time
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    66
                                 - I know - I am lazy ;-). Default is 10.
212
3edd10edefaf *** empty log message ***
claus
parents: 202
diff changeset
    67
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1210
diff changeset
    68
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1210
diff changeset
    69
    [author:]
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    70
        Claus Gittinger
1556
134d96466f5a commentary
Claus Gittinger <cg@exept.de>
parents: 1555
diff changeset
    71
134d96466f5a commentary
Claus Gittinger <cg@exept.de>
parents: 1555
diff changeset
    72
    [see also:]
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    73
        Number
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    74
        LargeInteger SmallInteger
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
    75
        Float ShortFloat Fraction FixedPoint
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    76
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    77
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
    79
!Integer class methodsFor:'instance creation'!
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
    80
3044
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    81
byte1:b1 byte2:b2 byte3:b3 byte4:b4
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    82
    "Squeak compatibility:
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    83
     Return an Integer given four value bytes.
15241
735c63d4e41f class: Integer
Claus Gittinger <cg@exept.de>
parents: 15084
diff changeset
    84
     The returned integer is either a Small- or a LargeInteger 
735c63d4e41f class: Integer
Claus Gittinger <cg@exept.de>
parents: 15084
diff changeset
    85
     (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
    86
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    87
    |t|
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    88
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    89
    t := b4.
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    90
    t := (t bitShift:8) + b3.
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    91
    t := (t bitShift:8) + b2.
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    92
    ^ (t bitShift:8) + b1.
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    93
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    94
    "
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    95
     (Integer byte1:16r10 byte2:16r32 byte3:16r54 byte4:16r76) hexPrintString
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    96
     (Integer byte1:16r00 byte2:16r11 byte3:16r22 byte4:16r33) hexPrintString
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    97
    "
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    98
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
    99
    "Created: 19.10.1997 / 18:08:52 / cg"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
   100
    "Modified: 19.10.1997 / 18:09:04 / cg"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
   101
!
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
   102
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   103
fastFromString:aString at:startIndex
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   104
    "return the next unsigned Integer from the string
4610
742650733761 comment
Claus Gittinger <cg@exept.de>
parents: 4609
diff changeset
   105
     as a decimal number, starting at startIndex.
742650733761 comment
Claus Gittinger <cg@exept.de>
parents: 4609
diff changeset
   106
     The number must be in the native machines int range
742650733761 comment
Claus Gittinger <cg@exept.de>
parents: 4609
diff changeset
   107
     (i.e. 63bit on alpha / 31 on all others);
742650733761 comment
Claus Gittinger <cg@exept.de>
parents: 4609
diff changeset
   108
     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
   109
     No spaces are skipped.
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   110
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   111
     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
   112
     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
   113
     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
   114
     especially for mass-data."
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   115
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   116
%{   /* NOCONTEXT */
12480
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   117
    if (__isStringLike(aString) && __isSmallInteger(startIndex)) {
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   118
        char *cp = (char *)(__stringVal(aString));
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   119
        int idx = __intVal(startIndex) - 1;
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   120
        unsigned INT val;
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   121
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   122
        if ((unsigned)idx < __stringSize(aString)) {
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   123
            val = atoi(cp + idx);
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   124
            if (val <= _MAX_INT) {
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   125
                RETURN(__mkSmallInteger(val));
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   126
            }
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   127
            RETURN (__MKUINT(val));
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   128
        }
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   129
    }
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   130
%}.
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   131
    self primitiveFailed.
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   132
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   133
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   134
     Integer fastFromString:'12345' at:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   135
     Integer fastFromString:'12345' at:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   136
     Integer fastFromString:'12345' at:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   137
     Integer fastFromString:'12345' at:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   138
     Integer fastFromString:'12345' at:5
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   139
     Integer fastFromString:'1234512345' at:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   140
     Integer fastFromString:'2147483647' at:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   141
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   142
     Integer fastFromString:'4294967295' at:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   143
     Integer fastFromString:'12345' at:6
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   144
     Integer fastFromString:'12345' at:0
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   145
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   146
     Time millisecondsToRun:[
12480
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   147
        100000 timesRepeat:[
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   148
            Integer readFrom:'12345'
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   149
        ]
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   150
     ]
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   151
    "
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   152
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   153
    "
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   154
     Time millisecondsToRun:[
12480
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   155
        100000 timesRepeat:[
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   156
            Integer fastFromString:'12345' at:1
01a98f46e297 change __isString() to __isStringLike() in primitive code
Stefan Vogel <sv@exept.de>
parents: 12422
diff changeset
   157
        ]
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   158
     ]
3639
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   159
    "
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   160
!
c4fbb700a569 added #fastFromString: (for Andis IEC-SocketInterface)
Claus Gittinger <cg@exept.de>
parents: 3638
diff changeset
   161
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   162
fromBCDBytes:aByteArray
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   163
    "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
   164
     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
   165
     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
   166
     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
   167
     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
   168
    "
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
    |val|
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   171
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   172
    val := 0.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   173
    aByteArray do:[:twoDigits |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   174
        |hi lo|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   175
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   176
        hi := (twoDigits bitShift:-4) bitAnd:16r0F.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   177
        lo := twoDigits bitAnd:16r0F.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   178
        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
   179
    ].
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   180
    ^ val
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   181
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   182
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   183
     Integer fromBCDBytes:#[16r12 16r34 16r56]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   184
     Integer fromBCDBytes:#[16r12 16r34 16r56 16r78]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   185
     Integer fromBCDBytes:#[16r12 16r34 16r56 16r78 16r90]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   186
     Integer fromBCDBytes:#[16r98 16r76 16r54]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   187
     Integer fromBCDBytes:#[16r98 16r76 16r54 16r32]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   188
     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
   189
     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
   190
    "
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   191
!
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
   192
5171
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   193
fromSwappedBCDBytes:aByteArray
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   194
    "given a byteArray in BCD format, return an appropriate integer.
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   195
     The byteArray must contain the BCD encoded decimal string,
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   196
     starting with the LEAST significant digits.
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   197
     This conversion is useful for some communication protocols,
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   198
     or control systems (e.g. SMC), which represent big numbers this way...
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   199
    "
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   200
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   201
    |val|
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   202
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   203
    val := 0.
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   204
    aByteArray do:[:twoDigits |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   205
        |hi lo|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   206
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   207
        lo := (twoDigits bitShift:-4) bitAnd:16r0F.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   208
        hi := twoDigits bitAnd:16r0F.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   209
        lo <= 9 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   210
            val := (val * 100) + (hi * 10) + lo
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   211
        ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   212
            "16rF is used to encode an odd number of digits"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   213
            val := (val * 10) + hi.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   214
        ].
5171
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
    ^ val
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   217
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   218
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   219
     Integer fromSwappedBCDBytes:#[16r12 16r34 16r56]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   220
     Integer fromSwappedBCDBytes:#[16r12 16r34 16rF6]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   221
     Integer fromSwappedBCDBytes:#[16r12 16r34 16r56 16r78]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   222
     Integer fromSwappedBCDBytes:#[16r12 16r34 16r56 16r78 16r90]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   223
     Integer fromSwappedBCDBytes:#[16r98 16r76 16r54]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   224
     Integer fromSwappedBCDBytes:#[16r98 16r76 16r54 16r32]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   225
     Integer fromSwappedBCDBytes:#[16r98 16r76 16r54 16r32 16r10]
5171
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   226
     Integer fromSwappedBCDBytes:#[16r12 16r34 16r56 16r78 16r90 16r12 16r34 16r56 16r78 16r90]
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   227
    "
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   228
!
6dc2f5a18953 Add #fromSwappedBCDBytes
Stefan Vogel <sv@exept.de>
parents: 5017
diff changeset
   229
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   230
new:numberOfBytes neg:negative
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   231
    "for ST-80 compatibility:
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   232
     Return an empty Integer (uninitialized value) with space for
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   233
     numberOfBytes bytes (= digitLength). The additional argument
132
ab2cfccd218c *** empty log message ***
claus
parents: 92
diff changeset
   234
     negative specifies if the result should be a negative number.
ab2cfccd218c *** empty log message ***
claus
parents: 92
diff changeset
   235
     The digits can be stored byte-wise into the result, using digitAt:put:"
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   236
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
   237
    ^ LargeInteger basicNew 
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
   238
            numberOfDigits:numberOfBytes
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
   239
            sign:(negative ifTrue:[-1] ifFalse:[1])
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   240
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   241
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   242
readFrom:aStringOrStream
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   243
    "return the next unsigned Integer from the (character-)stream aStream
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   244
     as decimal number.
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   245
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   246
     NOTICE:
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   247
       This behaves different from the default readFrom:, in returning
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   248
       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
   249
       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
   250
       - depending on the upcoming ANSI standard, this may change."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   251
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   252
    ^ self readFrom:aStringOrStream onError:0
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   253
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   254
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   255
     Integer readFrom:(ReadStream on:'foobar')
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   256
     Integer readFrom:(ReadStream on:'foobar') onError:nil
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   257
    "
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   258
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   259
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   260
readFrom:aStringOrStream onError:exceptionBlock
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   261
    "return the next Integer from the (character-)stream aStream,
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   262
     handling initial XXr for arbitrary radix numbers and initial sign.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   263
     Also, all initial whitespace is skipped.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   264
     If the string does not represent a valid integer number,
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   265
     return the value of exceptionBlock."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   266
3995
777470826394 no need for another error-handler blcok in #readFrom:onError:
Claus Gittinger <cg@exept.de>
parents: 3993
diff changeset
   267
    |value|
777470826394 no need for another error-handler blcok in #readFrom:onError:
Claus Gittinger <cg@exept.de>
parents: 3993
diff changeset
   268
7093
60bad14d38fc Convert Object>>errorSignal -> Error
Stefan Vogel <sv@exept.de>
parents: 6907
diff changeset
   269
    Error handle:[:ex |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   270
        ^ exceptionBlock value
1700
25223802076c checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1560
diff changeset
   271
    ] do:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   272
        |str nextChar negative|
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
        str := aStringOrStream readStream.
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
        nextChar := str skipSeparators.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   277
        (nextChar == $-) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   278
            negative := true.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   279
            str next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   280
            nextChar := str peekOrNil
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   281
        ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   282
            negative := false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   283
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   284
        (nextChar isNil or:[nextChar isDigit not]) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   285
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   286
             the string does not represent an integer
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   287
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   288
            ^ exceptionBlock 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
        value := self readFrom:str radix:10.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   291
        nextChar := str peekOrNil.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   292
        ((nextChar == $r) or:[ nextChar == $R]) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   293
            "-xxr<number> is invalid; should be xxr-<val>"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   294
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   295
            negative ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   296
                'Integer [warning]: invalid (negative) radix ignored' errorPrintCR.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   297
                negative := false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   298
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   299
            str next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   300
            value := self readFrom:str radix:value
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   301
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   302
        negative ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   303
            value := value negated
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   304
        ].
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   305
    ].
3995
777470826394 no need for another error-handler blcok in #readFrom:onError:
Claus Gittinger <cg@exept.de>
parents: 3993
diff changeset
   306
    ^ value
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   307
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   308
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   309
     Integer readFrom:'12345'      onError:['wrong']
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   310
     Integer readFrom:'-12345'     onError:['wrong']
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   311
     Integer readFrom:'+12345'     onError:['wrong']
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   312
     Integer readFrom:'16rFFFF'    onError:['wrong']
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   313
     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
   314
     Integer readFrom:'foo'        onError:['wrong']
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   315
     Integer readFrom:'foo'
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   316
    "
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   317
3374
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   318
    "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
   319
    "Modified: / 14.4.1998 / 19:17:28 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   320
!
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
readFrom:aStringOrStream radix:radix
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   323
    "return the next unsigned Integer from the (character-)stream aStream
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   324
     in radix; (assumes that the initial XXr has already been read).
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   325
     No whitespace-skipping is done.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   326
     Returns 0 if no number available.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   327
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   328
     NOTICE:
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   329
       This behaves different from the default readFrom:, in returning
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   330
       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
   331
       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
   332
       - depending on the upcoming ANSI standard, this may change."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   333
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   334
    ^ self readFrom:aStringOrStream radix:radix onError:0
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   335
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   336
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   337
readFrom:aStringOrStream radix:radix onError:exceptionBlock
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   338
    "return the next unsigned Integer from the (character-)stream aStream
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   339
     in radix; (assumes that the initial XXr has already been read).
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   340
     No whitespace-skipping is done.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   341
     Returns the value of exceptionBlock, if no number is available."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   342
11654
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   343
    |str nextChar nextChar2 nextChar3 nextChar4 value
4169
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   344
     r     "{ Class: SmallInteger }"
11654
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   345
     r2    "{ Class: SmallInteger }"
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   346
     r3    "{ Class: SmallInteger }"
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   347
     r4    "{ Class: SmallInteger }"
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   348
     digit1 digit2 digit3 digit4 |
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   349
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   350
    str := aStringOrStream readStream.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   351
3374
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   352
    nextChar := str peekOrNil.
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   353
    (nextChar notNil and:[nextChar isDigitRadix:radix]) ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   354
        ^ exceptionBlock value
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   355
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   356
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   357
    value := nextChar digitValue.
3374
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   358
    str next.
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   359
    nextChar := str peekOrNil.
4169
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   360
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   361
"/ OLD code
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   362
"/    [nextChar notNil and:[nextChar isDigitRadix:radix]] whileTrue:[
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   363
"/        str next.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   364
"/        value := value * radix + nextChar digitValue.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   365
"/        nextChar := str peekOrNil.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   366
"/    ].
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   367
"/    ^ value.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   368
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   369
    "/ 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
   370
    "/ converted number is large
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   371
    "/ (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
   372
    "/ It should not be slower for smallIntegers.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   373
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   374
    r := radix.
7079cb06963b tuned string -> integer conversion for Large numbers.
Claus Gittinger <cg@exept.de>
parents: 4158
diff changeset
   375
    r2 := r * r.
11654
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   376
    r3 := r2 * r.
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   377
    r4 := r2 * r2.
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   378
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   379
    [nextChar notNil and:[ (digit1 := nextChar digitValueRadix:r) notNil]] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   380
        "/ read 4 chars and pre-compute their value to avoid largeInt operations.
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
        nextChar2 := str peekOrNil.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   384
        (nextChar2 isNil or:[ (digit2 := nextChar2 digitValueRadix:r) isNil]) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   385
            ^ (value * r) + digit1.
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
        str next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   389
        nextChar3 := str peekOrNil.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   390
        (nextChar3 isNil or:[ (digit3 := nextChar3 digitValueRadix:r) isNil]) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   391
            ^ (value * r2) + ((digit1*r) + digit2).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   392
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   393
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   394
        str next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   395
        nextChar4 := str peekOrNil.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   396
        (nextChar4 isNil or:[ (digit4 := nextChar4 digitValueRadix:r) isNil]) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   397
            ^ (value * r3) + ((((digit1*r) + digit2)*r) + digit3).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   398
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   399
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   400
        value := (value * r4) + ((((((digit1*r) + digit2)*r) + digit3)*r) + digit4).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   401
        str next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   402
        nextChar := str peekOrNil.
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   403
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   404
    ^ value
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   405
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   406
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   407
     Integer readFrom:(ReadStream on:'12345') radix:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   408
     Integer readFrom:(ReadStream on:'FFFF') radix:16
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   409
     Integer readFrom:(ReadStream on:'1010') radix:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   410
     Integer readFrom:(ReadStream on:'foobar') radix:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   411
     Integer readFrom:(ReadStream on:'foobar') radix:10 onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   412
     Integer readFrom:'gg' radix:10 onError:0
11654
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   413
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   414
     Time millisecondsToRun:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   415
        1000 timesRepeat:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   416
            (String new:1000 withAll:$1) asInteger
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   417
        ]
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
   418
     ]
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   419
    "
3374
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   420
6897f584accb faster conversion from string (due to slow #pastEnd)
Claus Gittinger <cg@exept.de>
parents: 3298
diff changeset
   421
    "Modified: / 14.4.1998 / 19:16:46 / cg"
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   422
!
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   423
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   424
readFromRomanString:aStringOrStream
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   425
    "convert a string or stream containing a roman representation into an integer.
11125
89eb8912ef38 comment
Claus Gittinger <cg@exept.de>
parents: 11095
diff changeset
   426
     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
   427
     Raises BadRomanNumberFormatError if its wrong, but could be parsed.
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   428
     Notifies via NaiveRomanNumberFormatNotification, if its a bit wrong (naive format).
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   429
     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
   430
     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
   431
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   432
    |romanValues s c val digitVal prevDigitVal countSame delta
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   433
     stopOnSeparator finish|
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   434
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   435
    romanValues := Dictionary
18230
55511104414b class: Integer
Claus Gittinger <cg@exept.de>
parents: 17488
diff changeset
   436
                    withKeys:'MDCLXVI' "/ #($M $D $C $L $X $V $I)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   437
                    andValues:#(1000 500 100 50 10 5 1).
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   438
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   439
    (stopOnSeparator := aStringOrStream isStream) ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   440
        s := aStringOrStream readStream.
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   441
    ].
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   442
    s atEnd ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   443
        ^ RomanNumberFormatError raiseErrorString:'empty string'
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   444
    ].
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   445
    val := 0.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   446
    prevDigitVal := 99999.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   447
    countSame := 1.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   448
    finish := false.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   449
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   450
    [s atEnd or:[finish]] whileFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   451
        c := s next asUppercase.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   452
        c isSeparator ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   453
            stopOnSeparator ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   454
                ^ RomanNumberFormatError raiseErrorString:'garbage at the end'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   455
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   456
            finish := true.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   457
        ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   458
            digitVal := romanValues at:c ifAbsent:nil.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   459
            digitVal isNil ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   460
                ^ RomanNumberFormatError raiseErrorString:'invalid character'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   461
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   462
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   463
            digitVal = prevDigitVal ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   464
                ( #( 1 10 100 1000) includes:digitVal) ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   465
                    ^ RomanNumberFormatError raiseErrorString:'character may not be repeated'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   466
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   467
                val := val + digitVal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   468
                countSame := countSame + 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   469
                countSame >= 4 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   470
                    digitVal ~= 1000 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   471
                        countSame > 4 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   472
                            "/ this is a bad roman number (such as MCCCCCCCCXXXXXXII);
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   473
                            "/ Its not correct, but sometimes encountered on buildings.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   474
                            "/ If you do not want to be too picky,
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   475
                            "/ provide a proceeding handler in order to proceed the conversion.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   476
                            BadRomanNumberFormatError raiseRequestErrorString:'more than 4 occurrences of same character'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   477
                        ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   478
                            "/ this is a naive roman number (such as VIIII);
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   479
                            "/ Its not correct, but very often encountered (especially as page numbers).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   480
                            "/ The notification below normally goes unnoticed, unless some input validator
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   481
                            "/ wants to be very picky, and treat this as an error.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   482
                            "/ To do so, provide a handler for NaiveRomanNumberFormatNotification.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   483
                            NaiveRomanNumberFormatNotification raiseRequestErrorString:'more than 3 occurrences of same character'.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   484
                        ]
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
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   487
            ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   488
                digitVal < prevDigitVal ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   489
                    val := val + digitVal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   490
                ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   491
                    countSame == 1 ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   492
                        ^ RomanNumberFormatError raiseErrorString:'invalid character combination'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   493
                    ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   494
                    delta := digitVal - prevDigitVal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   495
                    ( #( 4 9 40 90 400 900) includes:delta) ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   496
                        ^ RomanNumberFormatError raiseErrorString:'invalid character combination'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   497
                    ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   498
                    val := val - prevDigitVal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   499
                    val := val + delta.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   500
                    digitVal := prevDigitVal - 0.1.  "/ trick: prevent prevDigit from arriving again.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   501
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   502
                countSame := 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   503
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   504
            prevDigitVal := digitVal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   505
        ].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   506
    ].
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   507
"/    val > 5000 ifTrue:[
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   508
"/        ^ RomanNumberFormatError raiseErrorStirng:'number out of range (1..5000)'
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   509
"/    ].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   510
    ^ val.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   511
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   512
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   513
     Integer readFromRomanString:'I'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   514
     Integer readFromRomanString:'II'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   515
     Integer readFromRomanString:'III'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   516
     Integer readFromRomanString:'IV'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   517
     Integer readFromRomanString:'clix'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   518
     Integer readFromRomanString:'MIX'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   519
     Integer readFromRomanString:'MCMXCIX'
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   520
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   521
   Naive cases (which are accepted):
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   522
     Integer readFromRomanString:'IIII'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   523
     Integer readFromRomanString:'VIIII'
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   524
     Integer readFromRomanString:'CLXXXXVIIII'
6682
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
    Error case (not proceedable):
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   527
     Integer readFromRomanString:'LC'
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   528
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   529
    Error case (proceedable):
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   530
     Integer readFromRomanString:'MCCCCCCCCXXXXXXIIIIII'
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   531
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   532
     BadRomanNumberFormatError ignoreIn:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   533
         Integer readFromRomanString:'MCCCCCCCCXXXXXXIIIIII'
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   534
     ]
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   535
    "
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   536
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   537
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   538
    "naive cases:
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   539
     #(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   540
        'MCMXCIX'           1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   541
        'MCMXCVIIII'        1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   542
        'MCMLXXXXIX'        1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   543
        'MDCCCCXCIX'        1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   544
        'MDCCCCXCVIIII'     1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   545
        'MDCCCCLXXXXIX'     1999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   546
        'MDCCCCLXXXXVIIII'  1999
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   547
     ) pairWiseDo:[:goodString :expectedValue |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   548
        (Integer readFromRomanString:goodString onError:nil) ~= expectedValue ifTrue:[self halt].
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   549
     ]
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   550
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   551
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   552
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   553
    "error cases:
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   554
      #(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   555
        'XIIX'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   556
        'VV'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   557
        'VVV'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   558
        'XXL'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   559
        'XLX'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   560
        'LC'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   561
        'LL'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   562
        'DD'
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   563
     ) do:[:badString |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   564
        (Integer readFromRomanString:badString onError:nil) notNil ifTrue:[self halt].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   565
     ]
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   566
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   567
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   568
    "good cases:
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   569
     #( 'I'     1
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   570
        'II'    2
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   571
        'III'   3
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   572
        'IV'    4
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   573
        'V'     5
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   574
        'VI'    6
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   575
        'VII'   7
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   576
        'VIII'  8
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   577
        'IX'    9
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   578
        'X'     10
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   579
        'XI'    11
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   580
        'XII'   12
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   581
        'XIII'  13
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   582
        'XIV'   14
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   583
        'XV'    15
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   584
        'XVI'   16
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   585
        'XVII'  17
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   586
        'XVIII' 18
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   587
        'XIX'   19
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   588
        'XX'    20
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   589
        'XXX'   30
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   590
        'L'     50
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   591
        'XL'    40
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   592
        'LX'    60
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   593
        'LXX'   70
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   594
        'LXXX'  80
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   595
        'CXL'   140
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   596
        'CL'    150
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   597
        'CLX'   160
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   598
        'MMM'                   3000
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   599
        'MMMM'                  4000
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   600
        'MMMMCMXCIX'            4999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   601
        'MMMMMMMMMCMXCIX'       9999
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   602
     ) pairWiseDo:[:goodString :expectedValue |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   603
        (Integer readFromRomanString:goodString onError:nil) ~= expectedValue ifTrue:[self halt].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   604
     ]
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   605
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   606
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   607
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   608
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   609
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   610
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   611
        romanString := String streamContents:[:stream | n printRomanOn:stream].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   612
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   613
     ]
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   614
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   615
!
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   616
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   617
readFromRomanString:aStringOrStream onError:exceptionalValue
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   618
    "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
   619
     Raises an exception, if the inputs format is wrong.
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   620
     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
   621
     bad (not using L and D) roman numbers.
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   622
     (Such numbers can be seen on some medevial buildings. "
6673
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
    |val|
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   625
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   626
    RomanNumberFormatError
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   627
        handle:[:ex |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   628
            val := exceptionalValue value
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   629
        ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   630
        do:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   631
            val := self readFromRomanString:aStringOrStream
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   632
        ].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   633
    ^ val
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   634
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   635
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   636
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   637
     Integer readFromRomanString:'I'    onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   638
     Integer readFromRomanString:'II'   onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   639
     Integer readFromRomanString:'III'  onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   640
     Integer readFromRomanString:'IV'   onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   641
     Integer readFromRomanString:'clix' onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   642
     Integer readFromRomanString:'MCMXCIX' onError:nil
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   643
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   644
   Naive cases (which are accepted):
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   645
     Integer readFromRomanString:'IIII' onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   646
     Integer readFromRomanString:'VIIII' onError:nil
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   647
     Integer readFromRomanString:'CLXXXXVIIII' onError:nil
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   648
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   649
   Error cases:
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   650
\     Integer readFromRomanString:'LC'   onError:nil
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   651
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   652
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   653
    "error cases:
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   654
      #(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   655
        'XIIX'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   656
        'VV'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   657
        'VVV'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   658
        'XXL'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   659
        'XLX'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   660
        'LC'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   661
        'LL'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   662
        'DD'
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   663
     ) do:[:badString |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   664
        (Integer readFromRomanString:badString onError:nil) notNil ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   665
     ]
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   666
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   667
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   668
    "naive (but handled) cases:
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   669
      #(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   670
        'IIII'   4
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   671
        'VIIII'  9
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   672
        'XIIII'  14
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   673
        'XVIIII' 19
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   674
     ) pairWiseDo:[:goodString :expectedValue |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   675
        (Integer readFromRomanString:goodString onError:nil) ~= expectedValue ifTrue:[self halt].
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   676
     ]
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   677
    "
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
   678
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   679
    "good cases:
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   680
     #( 'I'     1
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   681
        'II'    2
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   682
        'III'   3
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   683
        'IV'    4
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   684
        'V'     5
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   685
        'VI'    6
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   686
        'VII'   7
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   687
        'VIII'  8
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   688
        'IX'    9
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   689
        'X'     10
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   690
        'XI'    11
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   691
        'XII'   12
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   692
        'XIII'  13
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   693
        'XIV'   14
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   694
        'XV'    15
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   695
        'XVI'   16
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   696
        'XVII'  17
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   697
        'XVIII' 18
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   698
        'XIX'   19
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   699
        'XX'    20
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   700
        'XXX'   30
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   701
        'L'     50
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   702
        'XL'    40
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   703
        'LX'    60
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   704
        'LXX'   70
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   705
        'LXXX'  80
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   706
        'CXL'   140
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   707
        'CL'    150
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   708
        'CLX'   160
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   709
        'MMM'                   3000
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   710
        'MMMM'                  4000
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   711
        'MMMMCMXCIX'            4999
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   712
        'MMMMMMMMMCMXCIX'       9999
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   713
     ) pairWiseDo:[:goodString :expectedValue |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   714
        (Integer readFromRomanString:goodString onError:nil) ~= expectedValue ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   715
     ]
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
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   718
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   719
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   720
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   721
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   722
        romanString := String streamContents:[:stream | n printRomanOn:stream].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   723
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   724
     ]
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   725
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   726
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   727
    "reading naive numbers:
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   728
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
   729
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   730
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   731
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   732
        romanString := String streamContents:[:stream | n printRomanOn:stream naive:true].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   733
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   734
     ]
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
   735
    "
8897
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   736
!
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   737
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   738
readFromString:aString radix:base onError:exceptionBlock
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   739
    |str val|
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   740
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   741
    str := ReadStream on:aString.
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   742
    val := self readFrom:str radix:base onError:[^ exceptionBlock value].
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   743
    str atEnd ifFalse:[ ^ exceptionBlock value].
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
   744
    ^ val
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   745
! !
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   746
9141
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   747
!Integer class methodsFor:'Compatibility-Squeak'!
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   748
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   749
readFrom:aStringOrStream base:aBase
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   750
    "for squeak compatibility"
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   751
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   752
    ^ self readFrom:aStringOrStream radix:aBase
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   753
! !
dc20ee8ba916 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9136
diff changeset
   754
4996
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   755
!Integer class methodsFor:'Signal constants'!
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   756
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   757
bcdConversionErrorSignal
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   758
    "return the signal which is raised when bcd conversion fails
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   759
     (i.e. when trying to decode an invalid BCD number)"
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   760
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   761
    ^ BCDConversionErrorSignal
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   762
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   763
    "Modified: / 15.11.1999 / 20:35:20 / cg"
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   764
! !
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
   765
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   766
!Integer class methodsFor:'class initialization'!
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   767
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   768
initialize
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   769
    BCDConversionErrorSignal isNil ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   770
        BCDConversionErrorSignal := ConversionError newSignal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   771
        BCDConversionErrorSignal nameClass:self message:#bcdConversionErrorSignal.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   772
        BCDConversionErrorSignal notifierString:'bcd conversion error'.
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   773
    ].
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   774
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   775
    "Modified: / 15.11.1999 / 20:36:04 / cg"
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   776
! !
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   777
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
   778
!Integer class methodsFor:'constants'!
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   779
7727
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   780
epsilon
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   781
    "return the maximum relative spacing"
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   782
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   783
    "don't know, what to really return here.
8635
38674ba49a14 comment
Claus Gittinger <cg@exept.de>
parents: 8573
diff changeset
   784
     Returning 1 gives stupid values when doing some taylor series approximations
38674ba49a14 comment
Claus Gittinger <cg@exept.de>
parents: 8573
diff changeset
   785
     (although it is correct)"
7727
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   786
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   787
    ^ Float epsilon.
8635
38674ba49a14 comment
Claus Gittinger <cg@exept.de>
parents: 8573
diff changeset
   788
38674ba49a14 comment
Claus Gittinger <cg@exept.de>
parents: 8573
diff changeset
   789
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   790
     2 sqrt_withAccuracy:(Integer epsilon)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
   791
     2 sqrt_withAccuracy:1
8635
38674ba49a14 comment
Claus Gittinger <cg@exept.de>
parents: 8573
diff changeset
   792
    "
7727
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   793
!
bda9f88c6847 Define #epsilon
Stefan Vogel <sv@exept.de>
parents: 7685
diff changeset
   794
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   795
unity
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   796
    "return the neutral element for multiplication (1)"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   797
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   798
    ^ 1
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   799
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   800
    "Modified: 18.7.1996 / 12:26:43 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   801
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   802
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   803
zero
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   804
    "return the neutral element for addition (0)"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   805
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
   806
    ^ 0
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   807
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1431
diff changeset
   808
    "Modified: 18.7.1996 / 12:26:38 / cg"
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   809
! !
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   810
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
   811
!Integer class methodsFor:'misc'!
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   812
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   813
displayRadix:aNumber
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 52
diff changeset
   814
    "being tired of always sending #printStringRadix: in the inspectors,
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   815
     this allows you to change the default print radix for the displayString
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   816
     method."
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   817
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   818
    DefaultDisplayRadix := aNumber
132
ab2cfccd218c *** empty log message ***
claus
parents: 92
diff changeset
   819
ab2cfccd218c *** empty log message ***
claus
parents: 92
diff changeset
   820
    "
ab2cfccd218c *** empty log message ***
claus
parents: 92
diff changeset
   821
     Integer displayRadix:16. 123456 inspect
ab2cfccd218c *** empty log message ***
claus
parents: 92
diff changeset
   822
     Integer displayRadix:10. 123456 inspect
ab2cfccd218c *** empty log message ***
claus
parents: 92
diff changeset
   823
    "
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   824
! !
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   825
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   826
!Integer class methodsFor:'prime numbers'!
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   827
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   828
flushPrimeCache
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   829
    "cleanup after using a primeCache"
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   830
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   831
    PrimeCache := nil.
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   832
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   833
    "
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   834
     Integer initializePrimeCacheUpTo:1000000
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   835
     Integer flushPrimeCache.
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   836
    "
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   837
!
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   838
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   839
initializePrimeCacheUpTo:limit
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   840
    "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
   841
     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
   842
     (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
   843
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   844
    |bits|
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   845
11563
a91c8d348760 could have returned an uncompressed largeint after bitShift
Claus Gittinger <cg@exept.de>
parents: 11521
diff changeset
   846
    PrimeCache := nil.
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   847
    bits := BooleanArray new:limit//2.
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   848
    self primesUpTo:limit do:[:p |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   849
        bits at:p//2 put:true
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   850
    ].
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   851
    PrimeCache := bits.
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   852
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   853
    "
11521
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   854
     Integer initializePrimeCacheUpTo:1000000.
11654
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   855
     Integer initializePrimeCacheUpTo:10000000.
9dd403ddfb91 tuned largeInteger reading
Claus Gittinger <cg@exept.de>
parents: 11587
diff changeset
   856
     Integer initializePrimeCacheUpTo:100000000.
11563
a91c8d348760 could have returned an uncompressed largeint after bitShift
Claus Gittinger <cg@exept.de>
parents: 11521
diff changeset
   857
     Integer initializePrimeCacheUpTo:1000000000.
11521
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   858
     Integer flushPrimeCache.
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   859
    "
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   860
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   861
    "
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   862
     Integer flushPrimeCache.
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   863
     Transcript showCR:(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   864
        Time millisecondsToRun:[ 1 to:100000 do:[:n | n isPrime] ]
11521
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   865
     ).
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   866
     Integer initializePrimeCacheUpTo:100000.
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   867
     Transcript showCR:(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   868
        Time millisecondsToRun:[ 1 to:100000 do:[:n | n isPrime] ]
11521
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
   869
     ).
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   870
     Integer flushPrimeCache.
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   871
    "
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   872
!
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   873
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   874
largePrimesUpTo: max do: aBlock
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   875
    "Evaluate aBlock with all primes up and including maxValue.
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   876
     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
   877
     It encodes prime numbers much more compactly than #primesUpTo:
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   878
     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
   879
     (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
   880
     the regular #primesUpTo: would require 4 *GIGA*bytes).
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   881
     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
   882
     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
   883
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   884
    | limit flags maskBitIndex bitIndex maskBit byteIndex index primesUpTo2310 indexLimit |
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   885
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
   886
    limit := max asInteger.
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   887
    indexLimit := max sqrt truncated + 1.
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   888
    "Create the array of flags."
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   889
    flags := ByteArray new: (limit + 2309) // 2310 * 60 + 60.
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   890
    flags atAllPut: 16rFF. "set all to true"
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   891
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   892
    "Compute the primes up to 2310"
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   893
    primesUpTo2310 := self primesUpTo: 2310.
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   894
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   895
    "Create a mapping from 2310 integers to 480 bits (60 byte)"
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   896
    maskBitIndex := Array new: 2310.
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   897
    bitIndex := -1. "for pre-increment"
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   898
    maskBitIndex at: 1 put: (bitIndex := bitIndex + 1).
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   899
    maskBitIndex at: 2 put: (bitIndex := bitIndex + 1).
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   900
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   901
    1 to: 5 do:[:i| aBlock value: (primesUpTo2310 at: i)].
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   902
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   903
    index := 6.
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   904
    2 to: 2309 do:[:n|
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   905
        [(primesUpTo2310 at: index) < n]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   906
            whileTrue:[index := index + 1].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   907
        n = (primesUpTo2310 at: index) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   908
            maskBitIndex at: n+1 put: (bitIndex := bitIndex + 1).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   909
        ] ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   910
            "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
   911
            (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
   912
                    ifTrue:[maskBitIndex at: n+1 put: 0]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   913
                    ifFalse:[maskBitIndex at: n+1 put: (bitIndex := bitIndex + 1)].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   914
        ].
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   915
    ].
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   916
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   917
    "Now the real work begins...
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   918
    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
   919
    increment by 2 for odd numbers only."
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   920
    13 to: limit by: 2 do:[:n|
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   921
        (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
   922
            byteIndex := n // 2310 * 60 + (maskBit-1 bitShift: -3) + 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   923
            bitIndex := 1 bitShift: (maskBit bitAnd: 7).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   924
            ((flags at: byteIndex) bitAnd: bitIndex) = 0 ifFalse:["not marked -- n is prime"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   925
                aBlock value: n.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   926
                "Start with n*n since any integer < n has already been sieved
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   927
                (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
   928
                when k was sieved); add 2 * i to avoid even numbers and
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   929
                mark all multiples of this prime. Note: n < indexLimit below
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   930
                limits running into LargeInts -- nothing more."
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   931
                n < indexLimit ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   932
                    index := n * n.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   933
                    (index bitAnd: 1) = 0 ifTrue:[index := index + n].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   934
                    [index <= limit] whileTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   935
                        (maskBit := maskBitIndex at: (index \\ 2310 + 1)) = 0 ifFalse:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   936
                            byteIndex := (index // 2310 * 60) + (maskBit-1 bitShift: -3) + 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   937
                            maskBit := 255 - (1 bitShift: (maskBit bitAnd: 7)).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   938
                            flags at: byteIndex put: ((flags at: byteIndex) bitAnd: maskBit).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   939
                        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   940
                        index := index + (2 * n)].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   941
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   942
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   943
        ].
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   944
    ].
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   945
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   946
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   947
     Integer largePrimesUpTo:1000000 do:[:i | i > 900000 ifTrue:[self halt] ]
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   948
     (Integer primesUpTo:1000000) inspect
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   949
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   950
!
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
   951
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   952
primeCacheSize
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   953
    ^ PrimeCache size * 2
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   954
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   955
    "
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   956
     Integer initializePrimeCacheUpTo:1000.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   957
     Integer initializePrimeCacheUpTo:1000000.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   958
     Integer initializePrimeCacheUpTo:1000000000.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   959
     Integer flushPrimeCache.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   960
    "
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   961
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   962
    "
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   963
     Integer flushPrimeCache.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   964
     Transcript showCR:(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   965
        Time millisecondsToRun:[ 1 to:100000 do:[:n | n isPrime] ]
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   966
     ).
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   967
     Integer initializePrimeCacheUpTo:100000.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   968
     Transcript showCR:(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   969
        Time millisecondsToRun:[ 1 to:100000 do:[:n | n isPrime] ]
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   970
     ).
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   971
     Integer flushPrimeCache.
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   972
    "
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   973
!
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   974
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
   975
primesUpTo2000
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   976
    "/ primes up to 1000
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   977
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   978
    ^ #(
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   979
            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
   980
             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
   981
            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
   982
            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
   983
            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
   984
            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
   985
            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
   986
            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
   987
            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
   988
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
   989
            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
   990
            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
   991
            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
   992
            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
   993
            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
   994
            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
   995
            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
   996
            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
   997
            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
   998
        ).
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
   999
!
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
  1000
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1001
primesUpTo: max
15578
88cefb6e5d94 class: Integer
Stefan Vogel <sv@exept.de>
parents: 15567
diff changeset
  1002
    "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
  1003
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
  1004
    ^ 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
  1005
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1006
    "
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1007
     Integer primesUpTo: 100
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1008
     Integer primesUpTo: 13
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1009
     (Integer primesUpTo: 100) select:[:p | p between:10 and:99]
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1010
    "
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1011
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
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1014
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1015
     N := 1000.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1016
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1017
     a := (1 to:1000)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1018
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1019
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1020
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1021
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1022
    "
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
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1025
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1026
     N := 1000 nextPrime.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1027
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1028
     a := (1 to:1000)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1029
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1030
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1031
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1032
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1033
    "
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
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1036
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1037
     N := 1000 nextPrime-1.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1038
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1039
     a := (1 to:1000)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1040
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1041
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1042
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1043
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1044
    "
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
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1047
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1048
     N := 100000.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1049
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1050
     a := (1 to:N)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1051
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1052
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1053
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1054
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1055
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1056
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1057
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1058
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1059
     N := 100000 nextPrime.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1060
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1061
     a := (1 to:N)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1062
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1063
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1064
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1065
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1066
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1067
    "
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1068
     |p N a b|
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1069
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1070
     N := 100000 nextPrime-1.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1071
     p := 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1072
     a := (1 to:N)
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1073
         collect:[:i | p := p nextPrime. p ]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1074
         thenSelect:[:p | p <= N].
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1075
     b := Integer primesUpTo:N.
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1076
     self assert:(a = b)
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1077
    "
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1078
!
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1079
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1080
primesUpTo: max do: aBlock
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1081
    "Compute aBlock with all prime integers up to and including the given integer."
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1082
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1083
    | limit flags prime k |
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1084
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
  1085
    max <= 2000 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1086
        self primesUpTo2000 do:[:p |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1087
            p > max ifTrue:[^ self].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1088
            aBlock value:p.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1089
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1090
        ^ self.
11521
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
  1091
    ].
1f5b947c7fc8 primeCache
Claus Gittinger <cg@exept.de>
parents: 11520
diff changeset
  1092
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
  1093
    max <= self primeCacheSize ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1094
        aBlock value:2.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1095
        3 to:max by:2 do:[:p |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1096
            (PrimeCache at:p//2) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1097
                aBlock value:p
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1098
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1099
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1100
        ^ self.
11520
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
  1101
    ].
79ae7618543f primeCache
Claus Gittinger <cg@exept.de>
parents: 11517
diff changeset
  1102
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1103
    limit := max asInteger - 1.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1104
    "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
  1105
    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
  1106
    limit > 25000 ifTrue:[^ self largePrimesUpTo: max do: aBlock].
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1107
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1108
    "/ sieve, on the fly
11495
833b96ce156d subtile bug in primesUpTo: - did not include the limit,
Claus Gittinger <cg@exept.de>
parents: 11494
diff changeset
  1109
    flags := (ByteArray new: limit) atAllPut: 1.
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1110
    1 to: limit do: [:i |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1111
        (flags at: i) == 1 ifTrue: [
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1112
            prime := i + 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1113
            k := i + prime.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1114
            [k <= limit] whileTrue: [
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1115
                flags at: k put: 0.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1116
                k := k + prime
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1117
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1118
            aBlock value: prime
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1119
        ]
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1120
    ].
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1121
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1122
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1123
     Integer primesUpTo: 100
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1124
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1125
! !
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1126
4653
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1127
!Integer class methodsFor:'queries'!
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1128
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1129
hasSharedInstances
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1130
    "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
  1131
     with the same value are identical.
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1132
     Although not always shared (LargeIntegers), these should be treated
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1133
     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
  1134
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1135
    ^ true
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1136
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1137
8892
5d05a7f150a5 +isAbstract
Claus Gittinger <cg@exept.de>
parents: 8635
diff changeset
  1138
!
5d05a7f150a5 +isAbstract
Claus Gittinger <cg@exept.de>
parents: 8635
diff changeset
  1139
5d05a7f150a5 +isAbstract
Claus Gittinger <cg@exept.de>
parents: 8635
diff changeset
  1140
isAbstract
11223
7536833995bb comment
Claus Gittinger <cg@exept.de>
parents: 11125
diff changeset
  1141
    "Return if this class is an abstract class.
7536833995bb comment
Claus Gittinger <cg@exept.de>
parents: 11125
diff changeset
  1142
     True is returned for Integer here; false for subclasses.
7536833995bb comment
Claus Gittinger <cg@exept.de>
parents: 11125
diff changeset
  1143
     Abstract subclasses must redefine again."
7536833995bb comment
Claus Gittinger <cg@exept.de>
parents: 11125
diff changeset
  1144
8892
5d05a7f150a5 +isAbstract
Claus Gittinger <cg@exept.de>
parents: 8635
diff changeset
  1145
    ^ self == Integer
4653
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1146
! !
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  1147
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1148
!Integer methodsFor:'*Roe'!
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1149
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1150
acceptRoeVisitor: aVisitor
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1151
	^ aVisitor visitInteger: self
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1152
! !
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1153
7261
f35fc9cee675 method category rename
Claus Gittinger <cg@exept.de>
parents: 7173
diff changeset
  1154
!Integer methodsFor:'Compatibility-Dolphin'!
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1155
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1156
& aNumber
11936
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1157
    "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
  1158
     Same as bitAnd: - added for compatibility with Dolphin Smalltalk.
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1159
     Notice: 
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1160
        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
  1161
        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
  1162
        For integers, use bitAnd: to make the intention explicit."
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  1163
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1164
    ^ self bitAnd:aNumber
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1165
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1166
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1167
     14 | 1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1168
     9 & 8
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1169
    "
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1170
!
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1171
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1172
highWord
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1173
    "return the high 16 bits of a 32 bit value"
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1174
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1175
    ^ self bitShift:-16
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1176
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1177
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1178
     (16r12345678 highWord) hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1179
     (16r12345678 lowWord) hexPrintString
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
!
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1182
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1183
lowWord
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1184
    "return the low 16 bits of a 32 bit value"
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1185
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1186
    ^ self bitAnd:16rFFFF
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1187
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1188
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1189
     (16r12345678 lowWord) hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1190
     (16r12345678 highWord) hexPrintString
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1191
    "
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1192
!
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1193
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1194
mask:integerMask set:aBoolean
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1195
    "Answer the result of setting/resetting the specified mask in the receiver."
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1196
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1197
    ^ aBoolean
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1198
            ifTrue:  [self bitOr:integerMask]
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1199
            ifFalse: [self bitClear:integerMask]
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1200
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1201
    "turn on the 1-bit:
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1202
         |v|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1203
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1204
         v := 2r0100.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1205
         v mask:1 set:true
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1206
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1207
     turn off the 1-bit:
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1208
         |v|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1209
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1210
         v := 2r0101.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1211
         v mask:1 set:false
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1212
    "
6875
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1213
!
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1214
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1215
maskClear:aMaskInteger
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1216
    "return an integer with all bits cleared which are set in aMaskInteger.
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1217
     An alias for bitClear: for compatibility."
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1218
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1219
    ^ self bitClear:aMaskInteger
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1220
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1221
    "
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1222
     3 maskClear:1
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1223
    "
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1224
!
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1225
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1226
maskSet:aMaskInteger
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1227
    "return an integer with all bits set which are set in aMaskInteger.
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1228
     An alias for bitSet: for compatibility."
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1229
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1230
    ^ self bitOr:aMaskInteger
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1231
!
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1232
6875
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1233
printStringRadix:aRadix padTo:sz
11936
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1234
    "return a printed representation of the receiver in a given radix,
15765
6edf4f55277d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15578
diff changeset
  1235
     padded with zeros (at the left) up to size.
11936
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1236
     If the printString is longer than size,
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1237
     it is returned unchanged (i.e. not truncated).
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1238
     See also printStringRadix:size:fill:"
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1239
6875
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1240
    ^ self printStringRadix:aRadix size:sz fill:$0
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1241
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1242
    "
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  1243
     1024 printStringRadix:16 padTo:4
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  1244
     16rABCD printStringRadix:16 padTo:3
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  1245
     1024 printStringRadix:2 padTo:16
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  1246
     1024 printStringRadix:16 padTo:8
6875
d064224376bf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 6858
diff changeset
  1247
    "
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1248
!
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1249
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1250
| aNumber
11936
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1251
    "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
  1252
     Same as bitOr: - added for compatibility with Dolphin Smalltalk.
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1253
     Notice: 
9de88d62d686 comment/format in:
Claus Gittinger <cg@exept.de>
parents: 14404
diff changeset
  1254
        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
  1255
        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
  1256
        For integers, use bitOr: to make the intention explicit."
11936
94784c846e12 comments
Claus Gittinger <cg@exept.de>
parents: 11896
diff changeset
  1257
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1258
    ^ self bitOr:aNumber
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1259
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1260
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1261
     14 | 1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1262
     9 & 8
6907
a77451f0c14c dolphin compatibility
Claus Gittinger <cg@exept.de>
parents: 6875
diff changeset
  1263
    "
6249
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1264
! !
fa8cb1110cef dolphin
Claus Gittinger <cg@exept.de>
parents: 6195
diff changeset
  1265
7261
f35fc9cee675 method category rename
Claus Gittinger <cg@exept.de>
parents: 7173
diff changeset
  1266
!Integer methodsFor:'Compatibility-Squeak'!
4867
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1267
12122
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1268
asByteArray
15937
ff395b64b43a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15911
diff changeset
  1269
    "return my hexBytes in MSB.
ff395b64b43a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15911
diff changeset
  1270
     Do not use:
ff395b64b43a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15911
diff changeset
  1271
        This is a very stupid squeak-compatibility method,
ff395b64b43a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15911
diff changeset
  1272
        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
  1273
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1274
    ^ self digitBytesMSB
12122
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1275
!
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1276
12147
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1277
asByteArrayOfSize:size
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1278
    "return my hexBytes in MSB, optionally padded at the left with zeros"
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1279
12122
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1280
    "(((
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1281
        | repeats number | 
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1282
        repeats := 1000000.
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1283
        number := 123456789123456789123456789123456789123456789123456789.
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1284
         [repeats timesRepeat: (number asByteArrayOfSize: 1024) ] timeToRun.
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1285
     )))"
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1286
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1287
    | bytes bytesSize|
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1288
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1289
    bytes := self digitBytesMSB.
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1290
    bytesSize := bytes size.
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1291
    size < bytesSize ifTrue: [
14796
242490a39283 class: Integer
Stefan Vogel <sv@exept.de>
parents: 14767
diff changeset
  1292
        ^ ConversionError raiseRequestWith:self errorString:'number too big for ', size asString
242490a39283 class: Integer
Stefan Vogel <sv@exept.de>
parents: 14767
diff changeset
  1293
    ].
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1294
    ^ (ByteArray new:size)
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  1295
            replaceFrom:size-bytesSize+1 to:size with:bytes startingAt:1.
12147
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1296
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1297
    "
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1298
     123 asByteArrayOfSize:1 #[123]
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1299
     123 asByteArrayOfSize:2 #[0 123]
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1300
     123 asByteArrayOfSize:4 #[0 0 0 123]
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1301
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1302
     255 asByteArrayOfSize:1 #[255]
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1303
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1304
     256 asByteArrayOfSize:1 
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1305
     256 asByteArrayOfSize:2
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1306
     256 asByteArrayOfSize:4
307dfa8e44c4 changed:
Claus Gittinger <cg@exept.de>
parents: 12122
diff changeset
  1307
    "
12122
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1308
!
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  1309
4867
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1310
atRandom
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1311
    "return a random number between 1 amd myself"
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1312
8573
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1313
    ^ self atRandom:Random.
8572
3e649d2e3167 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8461
diff changeset
  1314
3e649d2e3167 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8461
diff changeset
  1315
    "
3e649d2e3167 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8461
diff changeset
  1316
     100 atRandom
3e649d2e3167 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8461
diff changeset
  1317
     1000 atRandom
3e649d2e3167 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8461
diff changeset
  1318
    "
4867
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1319
!
4376
8df0935ac5b1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4278
diff changeset
  1320
8573
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1321
atRandom:aRandomGenerator
15456
9535b5c74e85 class: Integer
Stefan Vogel <sv@exept.de>
parents: 15273
diff changeset
  1322
    "return a random number between 1 and myself"
8573
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1323
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1324
    self < 1 ifTrue:[^ self].
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1325
    ^ aRandomGenerator nextIntegerBetween:1 and:self
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1326
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1327
    "
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1328
     100 atRandom:(Random new)
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1329
     1000 atRandom:(Random new)
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1330
    "
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1331
!
240f0fa27d20 +atRandom:
Claus Gittinger <cg@exept.de>
parents: 8572
diff changeset
  1332
14385
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1333
printLeftPaddedWith:padChar to:size base:base
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1334
    "prints left-padded"
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1335
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1336
    ^ (self printStringRadix:base) leftPaddedTo:size with:padChar
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1337
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1338
    "
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1339
     1234 printPaddedWith:$0 to:4 base:16     
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1340
     1234 printLeftPaddedWith:$0 to:4 base:16 
17488
9da696f7560f class: Integer
Claus Gittinger <cg@exept.de>
parents: 17248
diff changeset
  1341
     128 printLeftPaddedWith:$0 to:2 base:16  
14385
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1342
    "
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1343
!
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1344
11858
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1345
printPaddedWith:padChar to:size base:base
14385
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1346
    "attention: prints right-padded; see printLeftPadded."
1bb6b27c59f9 added: #printLeftPaddedWith:to:base:
Claus Gittinger <cg@exept.de>
parents: 14294
diff changeset
  1347
11858
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1348
    ^ (self printStringRadix:base) paddedTo:size with:padChar
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1349
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1350
    "
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1351
     1234 printPaddedWith:$0 to:4 base:16
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1352
    "
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1353
!
8baf5d75506e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11793
diff changeset
  1354
4376
8df0935ac5b1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4278
diff changeset
  1355
printStringBase:base
4867
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1356
    "return my printString in a base;
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1357
     same as printStringRadix:"
3bb80fe9bb8f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4830
diff changeset
  1358
4376
8df0935ac5b1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4278
diff changeset
  1359
    ^ self printStringRadix:base
12284
a6e7b47c08c4 comment/format in: #printStringBase:
Claus Gittinger <cg@exept.de>
parents: 12280
diff changeset
  1360
a6e7b47c08c4 comment/format in: #printStringBase:
Claus Gittinger <cg@exept.de>
parents: 12280
diff changeset
  1361
    "
a6e7b47c08c4 comment/format in: #printStringBase:
Claus Gittinger <cg@exept.de>
parents: 12280
diff changeset
  1362
     1234 printStringBase:16
a6e7b47c08c4 comment/format in: #printStringBase:
Claus Gittinger <cg@exept.de>
parents: 12280
diff changeset
  1363
    "
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
9125
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1366
printStringHex
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1367
    "return my printString in base 16;
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1368
     same as printStringRadix:"
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1369
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1370
    ^ self printStringRadix:16
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1371
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1372
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1373
     4096 printStringHex
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1374
    "
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1375
!
73e759072361 i pushed up;
Claus Gittinger <cg@exept.de>
parents: 9069
diff changeset
  1376
9068
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1377
printStringRoman
9069
e5ba0dc84a53 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9068
diff changeset
  1378
    "return my roman printString;
e5ba0dc84a53 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9068
diff changeset
  1379
     almost the same as romanPrintString:"
e5ba0dc84a53 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9068
diff changeset
  1380
9068
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1381
    "funny - although the romans did not have negative numbers - squeak has"
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1382
    self negative ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1383
        ^ '-' , self negated romanPrintString
9068
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1384
    ].
ad6967cff1b4 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9057
diff changeset
  1385
    ^ self romanPrintString
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  1386
!
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  1387
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  1388
raisedTo:exp modulo:mod
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  1389
    ^ self raisedTo:exp mod:mod
4376
8df0935ac5b1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4278
diff changeset
  1390
! !
8df0935ac5b1 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4278
diff changeset
  1391
7261
f35fc9cee675 method category rename
Claus Gittinger <cg@exept.de>
parents: 7173
diff changeset
  1392
!Integer methodsFor:'Compatibility-V''Age'!
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1393
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1394
<< aNumber
7155
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  1395
    "V'Age compatibility: left shift"
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1396
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1397
    ^ self bitShift:aNumber
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1398
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1399
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1400
     1 << 5
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1401
     64 << -5
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1402
    "
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1403
!
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1404
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1405
>> aNumber
7155
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  1406
    "V'Age compatibility: right shift"
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1407
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1408
    ^ self bitShift:(aNumber negated)
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1409
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1410
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1411
     1 >> -5
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1412
     64 >> 5
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1413
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1414
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1415
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1416
!Integer methodsFor:'bcd conversion'!
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
decodeFromBCD
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1419
    "return a number representing the value of the BCD encoded receiver."
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1420
4424
f0f658ed8995 bcd support
Claus Gittinger <cg@exept.de>
parents: 4423
diff changeset
  1421
    |v rslt multiplier nibble|
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1422
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1423
    v := self.
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1424
    rslt := 0.
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1425
    multiplier := 1.
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1426
    [v > 0] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1427
        nibble := v bitAnd:16r0F.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1428
        nibble > 9 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1429
            ^ BCDConversionErrorSignal
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1430
                    raiseRequestWith:self
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1431
                    errorString:'bad BCD coded value'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1432
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1433
        rslt := rslt + (nibble * multiplier).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1434
        multiplier := multiplier * 10.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1435
        v := v bitShift:-4.
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1436
    ].
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1437
    ^ rslt
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1438
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1439
    "
4949
4c0462bd4d6a checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4921
diff changeset
  1440
     16r1234567890123 decodeFromBCD
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1441
     16r1073741823 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1442
     16r1073741824 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1443
     16r1073741825 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1444
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1445
     16r55 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1446
     16r127 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1447
     16r800000 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1448
     16r8000000 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1449
     16r80000000 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1450
     16r800000000 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1451
     16r127567890 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1452
     16r1234567890 decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1453
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1454
     16r5A decodeFromBCD
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1455
     16rFF decodeFromBCD
4423
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
4996
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
  1458
    "Modified: / 15.11.1999 / 20:37:20 / cg"
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1459
!
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1460
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1461
encodeAsBCD
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1462
    "return a BCD encoded number representing the same value as the
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1463
     receiver."
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1464
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1465
    |v rslt shift|
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1466
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1467
    v := self.
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1468
    rslt := shift := 0.
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1469
    [v > 0] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1470
        rslt := rslt + ((v \\ 10) bitShift:shift).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1471
        shift := shift + 4.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1472
        v := v // 10.
4423
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
    ^ rslt
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1475
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1476
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1477
     55 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1478
     127 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1479
     127 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1480
     8912345 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1481
     89123456 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1482
     891234567 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1483
     900000000 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1484
     1073741823 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1485
     1073741824 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1486
     1073741825 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1487
     1891234567 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1488
     8912345678 encodeAsBCD hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1489
     1234567890 encodeAsBCD hexPrintString
4423
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1490
    "
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1491
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1492
! !
2a478882f765 bcd support
Claus Gittinger <cg@exept.de>
parents: 4376
diff changeset
  1493
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1494
!Integer methodsFor:'bit operators'!
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1495
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1496
allMask:aMaskInteger
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1497
    "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
  1498
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1499
    ^ (self bitAnd:aMaskInteger) == aMaskInteger
4643
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1500
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1501
    "2r00001111 allMask:2r00000001"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1502
    "2r00001111 allMask:2r00011110"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1503
    "2r00001111 allMask:2r00000000"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1504
!
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1505
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1506
anyMask:aMaskInteger
4643
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1507
    "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
  1508
     (somewhat incorrect, if the mask is zero)"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1509
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1510
    ^ (self bitAnd:aMaskInteger) ~~ 0
4643
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1511
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1512
    "2r00001111 anyMask:2r00000001"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1513
    "2r00001111 anyMask:2r11110000"
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1514
!
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  1515
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1516
bitAnd:aMaskInteger
357
claus
parents: 356
diff changeset
  1517
    "return the bitwise-and of the receiver and the argument, anInteger.
claus
parents: 356
diff changeset
  1518
     This is a general and slow implementation, walking over the bytes of
claus
parents: 356
diff changeset
  1519
     the receiver and the argument."
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1520
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1521
    |n "{ Class: SmallInteger }"
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1522
     result byte|
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1523
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1524
    aMaskInteger isInteger ifFalse:[
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1525
        ^ aMaskInteger bitAndFromInteger:self.
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1526
    ].
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1527
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1528
    n := (aMaskInteger digitLength) min:(self digitLength).
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1529
    result := self class basicNew numberOfDigits:n.
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1530
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1531
    1 to:n do:[:index |
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1532
        byte := (aMaskInteger digitAt:index) bitAnd:(self digitAt:index).
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1533
        result digitAt:index put:byte.
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1534
    ].
3162
c7c8af356ff2 dont hardcode the numberof bytes (use maxBytes for alpha);
Claus Gittinger <cg@exept.de>
parents: 3138
diff changeset
  1535
    (byte == 0 or:[n <= SmallInteger maxBytes]) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1536
        ^ result compressed
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1537
    ].
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1538
    ^ result
357
claus
parents: 356
diff changeset
  1539
claus
parents: 356
diff changeset
  1540
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1541
     (16r112233445566778899 bitAnd:16rFF                ) printStringRadix:16
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1542
     (16r112233445566778899 bitAnd:16rFFFFFFFFFFFFFFFF00) printStringRadix:16
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1543
     (16r112233445566778899 bitAnd:16rFF0000000000000000) printStringRadix:16
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1544
     (16r112233445566778899 bitAnd:16r00000000000000FFFF) printStringRadix:16
357
claus
parents: 356
diff changeset
  1545
    "
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  1546
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  1547
    "Modified: 5.11.1996 / 14:06:26 / cg"
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1548
!
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  1549
85
claus
parents: 77
diff changeset
  1550
bitAt:index
11499
fa02ab9a83f0 comment
Claus Gittinger <cg@exept.de>
parents: 11496
diff changeset
  1551
    "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
  1552
     Notice: the result of bitAt: on negative receivers is not
15556
ab840a26f63b class: Integer
Stefan Vogel <sv@exept.de>
parents: 15456
diff changeset
  1553
             defined in the language standard (since the implementation
ab840a26f63b class: Integer
Stefan Vogel <sv@exept.de>
parents: 15456
diff changeset
  1554
             is free to choose any internal representation for integers)"
85
claus
parents: 77
diff changeset
  1555
claus
parents: 77
diff changeset
  1556
    |i "{Class: SmallInteger}"|
claus
parents: 77
diff changeset
  1557
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  1558
    i := index - 1.
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  1559
    i < 0 ifTrue:[
15556
ab840a26f63b class: Integer
Stefan Vogel <sv@exept.de>
parents: 15456
diff changeset
  1560
        ^ SubscriptOutOfBoundsError
ab840a26f63b class: Integer
Stefan Vogel <sv@exept.de>
parents: 15456
diff changeset
  1561
                raiseRequestWith:index
ab840a26f63b class: Integer
Stefan Vogel <sv@exept.de>
parents: 15456
diff changeset
  1562
                errorString:'index out of bounds'
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  1563
    ].
85
claus
parents: 77
diff changeset
  1564
    ^ (self digitAt:(i // 8 + 1)) bitAt:(i \\ 8 + 1)
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1565
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1566
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1567
     1 bitAt:1                     => 1
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1568
     1 bitAt:2                     => 0
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1569
     1 bitAt:0                     index error
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1570
     2r1000100010001000100010001000100010001000100010001000 bitAt:48 => 1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1571
     2r1000100010001000100010001000100010001000100010001000 bitAt:47 => 0
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1572
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1573
     (1 bitShift:1000) bitAt:1000  => 0
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1574
     (1 bitShift:1000) bitAt:1001  => 1
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1575
     (1 bitShift:1000) bitAt:1002  => 0
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1576
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1577
     (1 bitShift:30) bitAt:30
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1578
     (1 bitShift:30) bitAt:31
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1579
     (1 bitShift:30) bitAt:32
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1580
     (1 bitShift:31) bitAt:31
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1581
     (1 bitShift:31) bitAt:32
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1582
     (1 bitShift:31) bitAt:33
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1583
     (1 bitShift:32) bitAt:32
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1584
     (1 bitShift:32) bitAt:33
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1585
     (1 bitShift:32) bitAt:34
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1586
     (1 bitShift:64) bitAt:64
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1587
     (1 bitShift:64) bitAt:65
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1588
     (1 bitShift:64) bitAt:66
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1589
    "
85
claus
parents: 77
diff changeset
  1590
!
claus
parents: 77
diff changeset
  1591
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1592
bitClear:aMaskInteger
16379
04f35b0875dc class: Integer
Claus Gittinger <cg@exept.de>
parents: 16347
diff changeset
  1593
    "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
  1594
     returning the receiver with bits of the argument cleared.
3884
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1595
     This is a general and slow implementation, walking over the bytes of
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1596
     the receiver and the argument."
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1597
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1598
    |n "{ Class: SmallInteger }"
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1599
     result byte|
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  1600
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1601
    n := (aMaskInteger digitLength) max:(self digitLength).
3884
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1602
    result := self class basicNew numberOfDigits:n.
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1603
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1604
    1 to:n do:[:index |
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1605
        byte :=  (self digitAt:index) bitClear:(aMaskInteger digitAt:index).
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1606
        result digitAt:index put:byte.
3884
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1607
    ].
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1608
    (byte == 0 or:[n <= SmallInteger maxBytes]) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1609
        ^ result compressed
3884
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1610
    ].
ddda4144e331 fixed bitClear
ca
parents: 3874
diff changeset
  1611
    ^ result
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  1612
!
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  1613
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1614
bitCount
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1615
    "return the number of 1-bits in the receiver"
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1616
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1617
    |n "{ Class: SmallInteger }"
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1618
     cnt byte|
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1619
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1620
    n := self digitLength.
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1621
    cnt := 0.
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1622
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1623
    1 to:n do:[:index |
13914
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1624
        byte := self digitAt:index.
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1625
        cnt := cnt + (byte bitCount)
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1626
    ].
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1627
    ^ cnt
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1628
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1629
     "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1630
      2r100000000000000000000000000000000000000000000000000000000001 bitCount
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1631
      2r111111111111111111111111111111111111111111111111111111111111111111 bitCount
13914
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1632
      100 factorial bitCount -> 207
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1633
      1000 factorial bitCount -> 3788
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1634
     "
13914
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1635
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  1636
    "Modified (comment): / 09-01-2012 / 19:51:00 / cg"
11492
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1637
!
4532fa5c3224 +bitCount
Claus Gittinger <cg@exept.de>
parents: 11491
diff changeset
  1638
11504
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1639
bitIndicesOfOneBitsDo:aBlock
11505
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1640
    "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
  1641
     The index for the least significant bit is 1."
11504
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1642
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1643
    1 to:self digitLength do:[:i8 |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1644
        |byte|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1645
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1646
        byte := self digitAt:i8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1647
        byte ~~ 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1648
            1 to:8 do:[:i |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1649
                (byte bitAt:i) == 1 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1650
                    aBlock value:(((i8-1)*8) + i).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1651
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1652
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1653
        ]
11504
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1654
    ].
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1655
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1656
    "
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1657
     1 bitIndicesOfOneBitsDo:[:i | Transcript showCR:i].
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1658
     2 bitIndicesOfOneBitsDo:[:i | Transcript showCR:i]
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1659
     4 bitIndicesOfOneBitsDo:[:i | Transcript showCR:i]
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1660
     12 bitIndicesOfOneBitsDo:[:i | Transcript showCR:i]
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1661
     127 bitIndicesOfOneBitsDo:[:i | Transcript showCR:i]
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1662
    "
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1663
!
70b4d447e172 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11499
diff changeset
  1664
11505
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1665
bitIndicesOfOneBitsReverseDo:aBlock
13367
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1666
    "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
  1667
     and ending with the lowest bit.
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1668
     The index for the least significant bit is 1."
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1669
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1670
    self digitLength downTo:1 do:[:i8 |
13367
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1671
        |byte|
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1672
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1673
        byte := self digitAt:i8.
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1674
        byte ~~ 0 ifTrue:[
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1675
            8 downTo:1 do:[:i |
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1676
                (byte bitAt:i) == 1 ifTrue:[
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1677
                    aBlock value:(((i8-1)*8) + i).
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1678
                ].
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1679
            ].
fa81e6298411 comment/format in: #bitIndicesOfOneBitsReverseDo:
Stefan Vogel <sv@exept.de>
parents: 13023
diff changeset
  1680
        ]
11505
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1681
    ].
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1682
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1683
    "
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1684
     1 bitIndicesOfOneBitsReverseDo:[:i | Transcript showCR:i].
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1685
     2 bitIndicesOfOneBitsReverseDo:[:i | Transcript showCR:i]
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1686
     4 bitIndicesOfOneBitsReverseDo:[:i | Transcript showCR:i]
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1687
     12 bitIndicesOfOneBitsReverseDo:[:i | Transcript showCR:i]
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1688
     127 bitIndicesOfOneBitsReverseDo:[:i | Transcript showCR:i]
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1689
    "
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1690
!
8fab7b8377fe *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11504
diff changeset
  1691
3455
2b19e1e70adc added bitInvert for LargeIntegers (positive only)
Claus Gittinger <cg@exept.de>
parents: 3395
diff changeset
  1692
bitInvert
2b19e1e70adc added bitInvert for LargeIntegers (positive only)
Claus Gittinger <cg@exept.de>
parents: 3395
diff changeset
  1693
    "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
  1694
     This does not really make sense for negative largeIntegers,
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  1695
     since the digits are stored as absolute value.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  1696
     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
  1697
4614
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1698
"/    ^ -1 - self
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
    |n      "{ Class: SmallInteger }"
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1701
     byte   "{ Class: SmallInteger }"
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1702
     result|
4614
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1703
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1704
    n := self digitLength.
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1705
    result := self class basicNew numberOfDigits:n.
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1706
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1707
    1 to:n do:[:index |
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  1708
        byte := self digitAt:index.
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1709
        byte := byte bitInvert bitAnd:16rFF.
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1710
        result digitAt:index put:byte.
4614
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1711
    ].
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1712
    (byte == 0 or:[n <= SmallInteger maxBytes]) ifTrue:[
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1713
        "if last byte is zero we can normalize"
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  1714
        ^ result compressed
4614
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1715
    ].
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1716
    ^ result
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1717
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1718
     "
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  1719
      16rff bitInvert bitAnd:16rff
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1720
      16rffffffff bitInvert
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1721
      16rff00ff00 bitInvert hexPrintString
4614
14d5ce4bf117 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4611
diff changeset
  1722
     "
3455
2b19e1e70adc added bitInvert for LargeIntegers (positive only)
Claus Gittinger <cg@exept.de>
parents: 3395
diff changeset
  1723
!
2b19e1e70adc added bitInvert for LargeIntegers (positive only)
Claus Gittinger <cg@exept.de>
parents: 3395
diff changeset
  1724
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1725
bitOr:aMaskInteger
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1726
    "return the bitwise-or of the receiver and the argument, anInteger.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1727
     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
  1728
     the receiver and the argument."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1729
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1730
    |n "{ Class: SmallInteger }"
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1731
     result byte|
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1732
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1733
    aMaskInteger isInteger ifFalse:[
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1734
        ^ aMaskInteger bitOrFromInteger:self.
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1735
    ].
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1736
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1737
    n := (aMaskInteger digitLength) max:(self digitLength).
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1738
    result := self class basicNew numberOfDigits:n.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1739
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1740
    1 to:n do:[:index |
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1741
        byte := (aMaskInteger digitAt:index) bitOr:(self digitAt:index).
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1742
        result digitAt:index put:byte.
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1743
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1744
"/ no need to normalize - if the operands were correct
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1745
"/    byte == 0 ifTrue:[
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1746
"/        ^ result normalize
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1747
"/    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1748
    ^ result
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1749
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1750
85
claus
parents: 77
diff changeset
  1751
bitShift:shiftCount
claus
parents: 77
diff changeset
  1752
    "return the value of the receiver shifted by shiftCount bits;
claus
parents: 77
diff changeset
  1753
     leftShift if shiftCount > 0; rightShift otherwise.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1754
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1755
     Notice: the result of bitShift: on negative receivers is not
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1756
             defined in the language standard (since the implementation
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1757
             is free to choose any internal representation for integers)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1758
             However, ST/X preserves the sign."
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1759
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1760
    |result
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1761
     prev       "{ Class: SmallInteger }"
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1762
     next       "{ Class: SmallInteger }"
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1763
     byte       "{ Class: SmallInteger }"
359
claus
parents: 357
diff changeset
  1764
     byte2      "{ Class: SmallInteger }"
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1765
     bitShift   "{ Class: SmallInteger }"
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1766
     revShift   "{ Class: SmallInteger }"
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1767
     digitShift "{ Class: SmallInteger }"
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1768
     n          "{ Class: SmallInteger }"
3044
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
  1769
     nn         "{ Class: SmallInteger }"
a0bbac91639b *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3036
diff changeset
  1770
     nDigits    "{ Class: SmallInteger }" |
85
claus
parents: 77
diff changeset
  1771
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1772
    shiftCount isInteger ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1773
        ^ shiftCount bitShiftFromInteger:self.
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1774
    ].
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1775
85
claus
parents: 77
diff changeset
  1776
    shiftCount > 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1777
        "left shift"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1778
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1779
        digitShift := shiftCount // 8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1780
        bitShift := shiftCount \\ 8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1781
        n := self digitLength.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1782
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1783
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1784
         modulo 8 shifts can be done faster ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1785
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1786
        bitShift == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1787
            n := n + digitShift.
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1788
            result := self class basicNew numberOfDigits:n sign:self sign.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1789
            result digitBytes replaceFrom:(digitShift + 1) to:n with:self digitBytes.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1790
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1791
             no normalize needed, since receiver was already normalized
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1792
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1793
            ^ result
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1794
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1795
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
         less-than-8 shifts can be done faster ...
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
        digitShift == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1800
            nn := n+1.
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1801
            result := self class basicNew numberOfDigits:nn sign:self sign.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1802
            prev := 0.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1803
            1 to:n do:[:index |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1804
                byte := self digitAt:index.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1805
                byte := (byte bitShift:bitShift) bitOr:prev.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1806
                result digitAt:index put:(byte bitAnd:16rFF).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1807
                prev := byte bitShift:-8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1808
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1809
            result digitAt:nn put:prev.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1810
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1811
             might have stored a 0-byte ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1812
            "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1813
            prev == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1814
                ^ result compressed
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1815
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1816
            ^ result.
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
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1819
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1820
         slow case ...
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
        n := n + digitShift + 1.
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1823
        result := self class basicNew numberOfDigits:n sign:self sign.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1824
        byte := self digitAt:1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1825
        byte := (byte bitShift:bitShift) bitAnd:16rFF.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1826
        result digitAt:(digitShift + 1) put:byte.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1827
        revShift := -8 + bitShift.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1828
        nDigits := self digitLength.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1829
        2 to:nDigits do:[:index |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1830
            byte := self digitAt:index.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1831
            byte2 := self digitAt:index-1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1832
            byte := byte bitShift:bitShift.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1833
            byte2 := byte2 bitShift:revShift.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1834
            byte := (byte bitOr:byte2) bitAnd:16rFF.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1835
            result digitAt:(index + digitShift) put:byte.
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
        byte2 := self digitAt:nDigits.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1838
        byte2 := (byte2 bitShift:revShift) bitAnd:16rFF.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1839
        result digitAt:(nDigits + digitShift + 1) put:byte2.
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
         might have stored a 0-byte ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1842
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1843
        byte2 == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1844
            ^ result compressed
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1845
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1846
        ^ result
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1847
    ].
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1848
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1849
    shiftCount < 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1850
        "right shift"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1851
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1852
        digitShift := shiftCount negated // 8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1853
        bitShift := shiftCount negated \\ 8.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1854
        n := self digitLength.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1855
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1856
        digitShift >= n ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1857
            ^ 0
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1858
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1859
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1860
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1861
         modulo 8 shifts can be done faster ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1862
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1863
        bitShift == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1864
            n := n-digitShift.
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1865
            result := self class basicNew numberOfDigits:n sign:self sign.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1866
            result digitBytes replaceFrom:1 to:n with:self digitBytes startingAt:(digitShift + 1) .
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1867
            n <= SmallInteger maxBytes ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1868
                ^ result compressed
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1869
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1870
            ^ result
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
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1874
         less-than-8 shifts can be done faster ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1875
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1876
        digitShift == 0 ifTrue:[
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1877
            result := self class basicNew numberOfDigits:n sign:self sign.
15559
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
            n to:1 by:-1 do:[:index |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1882
                byte := self digitAt:index.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1883
                next := (byte bitShift:revShift) bitAnd:16rFF.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1884
                byte := (byte bitShift:bitShift) bitOr:prev.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1885
                result digitAt:index put:(byte bitAnd:16rFF).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1886
                prev := next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1887
            ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1888
            ^ result compressed
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1889
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1890
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1891
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1892
         slow case ...
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1893
        "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1894
        nn := n-digitShift.
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  1895
        result := self class basicNew numberOfDigits:nn sign:self sign.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1896
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1897
        prev := 0.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1898
        bitShift := bitShift negated.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1899
        revShift := 8 + bitShift.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1900
        nn := digitShift + 1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1901
        n to:nn by:-1 do:[:index |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1902
            byte := self digitAt:index.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1903
            next := (byte bitShift:revShift) bitAnd:16rFF.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1904
            byte := (byte bitShift:bitShift) bitOr:prev.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1905
            result digitAt:(index - digitShift) put:byte.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1906
            prev := next.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1907
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1908
        "the last stored byte ..."
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1909
        ^ result compressed
85
claus
parents: 77
diff changeset
  1910
    ].
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1911
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  1912
    ^ self "no shift"
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  1913
3638
edf314b220d2 fixed #bitShift: (right)
Claus Gittinger <cg@exept.de>
parents: 3455
diff changeset
  1914
    "Modified: / 8.7.1998 / 12:45:24 / cg"
4151
6d6971c27567 Some speedups.
Stefan Vogel <sv@exept.de>
parents: 4142
diff changeset
  1915
    "Modified: / 5.5.1999 / 16:05:05 / stefan"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1916
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1917
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1918
bitTest:aMaskInteger
5782
dcc037e5bdbf comment change
Claus Gittinger <cg@exept.de>
parents: 5496
diff changeset
  1919
    "return true, if any bit from aMask is set in the receiver.
dcc037e5bdbf comment change
Claus Gittinger <cg@exept.de>
parents: 5496
diff changeset
  1920
     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
  1921
     is non-0, false otherwise.
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1922
     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
  1923
     the receiver and the argument."
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1924
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1925
    |n "{ Class: SmallInteger }"
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  1926
     byte|
1407
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1927
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1928
    n := (aMaskInteger digitLength) min:(self digitLength).
1407
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1929
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1930
    1 to:n do:[:index |
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  1931
        byte := (aMaskInteger digitAt:index) bitAnd:(self digitAt:index).
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1932
        byte ~~ 0 ifTrue:[^ true].
1407
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1933
    ].
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1934
    ^ false
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1935
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1936
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1937
     16r112233445566778899 bitTest:16rFF
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1938
     16r112233445566778800 bitTest:16rFF
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1939
     16r112233445566778899 bitTest:16rFFFFFFFFFFFFFFFF00
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1940
     16r112233445566778899 bitTest:16rFF0000000000000000
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1941
     16r112233445566778899 bitTest:16r00000000000000FFFF
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1942
     16r1234567800000000 bitTest:16r8000000000000000
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1943
     16r8765432100000000 bitTest:16r8000000000000000
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1944
     16r12345678 bitTest:16r80000000
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1945
     16r87654321 bitTest:16r80000000
1407
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1946
    "
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1947
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  1948
    "Modified: / 6.6.1999 / 15:10:33 / cg"
1407
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1949
!
6c278dcd5570 added #bitTest: for general integers
Claus Gittinger <cg@exept.de>
parents: 1337
diff changeset
  1950
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1951
bitXor:anInteger
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1952
    "return the bitwise-or of the receiver and the argument, anInteger.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1953
     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
  1954
     the receiver and the argument."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1955
927
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1956
    |n "{ Class: SmallInteger }"
8d8edf9df0ae fixed \\ vs. rem: and // vs. quo: stupidities;
Claus Gittinger <cg@exept.de>
parents: 701
diff changeset
  1957
     result byte|
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1958
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1959
    anInteger isInteger ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1960
        ^ anInteger bitXorFromInteger:self.
6358
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1961
    ].
706234560a0b allow double dispatch for bit* operations
Claus Gittinger <cg@exept.de>
parents: 6249
diff changeset
  1962
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1963
    n := (anInteger digitLength) max:(self digitLength).
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1964
    result := self class basicNew numberOfDigits:n.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1965
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1966
    1 to:n do:[:index |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1967
        byte := (anInteger digitAt:index) bitXor:(self digitAt:index).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1968
        result digitAt:index put:byte.
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1969
    ].
3993
a5a09b2d36cd oops - bitXor: did not always compress the result.
Claus Gittinger <cg@exept.de>
parents: 3908
diff changeset
  1970
    (byte == 0 or:[n <= SmallInteger maxBytes]) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  1971
        ^ result compressed
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1972
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1973
    ^ result
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1974
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1975
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1976
     (16r112233445566778899 bitXor:16rFF                ) printStringRadix:16 '112233445566778866'
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1977
     (16r112233445566778899 bitXor:16rFFFFFFFFFFFFFFFF00) printStringRadix:16 'EEDDCCBBAA99887799'
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1978
     (16r112233445566778899 bitXor:16rFF0000000000000000) printStringRadix:16 'EE2233445566778899'
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1979
     (16r112233445566778899 bitXor:16r112233445566778800) printStringRadix:16
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  1980
    "
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  1981
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  1982
    "Modified: 5.11.1996 / 14:06:40 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1983
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1984
5210
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1985
changeBit:index to:aBooleanOrNumber
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1986
    "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
  1987
     depending on aBooleanOrNumber.
5210
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1988
     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
  1989
     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
  1990
     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
  1991
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1992
    (aBooleanOrNumber == 0 or:[aBooleanOrNumber == false]) ifTrue:[
12670
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  1993
        ^ self clearBit:index
5210
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1994
    ].
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1995
    ^ self setBit:index
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1996
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  1997
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1998
     (16r3fffffff changeBit:31 to:1) hexPrintString
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  1999
     (16r3fffffff asLargeInteger setBit:31) hexPrintString
5210
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  2000
    "
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  2001
!
f56e448396f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5209
diff changeset
  2002
12670
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2003
changeMask:mask to:aBooleanOrNumber
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2004
    "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
  2005
     depending on aBooleanOrNumber.
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2006
     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
  2007
     but a new number is returned. Should be named #withMask:changedTo:"
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2008
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2009
    (aBooleanOrNumber == 0 or:[aBooleanOrNumber == false]) ifTrue:[
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2010
        ^ self bitClear:mask
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2011
    ].
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2012
    ^ self bitOr:mask
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2013
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2014
    "
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2015
     (16r3fffffff changeMask:16r80 to:0) hexPrintString 
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2016
     (16r3fff0000 changeMask:16r80 to:1) hexPrintString
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2017
    "
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2018
!
0e449ea30526 added: #changeMask:to:
Claus Gittinger <cg@exept.de>
parents: 12652
diff changeset
  2019
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2020
clearBit:index
8937
4f2508548327 comment
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2021
    "return a new integer where the specified bit is off.
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2022
     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
  2023
     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
  2024
     but a new number is returned. Should be named #withBitCleared:"
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2025
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2026
    |n         "{ Class: SmallInteger }"
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2027
     byteIndex "{ Class: SmallInteger }"
8937
4f2508548327 comment
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2028
     bitIndex  "{ Class: SmallInteger }"
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2029
     result byte|
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2030
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2031
    index <= 0 ifTrue:[
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2032
        ^ SubscriptOutOfBoundsSignal
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2033
                raiseRequestWith:index
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2034
                errorString:'bit index out of bounds'
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2035
    ].
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2036
    byteIndex := ((index - 1) // 8) + 1.
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2037
    n := self digitLength.
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2038
    byteIndex > n ifTrue:[
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2039
        ^ self
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2040
    ].
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2041
9057
13bd29f579c6 Bug 343: #clearBit: changed the receiver (shouldn't do that).
Stefan Vogel <sv@exept.de>
parents: 8937
diff changeset
  2042
    result := self simpleDeepCopy.
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2043
    bitIndex := ((index - 1) \\ 8) + 1.
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2044
    byte := (result digitAt:byteIndex) clearBit:bitIndex.
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2045
    result digitAt:byteIndex put:byte.
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2046
    (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
  2047
        ^ result compressed
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2048
    ].
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2049
    ^ result
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2050
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2051
    "
9057
13bd29f579c6 Bug 343: #clearBit: changed the receiver (shouldn't do that).
Stefan Vogel <sv@exept.de>
parents: 8937
diff changeset
  2052
     3111111111 clearBit:1
3683
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2053
    "
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2054
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2055
    "Modified: / 28.7.1998 / 18:35:50 / cg"
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2056
!
2eac599d04c1 fixed clearBit:
Claus Gittinger <cg@exept.de>
parents: 3639
diff changeset
  2057
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2058
even
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2059
    "return true if the receiver is even"
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2060
9401
65f884297c68 speed up #even and #odd
Stefan Vogel <sv@exept.de>
parents: 9316
diff changeset
  2061
    ^ (self bitAt:1) == 0
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2062
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2063
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2064
     16r112233445566778899 even
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2065
     16r112233445566778800 even
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2066
     1 even
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2067
     2 even
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2068
    "
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2069
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2070
    "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
  2071
!
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2072
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2073
highBit
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2074
    "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
  2075
     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
  2076
     Returns 0 if no bit is set."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2077
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2078
    |byteNr highByte|
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2079
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2080
    byteNr := self digitLength.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2081
    byteNr == 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2082
        ^ 0
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2083
    ].
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2084
    highByte := self digitAt:byteNr.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2085
    ^ (byteNr - 1) * 8 + highByte highBit
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2086
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2087
    "
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2088
     0 highBit
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2089
     -1 highBit
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2090
     (1 bitShift:1) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2091
     (1 bitShift:30) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2092
     (1 bitShift:31) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2093
     (1 bitShift:32) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2094
     (1 bitShift:33) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2095
     (1 bitShift:64) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2096
     (1 bitShift:1000) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2097
     (1 bitShift:1000) negated highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2098
     ((1 bitShift:64)-1) highBit
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2099
    "
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2100
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2101
    "Modified: / 3.5.1999 / 09:20:57 / stefan"
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2102
!
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2103
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2104
invertBit:index
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2105
    "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
  2106
     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
  2107
     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
  2108
     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
  2109
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2110
    index <= 0 ifTrue:[
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2111
        ^ SubscriptOutOfBoundsSignal
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2112
                raiseRequestWith:index
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2113
                errorString:'index out of bounds'
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2114
    ].
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2115
    ^ self bitXor:(1 bitShift:index-1)
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2116
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2117
    "
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2118
     0 invertBit:3         => 4 (2r100)
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2119
     0 invertBit:48        => 140737488355328 (2r1000.....000)
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2120
     ((0 invertBit:99) invertBit:100) printStringRadix:2
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2121
    "
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2122
!
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2123
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2124
isBitSet:index
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2125
    "return true if the index' bit is set; false otherwise.
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2126
     Bits are counted from 1 starting with the least significant."
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2127
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2128
    ^ (self bitAt:index) ~~ 0
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2129
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2130
    "
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2131
     5 isBitSet:3       => true
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2132
     2r0101 isBitSet:2  => false
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2133
     2r0101 isBitSet:1  => true
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2134
     2r0101 isBitSet:0  index error
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2135
    "
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2136
!
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2137
16071
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2138
leftShift:shiftCount
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2139
    "return the value of the receiver shifted left by shiftCount bits;
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2140
     leftShift if shiftCount > 0; rightShift otherwise.
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2141
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2142
     Notice: the result of bitShift: on negative receivers is not
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2143
             defined in the language standard (since the implementation
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2144
             is free to choose any internal representation for integers)
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2145
             However, ST/X preserves the sign."
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2146
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2147
    ^ self bitShift:shiftCount
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2148
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2149
    "
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2150
     16r100000000 leftShift:1
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2151
     16r100000000 negated leftShift:1
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2152
    "
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2153
!
52286691aad5 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16040
diff changeset
  2154
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2155
lowBit
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2156
    "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
  2157
     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
  2158
     Returns 0 if no bit is set."
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2159
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2160
    |maxBytes "{ Class: SmallInteger }"
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2161
     byte|
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2162
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2163
    maxBytes := self digitLength.
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2164
    1 to:maxBytes do:[:byteIndex |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2165
        byte := self digitAt:byteIndex.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2166
        byte ~~ 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2167
            ^ (byteIndex-1)*8 + (byte lowBit)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2168
        ].
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2169
    ].
6480
4ff7f2af25fc lowBit now returns 0 if no bit is set.
Claus Gittinger <cg@exept.de>
parents: 6358
diff changeset
  2170
    ^ 0 "/ should not happen
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2171
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2172
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2173
     0 lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2174
     1 lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2175
     (1 bitShift:1) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2176
     (1 bitShift:1) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2177
     (1 bitShift:30) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2178
     (1 bitShift:30) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2179
     (1 bitShift:31) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2180
     (1 bitShift:31) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2181
     (1 bitShift:32) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2182
     (1 bitShift:32) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2183
     (1 bitShift:33) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2184
     (1 bitShift:33) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2185
     (1 bitShift:64) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2186
     (1 bitShift:64) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2187
     (1 bitShift:1000) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2188
     (1 bitShift:1000) highBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2189
     ((1 bitShift:64)-1) lowBit
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2190
     ((1 bitShift:64)-1) highBit
2429
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2191
    "
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2192
1aeeadaa162e added #lowBit
Claus Gittinger <cg@exept.de>
parents: 2428
diff changeset
  2193
    "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
  2194
!
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2195
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2196
noMask:aMaskInteger
4643
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  2197
    "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
  2198
17248
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2199
    ^ (self bitAnd:aMaskInteger) == 0
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2200
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2201
    "
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2202
     2r00001111 noMask:2r00000001
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2203
     2r00001111 noMask:2r11110000
bfcd59da8904 class: Integer
Claus Gittinger <cg@exept.de>
parents: 17037
diff changeset
  2204
    "
4643
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  2205
!
48ee5b949c81 moved anyMask, allMask ... from SmallInteger.
Claus Gittinger <cg@exept.de>
parents: 4614
diff changeset
  2206
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2207
odd
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2208
    "return true if the receiver is odd"
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2209
9401
65f884297c68 speed up #even and #odd
Stefan Vogel <sv@exept.de>
parents: 9316
diff changeset
  2210
    ^ (self bitAt:1) == 1
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2211
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2212
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2213
     16r112233445566778899 odd
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2214
     16r112233445566778800 odd
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2215
     1 odd
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2216
     2 odd
4278
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2217
    "
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2218
78c34fcd9952 added #odd and #even for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 4169
diff changeset
  2219
    "Created: / 6.6.1999 / 15:00:55 / cg"
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2220
!
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2221
7155
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2222
rightShift:shiftCount
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2223
    "return the value of the receiver shifted right by shiftCount bits;
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2224
     rightShift if shiftCount > 0; leftShift otherwise.
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2225
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2226
     Notice: the result of bitShift: on negative receivers is not
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2227
             defined in the language standard (since the implementation
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2228
             is free to choose any internal representation for integers)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2229
             However, ST/X preserves the sign."
7155
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2230
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2231
    ^ self bitShift:(shiftCount negated)
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2232
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2233
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2234
     16r100000000 rightShift:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2235
     16r100000000 negated rightShift:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2236
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2237
     16r100000000 rightShift:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2238
     16r100000000 negated rightShift:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2239
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2240
     16r100000000 rightShift:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2241
     16r100000000 negated rightShift:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2242
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2243
     ((16r100000000 rightShift:1) rightShift:1) rightShift:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2244
     ((16r100000000 negated rightShift:1) rightShift:1) rightShift:1
7155
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2245
    "
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2246
!
8112e11f850a +rightShift:
Claus Gittinger <cg@exept.de>
parents: 7093
diff changeset
  2247
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2248
setBit:index
8937
4f2508548327 comment
Claus Gittinger <cg@exept.de>
parents: 8913
diff changeset
  2249
    "return a new integer, where the specified bit is on.
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2250
     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
  2251
     The method's name may be misleading: the receiver is not changed,
11499
fa02ab9a83f0 comment
Claus Gittinger <cg@exept.de>
parents: 11496
diff changeset
  2252
     but a new number is returned. Should be named #withBitSet:"
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2253
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2254
    index <= 0 ifTrue:[
14404
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2255
        ^ SubscriptOutOfBoundsSignal
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2256
                raiseRequestWith:index
49a54ea47bf8 comment/format in:5 methods
Claus Gittinger <cg@exept.de>
parents: 14403
diff changeset
  2257
                errorString:'index out of bounds'
5496
338c81a04468 index bounds in bit operations;
Claus Gittinger <cg@exept.de>
parents: 5469
diff changeset
  2258
    ].
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2259
    ^ self bitOr:(1 bitShift:index-1)
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2260
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2261
    "
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2262
     0 setBit:3         => 4 (2r100)
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2263
     0 setBit:48        => 140737488355328 (2r1000.....000)
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2264
     ((0 setBit:99) setBit:100) printStringRadix:2
5209
3a52e2f97ec4 setBit/clearBit.
Claus Gittinger <cg@exept.de>
parents: 5186
diff changeset
  2265
    "
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2266
! !
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2267
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2268
!Integer methodsFor:'byte access'!
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2269
12784
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2270
byteAt:anIndex
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2271
    "compatibility with ByteArrays etc."
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2272
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2273
    ^ self digitAt:anIndex
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2274
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2275
    "
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2276
        12345678 byteAt:2
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2277
        12345678 digitBytes at:2
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2278
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2279
        -12345678 byteAt:2
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2280
        -12345678 digitBytes at:2
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2281
    "
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2282
!
3bc5946ade11 added: #byteAt:
Stefan Vogel <sv@exept.de>
parents: 12670
diff changeset
  2283
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2284
digitByteLength
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2285
    "return the number bytes required for a 2's complement
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2286
     binary representation of this Integer.
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2287
     For positive receivers, thats the same as the digitLength."
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2288
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2289
    "
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2290
     check if there is a 0-byte ...
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2291
     this allows to ask unnormalized LargeIntegers
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2292
     for their digitLength
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2293
    "
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2294
    |l "{ Class: SmallInteger }" |
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2295
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2296
    self >= 0 ifTrue:[^ self digitLength].
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2297
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2298
    l := self negated digitLength.
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2299
    (self digitByteAt:l) == 16rFF ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2300
        ^ (l - 1) max:1
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2301
    ].
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2302
    ^ l
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2303
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2304
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2305
     -129 digitByteLength
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2306
    "
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2307
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2308
    "Created: / 25.10.1998 / 14:58:09 / cg"
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2309
    "Modified: / 25.10.1998 / 19:20:33 / cg"
10488
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2310
!
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2311
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2312
digitBytes
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2313
    "return a byteArray filled with the receivers bits
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2314
     (8 bits of the absolute value per element),
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2315
     least significant byte is first"
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2316
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2317
    ^ self subclassResponsibility
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2318
!
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2319
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2320
digitBytesMSB
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2321
    "return a byteArray filled with the receivers bits
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2322
     (8 bits of the absolute value per element),
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2323
     most significant byte is first"
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2324
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2325
    ^ self subclassResponsibility
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2326
!
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2327
10488
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2328
digitBytesMSB:msbFlag
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2329
    "return a byteArray filled with the receivers bits
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2330
     (8 bits of the absolute value per element),
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2331
     if msbflag = true, most significant byte is first,
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2332
     otherwise least significant byte is first"
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2333
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2334
    msbFlag ifTrue:[
15567
7f314ee34dfb new: #digitBytesMSB
Stefan Vogel <sv@exept.de>
parents: 15559
diff changeset
  2335
        ^ self digitBytesMSB.
10488
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2336
    ].
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2337
    ^ self digitBytes
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2338
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2339
    "
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2340
      16r12 digitBytesMSB:true
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2341
      16r1234 digitBytesMSB:true
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2342
      16r1234 digitBytesMSB:false
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2343
      16r12345678 digitBytesMSB:true
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2344
      16r12345678 digitBytesMSB:false
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  2345
    "
14166
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2346
!
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2347
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2348
swapBytes
16886
247352d5de0f class: Integer
Stefan Vogel <sv@exept.de>
parents: 16884
diff changeset
  2349
    "swap bytes pair-wise in a positive integer
247352d5de0f class: Integer
Stefan Vogel <sv@exept.de>
parents: 16884
diff changeset
  2350
     i.e. a.b.c.d -> b.a.d.c
247352d5de0f class: Integer
Stefan Vogel <sv@exept.de>
parents: 16884
diff changeset
  2351
     Swapping of negative integers is undefined and therefore not supported."
16884
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2352
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2353
    |digitBytes|
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2354
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2355
    self negative ifTrue:[
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2356
        RangeError raiseWith:self errorString:'negative numbers are not supported in #swapBytes'.
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2357
    ].
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2358
    digitBytes := self digitBytes.
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2359
    digitBytes size odd ifTrue:[
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2360
        "ByteArray<<#swapBytes needs even number of bytes.
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2361
         Add 0 to the most significant position (the end)"
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2362
        digitBytes := digitBytes copyWith:0.
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2363
        
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2364
    ].
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2365
    ^ (LargeInteger digitBytes:digitBytes swapBytes) compressed
14166
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2366
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2367
    "
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2368
        16rFFEE2211 swapBytes hexPrintString
16884
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2369
        16rFFEEAA2211 swapBytes hexPrintString
16874
0fbfe9ca3f3c class: Integer
Stefan Vogel <sv@exept.de>
parents: 16800
diff changeset
  2370
        16r2211 swapBytes hexPrintString
16884
1d8ce66b2547 class: Integer
Stefan Vogel <sv@exept.de>
parents: 16874
diff changeset
  2371
        16rFF3FFFFF swapBytes
16874
0fbfe9ca3f3c class: Integer
Stefan Vogel <sv@exept.de>
parents: 16800
diff changeset
  2372
        self assert:(SmallInteger maxVal swapBytes swapBytes == SmallInteger maxVal)
14166
ea350ed3d6a9 added: #swapBytes
Stefan Vogel <sv@exept.de>
parents: 14098
diff changeset
  2373
    "
3890
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2374
! !
a024811ed304 added #digitByteLength
Claus Gittinger <cg@exept.de>
parents: 3884
diff changeset
  2375
5238
f7a816a660a3 categories
Claus Gittinger <cg@exept.de>
parents: 5210
diff changeset
  2376
!Integer methodsFor:'coercing & converting'!
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2377
1888
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2378
asFixedPoint
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2379
    "return the receiver as a fixedPoint number"
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2380
6640
2de8925ad2cd fixed asFixedPoint (did return int due to reduce).
Claus Gittinger <cg@exept.de>
parents: 6639
diff changeset
  2381
    ^ FixedPoint basicNew
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2382
        setNumerator:self denominator:1 scale:1
1888
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2383
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2384
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2385
     100 asFixedPoint
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2386
     100 asFixedPoint + 0.1 asFixedPoint
1888
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2387
    "
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2388
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2389
    "Modified: 5.11.1996 / 15:13:17 / cg"
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2390
!
463d49ca22e3 fixedPoint support
Claus Gittinger <cg@exept.de>
parents: 1883
diff changeset
  2391
2141
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2392
asFixedPoint:scale
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2393
    "return the receiver as fixedPoint number, with the given number
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2394
     of post-decimal-point digits."
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2395
6639
d88a51b081ae fixed asFixedPoint (did return int due to reduce).
Claus Gittinger <cg@exept.de>
parents: 6635
diff changeset
  2396
    ^ FixedPoint basicNew
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2397
        setNumerator:self denominator:1 scale:scale
2141
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2398
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2399
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2400
     100 asFixedPoint:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2401
     100 asFixedPoint + (0.1 asFixedPoint:2)
2141
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2402
    "
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2403
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2404
    "Modified: 10.1.1997 / 20:00:08 / cg"
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2405
!
bba0027204fd added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 2133
diff changeset
  2406
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2407
asFloat
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2408
    "return a Float with same value as myself.
11240
4ce9c8fa3d37 comment
Claus Gittinger <cg@exept.de>
parents: 11223
diff changeset
  2409
     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
  2410
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2411
    ^ Float fromInteger:self
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2412
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2413
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2414
     1234567890 asFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2415
     1234567890 asFloat asInteger
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2416
     12345678901234567890 asFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2417
     12345678901234567890 asFloat asInteger
7444
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
!
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2420
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2421
asFraction
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2422
    "return a Fraction with same value as receiver"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2423
2794
862ee34a4821 when coercing an integer, do not reduce the result.
Claus Gittinger <cg@exept.de>
parents: 2793
diff changeset
  2424
    ^ 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
  2425
862ee34a4821 when coercing an integer, do not reduce the result.
Claus Gittinger <cg@exept.de>
parents: 2793
diff changeset
  2426
    "Modified: 28.7.1997 / 19:26:06 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2427
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2428
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2429
asInteger
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2430
    "return the receiver truncated towards zero -
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2431
     for integers this is self"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2432
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2433
    ^ self
1337
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2434
!
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2435
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2436
asLargeFloat
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2437
    "return a LargeFloat with same value as myself.
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2438
     Since largeFloats have a limited precision, you usually loose bits when
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2439
     doing this."
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
    ^ LargeFloat fromInteger:self
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2442
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2443
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2444
     1234567890 asLargeFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2445
     1234567890 asLargeFloat asInteger
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2446
     12345678901234567890 asLargeFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2447
     12345678901234567890 asLargeFloat asInteger
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2448
    "
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2449
!
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2450
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2451
asLongFloat
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2452
    "return a LongFloat with same value as myself.
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2453
     Since longFloats have a limited precision, you usually loose bits when
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2454
     doing this."
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2455
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2456
    ^ LongFloat fromInteger:self
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2457
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2458
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2459
     1234567890 asFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2460
     1234567890 asFloat asInteger
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2461
     12345678901234567890 asFloat
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2462
     12345678901234567890 asFloat asInteger
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2463
    "
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2464
!
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2465
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2466
asModuloNumber
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2467
    "return a precomputed modulo number"
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2468
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  2469
    ^ ModuloNumber modulus:self.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2470
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2471
    "Created: / 3.5.1999 / 14:48:03 / stefan"
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2472
!
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2473
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2474
asShortFloat
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2475
    "return a ShortFloat with same value as receiver"
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2476
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2477
    ^ ShortFloat fromInteger:self
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2478
!
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2479
14043
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2480
signExtended24BitValue
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2481
    "return a smallInteger from sign-extending the 24'th bit.
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2482
     May be useful for communication interfaces"
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2483
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2484
    ^ (self bitAnd:16rFFFFFF) signExtended24BitValue
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2485
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2486
    "Modified: / 07-05-1996 / 09:31:57 / cg"
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2487
    "Created: / 05-03-2012 / 14:37:55 / cg"
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2488
!
045fd447ab4d added: #signExtended24BitValue
Claus Gittinger <cg@exept.de>
parents: 13993
diff changeset
  2489
1337
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2490
signExtendedByteValue
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2491
    "return a smallInteger from sign-extending the 8'th bit.
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2492
     May be useful for communication interfaces"
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2493
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2494
    ^ (self bitAnd:16rFF) signExtendedByteValue
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2495
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2496
    "Created: 7.5.1996 / 09:31:52 / cg"
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2497
!
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2498
15084
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2499
signExtendedLongValue
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2500
    "return a smallInteger from sign-extending the 32'th bit.
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2501
     May be useful for communication interfaces"
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2502
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2503
    ^ (self bitAnd:16rFFFFFFFF) signExtendedLongValue
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2504
!
910b4913067b class: Integer
Claus Gittinger <cg@exept.de>
parents: 14967
diff changeset
  2505
1337
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2506
signExtendedShortValue
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2507
    "return a smallInteger from sign-extending the 16'th bit.
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2508
     May be useful for communication interfaces"
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2509
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2510
    ^ (self bitAnd:16rFFFF) signExtendedShortValue
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2511
e5e00eecd4c9 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
  2512
    "Modified: 7.5.1996 / 09:31:57 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2513
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2514
1976
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2515
!Integer methodsFor:'comparing'!
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2516
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2517
hash
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2518
    "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
  2519
3298
bf837fee7a15 Do not return negative hash values.
Stefan Vogel <sv@exept.de>
parents: 3188
diff changeset
  2520
    ^ self bitAnd:16r3FFFFFFF.
1976
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2521
3298
bf837fee7a15 Do not return negative hash values.
Stefan Vogel <sv@exept.de>
parents: 3188
diff changeset
  2522
    "
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2523
        -20000000000000 hash
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2524
         20000000000000 hash
3298
bf837fee7a15 Do not return negative hash values.
Stefan Vogel <sv@exept.de>
parents: 3188
diff changeset
  2525
    "
1976
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2526
3298
bf837fee7a15 Do not return negative hash values.
Stefan Vogel <sv@exept.de>
parents: 3188
diff changeset
  2527
    "Created: / 14.11.1996 / 12:12:27 / cg"
bf837fee7a15 Do not return negative hash values.
Stefan Vogel <sv@exept.de>
parents: 3188
diff changeset
  2528
    "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
  2529
! !
f6e7094cd3e4 Integer>>hash returns a value clamped to the SmallInteger range
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
  2530
16293
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  2531
12978
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2532
!Integer methodsFor:'dependents access'!
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2533
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2534
addDependent:anObject
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2535
    Transcript show:'*** trying to make dependent on an integer: '.
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2536
    thisContext sender printOn:Transcript. Transcript cr.
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2537
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2538
    "Created: / 28-07-2010 / 20:29:00 / cg"
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2539
! !
6899c32d29a9 added: #addDependent:
Claus Gittinger <cg@exept.de>
parents: 12976
diff changeset
  2540
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2541
!Integer methodsFor:'double dispatching'!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2542
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2543
differenceFromFraction:aFraction
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2544
    "sent when a fraction does not know how to subtract the receiver, an integer"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2545
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2546
    |d|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2547
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2548
    d := aFraction denominator.
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2549
    ^ aFraction class
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2550
        numerator:(aFraction numerator - (self * d))
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2551
        denominator:d
2793
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2552
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2553
    "Modified: 28.7.1997 / 19:08:30 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2554
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2555
11517
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2556
differenceFromTimestamp:aTimestamp
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2557
    "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
  2558
     before aTimestamp"
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2559
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2560
    ^ aTimestamp subtractSeconds:self.
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2561
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2562
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2563
     Timestamp now subtractSeconds:100
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2564
     100 differenceFromTimestamp:Timestamp now
11517
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2565
    "
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2566
!
e949ec17d9fc double dispatch for time-difference
sr
parents: 11510
diff changeset
  2567
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2568
equalFromFraction:aFraction
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2569
    "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
  2570
     if resulting from an arithmetic operation.
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2571
     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
  2572
     allows comparing unnormalized fractions as might appear within the fraction class"
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2573
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2574
    |denominator numerator|
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2575
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2576
    denominator := aFraction denominator.
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2577
    numerator := aFraction numerator.
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2578
    (denominator == 1) ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2579
        ^ numerator = (self * denominator)
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2580
    ].
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2581
    ^ numerator = self
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2582
!
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2583
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2584
productFromFraction:aFraction
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2585
    "sent when a fraction does not know how to multiply the receiver, an integer"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2586
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:(self * aFraction numerator)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2589
        denominator:aFraction denominator
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:27 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2592
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2593
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2594
quotientFromFraction:aFraction
7444
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2595
    "Return the quotient of the argument, aFraction and the receiver.
e228b1ba6d6a double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
  2596
     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
  2597
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2598
    ^ aFraction class
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2599
        numerator:aFraction numerator
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2600
        denominator:(self * aFraction denominator)
2793
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2601
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2602
    "Modified: 28.7.1997 / 19:08:23 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2603
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2604
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2605
sumFromFraction:aFraction
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2606
    "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
  2607
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2608
    |d|
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2609
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2610
    d := aFraction denominator.
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2611
    ^ aFraction class
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2612
        numerator:(aFraction numerator + (self * d))
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2613
        denominator:d
2793
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2614
e40dedf51177 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2745
diff changeset
  2615
    "Modified: 28.7.1997 / 19:08:11 / cg"
10681
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2616
!
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2617
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2618
sumFromTimestamp:aTimestamp
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2619
    "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
  2620
     after aTimestamp"
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2621
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2622
    ^ aTimestamp addSeconds:self.
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2623
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2624
    "
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2625
     Timestamp now addSeconds:100
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2626
     100 sumFromTimestamp:Timestamp now
835be355e638 adding timeDurations to a timeStamp (double dispatch)
sr
parents: 10488
diff changeset
  2627
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2628
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2629
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2630
!Integer methodsFor:'helpers'!
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2631
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2632
gcd_helper:anInteger
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2633
    "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
  2634
     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
  2635
     larger than the arg."
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2636
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2637
    | a b selfLowBit argLowBit shift t |
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2638
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2639
    a := self.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2640
    b := anInteger.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2641
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2642
    selfLowBit := a lowBit - 1.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2643
    argLowBit := b lowBit - 1.
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2644
    shift := selfLowBit min:argLowBit.
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2645
    b := b bitShift:(argLowBit negated).
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2646
    [a = 0] whileFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2647
        a := a bitShift:(selfLowBit negated).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2648
        a < b ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2649
            t := a. a := b. b := t
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2650
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2651
        a := a - b.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2652
        selfLowBit := a lowBit - 1.
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2653
    ].
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  2654
    ^ b bitShift:shift
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2655
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2656
    "Created: 1.3.1997 / 16:38:17 / cg"
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2657
    "Modified: 1.3.1997 / 16:45:17 / cg"
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2658
! !
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  2659
10027
36281068b212 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9401
diff changeset
  2660
12565
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2661
!Integer methodsFor:'iteration'!
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2662
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2663
to:stop collect:aBlock
16347
ac28cfa26ec2 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16293
diff changeset
  2664
    "syntactic sugar; same as (self to:stop) collect:aBlock"
12565
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2665
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2666
    |n a|
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2667
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2668
    n := stop - self + 1.
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2669
    a := Array new:n.
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2670
    self to:stop do:[:i |
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2671
        a at:(i-self+1) put:(aBlock value:i).
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2672
    ].
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2673
    ^ a.
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2674
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2675
    "
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2676
     1 to:10 collect:[:i | i squared]
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2677
     10 to:20 collect:[:i | i squared]  
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2678
     (10 to:20) collect:[:i | i squared]
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2679
    "
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2680
! !
11eea3f4ef0b added: #to:collect:
Claus Gittinger <cg@exept.de>
parents: 12480
diff changeset
  2681
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2682
!Integer methodsFor:'misc math'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2683
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2684
acker:n
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2685
    "return the value of acker(self, n).
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2686
      ;-) Do not try with receivers > 3"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2687
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2688
    (self == 0) ifTrue:[^ n + 1].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2689
    (n == 0) ifTrue:[^ (self - 1) acker: 1].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2690
    ^ (self - 1) acker:(self acker:(n - 1))
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2691
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2692
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2693
     3 acker:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2694
     3 acker:7
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2695
    "
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2696
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2697
    "Modified: 18.7.1996 / 13:08:16 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2698
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  2699
11491
4920830c3d9a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11486
diff changeset
  2700
binco:kIn
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2701
    "an alternative name for the binomial coefficient for squeak compatibility"
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2702
11491
4920830c3d9a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11486
diff changeset
  2703
    ^ self binomialCoefficient:kIn
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2704
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2705
    "Modified: / 17-08-2010 / 17:29:07 / cg"
11491
4920830c3d9a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11486
diff changeset
  2706
!
4920830c3d9a *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11486
diff changeset
  2707
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2708
binomialCoefficient:kIn
11486
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2709
    "The binomial coefficient
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2710
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2711
      / n \     with self being n, and 0 <= k <= n.
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2712
      \ k /
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2713
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2714
     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
  2715
     also known as a combination or combinatorial number.
11486
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2716
     Sometimes also called C(n,k) (for choose k from n)
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2717
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2718
     binCo is defined as:
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2719
        n!!
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2720
     ----------
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2721
     k!! (n-k)!!
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2722
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2723
     but there is a faster, recursive formula:
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2724
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2725
      / n \  = / n - 1 \  + / n - 1 \
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2726
      \ k /    \ k - 1 /    \   k   /
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2727
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2728
     with:
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2729
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2730
      / n \  = / n \  =  1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2731
      \ 0 /    \ n /
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2732
    "
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2733
11486
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2734
    |k acc|
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2735
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2736
    kIn > self ifTrue:[^ 0].
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2737
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2738
    k := kIn.
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2739
    k > (self / 2) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2740
        "/ symmetry
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2741
        k := self - k.
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2742
    ].
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2743
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2744
    acc := 1.
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2745
    1 to:k do:[:i |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2746
        acc := acc * (self - k + i) / i.
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2747
    ].
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2748
    ^ acc
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2749
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2750
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2751
     (7 binomialCoefficient:3)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2752
     (10 binomialCoefficient:5)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2753
     (100 binomialCoefficient:5)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2754
     (1000 binomialCoefficient:5)
11486
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2755
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2756
     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
  2757
     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
  2758
     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
  2759
     TestCase assert: (10000 binomialCoefficient:78) = (10000 factorial / (78 factorial * (10000-78) factorial))
11486
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2760
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2761
     Time millisecondsToRun:[ (10000 binomialCoefficient:78) ]                            -> 0
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2762
     Time millisecondsToRun:[ (10000 factorial / (78 factorial * (10000-78) factorial)) ] -> 437
6371ea09c6f0 comment
Claus Gittinger <cg@exept.de>
parents: 11485
diff changeset
  2763
11476
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2764
    "
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2765
!
bdf0c2c2ef09 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11464
diff changeset
  2766
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2767
divMod:aNumber
17037
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2768
    "return an array filled with 
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2769
        (self // aNumber) and (self \\ aNumber).
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2770
     The returned remainder has the same sign as aNumber.
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2771
     The following is always true:
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2772
        (receiver // something) * something + (receiver \\ something) = receiver
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2773
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2774
     Be careful with negative results: 9 // 4 -> 2, while -9 // 4 -> -3.
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2775
     Especially surprising:     
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2776
        -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
  2777
                        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
  2778
        -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
  2779
                        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
  2780
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2781
     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
  2782
     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
  2783
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2784
    ^ Array
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2785
        with:(self // aNumber)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2786
        with:(self \\ aNumber)
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2787
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2788
    "
17037
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2789
     10 divMod:3       -> #(3 1)   because 3*3 + 1 = 10
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2790
     10 divMod:-3      -> #(-4 -2) because -4*-3 + (-2) = 10
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2791
     -10 divMod:3      -> #(-4 2) because -4*-3 + 2 = -10   
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2792
     -10 divMod:-3     -> #(3 -1)  because -3*3 + (-1) = -10
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2793
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2794
     1000000000000000000000 divMod:3   -> #(333333333333333333333 1)
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2795
     1000000000000000000000 divMod:-3  -> #(-333333333333333333334 -2)
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2796
     -1000000000000000000000 divMod:3  -> #(-333333333333333333334 2)
5338279e3c58 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16886
diff changeset
  2797
     -1000000000000000000000 divMod:-3 -> #(333333333333333333333 -1)
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2798
     100 factorial divMod:103
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2799
    "
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2800
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2801
    "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
  2802
!
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2803
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2804
extendedEuclid:tb
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2805
    "return the solution of 'ax + by = gcd(a,b)'.
7356
fe8fb0a571f2 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7261
diff changeset
  2806
     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
  2807
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2808
    |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
  2809
5001
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  2810
    self < tb ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2811
        a := self.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2812
        b := tb.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2813
        swap := false.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2814
    ] ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2815
        a := tb.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2816
        b := self.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2817
        swap := true.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2818
    ].
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2819
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2820
    shift := ((a lowBit) min:(b lowBit))-1.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2821
    shift > 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2822
        tmp := shift negated.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2823
        a := a bitShift:tmp.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2824
        b := b bitShift:tmp.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2825
    ].
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2826
9057
13bd29f579c6 Bug 343: #clearBit: changed the receiver (shouldn't do that).
Stefan Vogel <sv@exept.de>
parents: 8937
diff changeset
  2827
    gcd  := a.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2828
    gcd1 := b.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2829
    u := 1.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2830
    u1 := 0.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2831
    v := 0.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2832
    v1 := 1.
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
    [
5001
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  2835
"/      The following condition is true:
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  2836
"/        (a * u1) + (b * v1) ~= gcd1 ifTrue:[self halt].
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2837
        t := gcd1 divMod:gcd.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2838
        gcd1 := gcd.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2839
        gcd := t at:2.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2840
        t := t at:1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2841
        tmp := v.
5003
304be9a3a226 Add some debug in #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 5001
diff changeset
  2842
"/v1 - (v * t) - v1 + (v * t) ~= 0 ifTrue:[self halt].
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2843
        v := v1 - (v * t).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2844
        v1 := tmp.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2845
        tmp := u.
5003
304be9a3a226 Add some debug in #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 5001
diff changeset
  2846
"/u1 - (u * t) - u1 + (u * t) ~= 0 ifTrue:[self halt].
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2847
        u := u1 - (u * t).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2848
        u1 := tmp.
9057
13bd29f579c6 Bug 343: #clearBit: changed the receiver (shouldn't do that).
Stefan Vogel <sv@exept.de>
parents: 8937
diff changeset
  2849
    gcd > 0] whileTrue.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2850
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2851
    shift > 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2852
        gcd1 := gcd1 bitShift:shift.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2853
    ].
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2854
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2855
    swap ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2856
        ^ Array with:v1 with:u1 with:gcd1.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2857
    ].
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2858
    ^ Array with:u1 with:v1 with:gcd1.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2859
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2860
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2861
    "
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2862
     14 extendedEuclid:5
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2863
     14 extendedEuclid:2
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2864
     25 extendedEuclid:15
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2865
    "
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2866
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2867
    "Created: / 27.4.1999 / 15:19:22 / stefan"
5001
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  2868
    "Modified: / 18.11.1999 / 16:19:24 / stefan"
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2869
!
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  2870
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2871
factorial
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2872
    "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
  2873
     This is slightly faster than the recursive algorithm, and does not
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2874
     suffer from stack overflow problems (with big receivers)"
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2875
2745
bdf76e380d27 errorString to DomainError
Claus Gittinger <cg@exept.de>
parents: 2458
diff changeset
  2876
    |p i|
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2877
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2878
    (self < 2) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2879
        self < 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2880
            "/
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2881
            "/ requested factorial of a negative number
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2882
            "/
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2883
            ^ self class
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2884
                raise:#domainErrorSignal
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2885
                receiver:self
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2886
                selector:#factorial
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2887
                arguments:#()
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2888
                errorString:'factorial of negative number'
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2889
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2890
        ^ 1
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  2891
    ].
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2892
    p := 2.
2745
bdf76e380d27 errorString to DomainError
Claus Gittinger <cg@exept.de>
parents: 2458
diff changeset
  2893
    i := 3.
bdf76e380d27 errorString to DomainError
Claus Gittinger <cg@exept.de>
parents: 2458
diff changeset
  2894
    [i <= self] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2895
        p := p * i.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2896
        i := i + 1.
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2897
    ].
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2898
    ^ p
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2899
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2900
    "
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2901
     10 factorial
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2902
     1000 factorial
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2903
     10000 factorial
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2904
     10000 factorialR
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2905
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2906
     Time millisecondsToRun:[2000 factorial]
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  2907
     Time millisecondsToRun:[2000 factorialR]
2745
bdf76e380d27 errorString to DomainError
Claus Gittinger <cg@exept.de>
parents: 2458
diff changeset
  2908
     -1 factorial
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2909
    "
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2910
10027
36281068b212 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 9401
diff changeset
  2911
    "Modified: / 04-10-2006 / 14:31:12 / cg"
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2912
!
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2913
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2914
factorialR
3908
b893f399f517 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3890
diff changeset
  2915
    "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
  2916
3908
b893f399f517 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3890
diff changeset
  2917
     This is included to demonstration purposes - if you really need
b893f399f517 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3890
diff changeset
  2918
     factorial numbers, use the iterative #factorial, which is slightly
b893f399f517 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3890
diff changeset
  2919
     faster and does not suffer from stack overflow problems (with big receivers)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2920
356
claus
parents: 345
diff changeset
  2921
    (self >= 2) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2922
        ^ self * (self - 1) factorialR
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2923
    ].
356
claus
parents: 345
diff changeset
  2924
    ^ 1
212
3edd10edefaf *** empty log message ***
claus
parents: 202
diff changeset
  2925
3edd10edefaf *** empty log message ***
claus
parents: 202
diff changeset
  2926
    "
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2927
     10 factorialR
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2928
     1000 factorialR
4158
e04b61500e51 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4151
diff changeset
  2929
     Time millisecondsToRun:[10000 factorial]
212
3edd10edefaf *** empty log message ***
claus
parents: 202
diff changeset
  2930
    "
1560
f5ffcc5c3834 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1559
diff changeset
  2931
3908
b893f399f517 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 3890
diff changeset
  2932
    "Created: / 18.7.1996 / 12:48:36 / cg"
4158
e04b61500e51 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 4151
diff changeset
  2933
    "Modified: / 8.5.1999 / 18:40:13 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2934
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  2935
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2936
fib
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2937
    "compute the fibionacci number for the receiver.
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2938
        fib(0) := 0
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2939
        fib(1) := 1
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2940
        fib(n) := fib(n-1) + fib(n-2)"
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2941
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2942
    self <= 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  2943
        self == 0 ifTrue:[^ 0].
11896
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
    ^ self fib_helper
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2946
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2947
    "
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  2948
     30 fib
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2949
     60 fib
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2950
     1000 fib
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2951
    "
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2952
!
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2953
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2954
fib_helper
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2955
    "compute the fibionacci number for the receiver.
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2956
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2957
        Fib(n) = Fib(n-1) + Fib(n-2)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2958
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2959
     Knuth:
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2960
        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
  2961
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2962
     This is about 3 times faster than fib_iterative.
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2963
    "
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2964
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2965
    |fibUsingDict dict|
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2966
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2967
    dict := Dictionary new:100.
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2968
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  2969
    fibUsingDict := [:x |
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2970
        |n fib fibN fibNp1 fibNm1 fibXm1 fibXm2 fibXp1|
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2971
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2972
        x <= 30 ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2973
                "/ 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
  2974
            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
  2975
                     ) at:x
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2976
        ] ifFalse:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2977
            fib := dict at:x ifAbsent:nil.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2978
            fib isNil ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2979
                fibXm1 := dict at:(x-1) ifAbsent:nil.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2980
                fibXm1 notNil ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2981
                    fibXm2 := dict at:(x-2) ifAbsent:nil.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2982
                    fibXm2 notNil ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2983
                        fib := fibXm1 + fibXm2.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2984
                    ] ifFalse:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2985
                        fibXp1 := dict at:(x+1) ifAbsent:nil.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2986
                        fibXp1 notNil ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2987
                            fib := fibXp1 - fibXm1.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2988
                        ]
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2989
                    ]
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2990
                ].
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2991
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2992
                fib isNil ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2993
                    n := x // 2.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2994
                    x odd ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2995
                        "/ m is set to n+1; therefore:
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2996
                        "/ 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
  2997
                        "/ using Knuth:
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  2998
                        "/ 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
  2999
                        "/            = (Fib(n+1) ^ 2) + (Fib(n) ^ 2)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3000
                        fibN   := fibUsingDict value:n.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3001
                        fibNp1 := fibUsingDict value:(n+1).
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3002
                        fib := fibN squared + fibNp1 squared
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3003
                    ] ifFalse:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3004
                        "/ as
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3005
                        "/    Fib(n+1) = Fib(n) + Fib(n-1)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3006
                        "/ therefore:
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3007
                        "/    Fib(n) = Fib(n+1) - Fib(n-1)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3008
                        "/ 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
  3009
                        "/ This gives us:
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3010
                        "/    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
  3011
                        "/           = Fib(n+n+1) - Fib(n+n-1)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3012
                        "/           = Fib(n+n+1) - Fib((n-1)+(n-1)+1)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3013
                        "/           = ((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
  3014
                        "/           = (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
  3015
                        "/           = (Fib(n+1)^2) - (Fib((n-1))^2)
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3016
                        fibNm1 := fibUsingDict value:(n-1).
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3017
                        fibNp1 := fibUsingDict value:(n+1).
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3018
                        fib := fibNp1 squared - fibNm1 squared
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3019
                    ].
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3020
                ].
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3021
                dict at:x put:fib.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3022
            ]
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
        fib
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
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3027
    ^ fibUsingDict value:self
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3028
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3029
    "the running time is mostly dictated by the LargeInteger multiplication performance...
18230
55511104414b class: Integer
Claus Gittinger <cg@exept.de>
parents: 17488
diff changeset
  3030
     (therefore, we get O² execution times, even for a linear number of multiplications)
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3031
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3032
     Time millisecondsToRun:[50000 fib_iterative]  312    (DUO 1.7Ghz CPU)
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3033
     Time millisecondsToRun:[50000 fib_helper]     109
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3034
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  3035
     Time millisecondsToRun:[100000 fib_iterative] 1248
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3036
     Time millisecondsToRun:[100000 fib_helper]    374
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3037
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  3038
     Time millisecondsToRun:[200000 fib_iterative] 4758
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3039
     Time millisecondsToRun:[200000 fib_helper]    1544
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3040
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  3041
     Time millisecondsToRun:[400000 fib_iterative] 18892
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3042
     Time millisecondsToRun:[400000 fib_helper]    6084
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3043
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3044
     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
  3045
     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
  3046
    "
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3047
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3048
    "Modified: / 17-08-2010 / 17:29:34 / cg"
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3049
!
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3050
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3051
gcd:anInteger
2428
d54efc515824 better gcd for large integers
Claus Gittinger <cg@exept.de>
parents: 2408
diff changeset
  3052
    "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
  3053
     Euclids & Knuths algorithm."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3054
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3055
    |a b t|
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3056
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3057
    a := self abs.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3058
    b := anInteger abs.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3059
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3060
    a < b ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3061
        t := a.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3062
        a := b.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3063
        b := t.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3064
    ].
52
cf23b8901602 *** empty log message ***
claus
parents: 49
diff changeset
  3065
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3066
    b = 0 ifTrue: [^ a].
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3067
    a := a \\ b.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3068
    a = 0 ifTrue:[^ b].
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3069
    ^ b gcd_helper:a
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  3070
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3071
    "
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3072
     3141589999999999 gcd:1000000000000000
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3073
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3074
     Time millisecondsToRun:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3075
        10000 timesRepeat:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3076
           123456789012345678901234567890 gcd: 9876543210987654321
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3077
        ]
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3078
     ]
3060
0faf242e1142 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  3079
    "
0faf242e1142 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  3080
0faf242e1142 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3044
diff changeset
  3081
    "Modified: / 25.10.1997 / 16:08:45 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3082
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3083
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3084
integerLog2
14491
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3085
    "return the floor of log2 of the receiver.
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3086
     This is the same as (self log:2) floor."
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3087
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3088
    self <= 0 ifTrue:[
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3089
        ^ self class
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3090
            raise:#domainErrorSignal
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3091
            receiver:self
14491
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3092
            selector:#integerLog2
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3093
            arguments:#()
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3094
            errorString:'logarithm of negative integer'
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3095
    ].
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3096
    ^ self highBit - 1.
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3098
    "
14491
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3099
      2  log:2  
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3100
      2  integerLog2  
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3101
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3102
      3  log:2       
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3103
      3  integerLog2  
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3104
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3105
      4  log:2          
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3106
      4  integerLog2    
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3107
97b9228d2464 changed: #integerLog2
Claus Gittinger <cg@exept.de>
parents: 14448
diff changeset
  3108
      64  integerLog2  
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3109
      100 integerLog2
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3110
      100 log:2
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3111
      999 integerLog2
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3112
      999 log:2
14767
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3113
      120000 integerLog2 
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3114
      120000 log:2       
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3115
      -1 integerLog2
14767
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3116
      50 factorial integerLog2   
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3117
      50 factorial log:2
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3118
      1000 factorial integerLog2   
157f37c1a7f9 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14680
diff changeset
  3119
      1000 factorial log:2       -- float error!!
14097
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3120
    "
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3121
!
Stefan Vogel <sv@exept.de>
parents: 14043
diff changeset
  3122
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3123
integerReciprocal
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3124
    "return an integer representing 1/self * 2**n.
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3125
     Where an integer is one bit longer than self.
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3126
     This is a helper for modulu numbers"
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3127
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3128
    |b rem result|
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3129
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3130
    b := self highBit.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3131
    rem := 1 bitShift:b.
10488
8c254af93816 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 10030
diff changeset
  3132
    result := LargeInteger basicNew numberOfDigits:(b // 8)+1.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3133
    b := b+1.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3134
    [b > 0] whileTrue:[
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3135
        rem >= self ifTrue:[
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3136
            rem := rem -= self.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3137
            result digitBytes bitSetAt:b.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3138
        ].
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3139
        rem := rem mul2.
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3140
        b := b - 1.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3141
    ].
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3142
    ^ result compressed.
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3143
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3144
    "
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3145
     333 integerReciprocal                (2 raisedTo:18) // 333
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3146
     393 integerReciprocal
11945
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  3147
     8 integerReciprocal
8697e2333da3 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11938
diff changeset
  3148
     15 integerReciprocal
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3149
     15112233445566 integerReciprocal
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3150
     10239552311579 integerReciprocal
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3151
   "
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3152
13023
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3153
    "Modified: / 03-05-1999 / 14:27:18 / stefan"
c7b914e6ed2b comment/format
Claus Gittinger <cg@exept.de>
parents: 13022
diff changeset
  3154
    "Modified: / 17-08-2010 / 17:30:22 / cg"
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3155
!
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3156
12588
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3157
integerSqrt
12581
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3158
    "newton's method to get the largest integer which is less or equal to the
12586
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3159
     receiver's square root. 
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3160
     This might be needed for some number theoretic problems with large numbers
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3161
     (ans also in cryptography)"
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3162
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3163
    |guess prevGuess guessSquared|
12581
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3164
12582
7afa0bb19bbe comment/format in: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12581
diff changeset
  3165
    guess := (1 bitShift:(self highBit // 2)).
12581
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
    [ 
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3168
        prevGuess ~= guess
12586
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3169
        and:[ ((guessSquared := guess squared) - self) abs >= guess ]
12581
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3170
    ] whileTrue:[
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3171
        prevGuess := guess.
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3172
        guess := (guess + (self / guess)) // 2.
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3173
    ].
12586
1b8a0ecda4f2 changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12585
diff changeset
  3174
    guessSquared > self ifTrue:[
12581
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3175
        guess := guess - 1.
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3176
    ].
12585
e8ce2be6049a changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12582
diff changeset
  3177
    "/ self assert:(guess squared <= self).
e8ce2be6049a changed: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12582
diff changeset
  3178
    "/ self assert:((guess + 1) squared > self).
12581
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
    ^ guess.
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3181
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3182
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3183
    "
12588
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3184
     333 integerSqrt          
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3185
     325 integerSqrt          
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3186
     324 integerSqrt          
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3187
     323 integerSqrt          
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3188
     10239552311579 integerSqrt
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3189
     5397346292805549782720214077673687806275517530364350655459511599582614290 integerSqrt
fa4fb7a41047 added: #integerSqrt
Claus Gittinger <cg@exept.de>
parents: 12586
diff changeset
  3190
     1000 factorial integerSqrt 
12581
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3191
   "
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3192
!
3ce7fc818873 added: #integerSquareRoot
Claus Gittinger <cg@exept.de>
parents: 12565
diff changeset
  3193
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3194
inverseMod:n
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3195
    "find the modular inverse for myself to n.
11896
1c504810ba9c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11858
diff changeset
  3196
     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
  3197
     This is a helper for modulu numbers"
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3198
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3199
    |e ret|
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3200
5001
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  3201
    "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
  3202
     (self * x) + (n * y) = self gcd:n"
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  3203
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3204
    e := self extendedEuclid:n.
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3205
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3206
    (e at:3) == 1 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3207
        ret := e at:1.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3208
        ret negative ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3209
            ^ ret + n
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3210
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3211
        ^ ret.
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3212
    ].
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3213
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3214
    ^ 0
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3215
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3216
    "
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3217
     14 inverseMod:5      -> 4
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3218
     5 inverseMod:14      -> 3
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3219
     14 inverseMod:11     -> 4                (4 * 14) \\ 11
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3220
     11 inverseMod:14     -> 9                (9 * 11) \\ 14
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3221
     79 inverseMod:3220   -> 1019
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3222
     3220 inverseMod:79   -> 54               (54 * 3220) \\ 79
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3223
     1234567891 inverseMod:1111111111119
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3224
                          -> 148726663534     (148726663534*1234567891) \\ 1111111111119
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3225
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3226
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3227
     14 extendedEuclid:11
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3228
     5 extendedEuclid:14
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3229
     14 extendedEuclid:2
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3230
     3220 extendedEuclid:79
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3231
    "
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3232
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3233
    "Created: / 27.4.1999 / 15:19:22 / stefan"
5001
732ea614d36d Comments for #inverseMod: and #extendedEuclid:
Stefan Vogel <sv@exept.de>
parents: 4996
diff changeset
  3234
    "Modified: / 18.11.1999 / 16:21:37 / stefan"
4136
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3235
!
8c8bfa5808a3 Optimisations and modulo arithmethic
Stefan Vogel <sv@exept.de>
parents: 4039
diff changeset
  3236
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3237
lcm:anInteger
52
cf23b8901602 *** empty log message ***
claus
parents: 49
diff changeset
  3238
    "return the least common multiple (using gcd:)"
cf23b8901602 *** empty log message ***
claus
parents: 49
diff changeset
  3239
cf23b8901602 *** empty log message ***
claus
parents: 49
diff changeset
  3240
    ^ (self * anInteger) abs // (self gcd: anInteger)
cf23b8901602 *** empty log message ***
claus
parents: 49
diff changeset
  3241
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3242
    "
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3243
     65 lcm:15
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3244
     3 lcm:15
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3245
    "
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3246
!
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3247
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3248
primeFactors
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3249
    "return a collection of prime factors of the receiver.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3250
     For prime numbers, an empty collection is returned.
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3251
     Can take a long time for big numbers"
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3252
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3253
    ^ self primeFactorsUpTo:nil
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3254
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3255
    "
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3256
     2 to:10000 do:[:n |
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3257
        self assert:((n isPrime and:[ n primeFactors isEmpty])
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3258
                    or:[ n isPrime not and:[n primeFactors product = n]])
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3259
     ]
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3260
     3 to:10000 do:[:n |
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3261
        self assert:(n factorial primeFactors product = n factorial)
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3262
     ]
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
     13195 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3265
     12 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3266
     2 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3267
     3 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3268
     5 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3269
     14 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3270
     13423453625634765 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3271
     13423453625634765 isPrime
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3272
     13423453625634765 gcd:(3 * 5 * 19 * 29)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3273
     13423453625634765 / 8265
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3274
     1624132320101 isPrime
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3275
     1624132320101 gcd: 8265
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3276
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3277
     1000000 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3278
     100000000 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3279
     1000000000 primeFactors
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3280
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3281
     Time millisecondsToRun:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3282
        1000 timesRepeat:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3283
            10000000000000000000000000000000000000 primeFactors
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3284
        ]
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3285
     ]   421
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3286
    "
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3287
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3288
    "Modified: / 17-08-2010 / 17:27:33 / cg"
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3289
!
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3290
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3291
primeFactorsUpTo:limitArgOrNil
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3292
    "return a collection of prime factors of the receiver.
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3293
     For prime numbers, an empty collection is returned.
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3294
     Can take a long time for big numbers
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3295
     (win a nobel price, if you find something quick (*)
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3296
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3297
     (*):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
  3298
11582
56088c49011e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11563
diff changeset
  3299
    |rest n factors limit lastPrime checkThisFactor nextTry|
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3300
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3301
    factors := Bag new.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3302
    rest := self.
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3303
    limit := (rest // 2).
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3304
    limitArgOrNil notNil ifTrue:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3305
        limit := limit min:limitArgOrNil.
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3306
    ].
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3307
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3308
    "/ try to get the number down fast:
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3309
    n := rest lowBit.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3310
    n ~~ 1 ifTrue:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3311
        self == 2 ifTrue:[^ #() ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3312
        factors add:2 withOccurrences:(n-1).
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3313
        rest := rest rightShift:(n-1).
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3314
    ].
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3315
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3316
    checkThisFactor := [:prime |
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3317
            prime*prime > rest ifTrue:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3318
                (rest ~~ 1 and:[factors notEmpty]) ifTrue:[ factors add:rest ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3319
                ^ factors.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3320
            ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3321
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3322
            [rest \\ prime == 0] whileTrue:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3323
                factors add:prime.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3324
                rest := rest // prime.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3325
                rest == 1 ifTrue:[^ factors].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3326
            ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3327
            lastPrime := prime.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3328
        ].
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3329
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3330
    limit <= 2000 ifTrue:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3331
        Integer primesUpTo2000 do:checkThisFactor.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3332
        ^ factors
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3333
    ].
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3334
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3335
    "/ 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
  3336
    "/ 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
  3337
    "/ which may slow things down quite a bit.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3338
    "/ (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
  3339
    "/ a few millions).
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3340
11938
79dcaf7ae7ad changed #primeFactorsUpTo:
Claus Gittinger <cg@exept.de>
parents: 11936
diff changeset
  3341
    Integer primesUpTo:(limit min:(1000000 max:Integer primeCacheSize)) do:checkThisFactor.
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3342
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3343
    nextTry := lastPrime + 2.
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3344
    [ nextTry <= limit ] whileTrue:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3345
        "/ now, we are beyond the list of pre-generated primes.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3346
        "/ change our strategy to: see if it divides an odd number;
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3347
        "/ if so, add the divisor's prime factors.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3348
        nextTry*nextTry > rest ifTrue:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3349
            (rest ~~ 1 and:[factors notEmpty]) ifTrue:[ factors add:rest ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3350
            ^ factors.
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 \\ nextTry) == 0] whileTrue:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3353
            "/ can only happen relatively late after the last prime,
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3354
            "/ because otherwise, the primeFactors of nextTry would already have
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3355
            "/ been found as divisors.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3356
            "/ first chance is: (lastPrime + 2) squared
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3357
            nextTry < lastPrime squared ifTrue:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3358
                "/ nextTry is a prime !!
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3359
                factors add:nextTry
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3360
            ] ifFalse:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3361
                factors addAll:(nextTry primeFactors).
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3362
            ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3363
            rest := rest // nextTry.
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3364
        ].
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3365
        nextTry := nextTry + 2.
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3366
    ].
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3367
    ^ factors
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3368
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3369
    "
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3370
     2 to:10000 do:[:n |
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3371
        self assert:((n isPrime and:[ n primeFactors isEmpty])
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3372
                    or:[ n isPrime not and:[n primeFactors product = n]])
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3373
     ]
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3374
     3 to:10000 do:[:n |
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3375
        self assert:(n factorial primeFactors product = n factorial)
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3376
     ]
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3377
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3378
     13195 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3379
     12 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3380
     2 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3381
     3 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3382
     5 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3383
     14 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3384
     13423453625634765 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3385
     13423453625634765 isPrime
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3386
     13423453625634765 gcd:(3 * 5 * 19 * 29)
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3387
     13423453625634765 / 8265
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3388
     1624132320101 isPrime
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3389
     1624132320101 gcd: 8265
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3390
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3391
     1000000 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3392
     100000000 primeFactors
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3393
     1000000000 primeFactors
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3394
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3395
     Time millisecondsToRun:[
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3396
        1000 timesRepeat:[
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3397
            10000000000000000000000000000000000000 primeFactors
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3398
        ]
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3399
     ]   421
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3400
    "
13021
1cbf4cdfc288 comment/format
Claus Gittinger <cg@exept.de>
parents: 12978
diff changeset
  3401
13022
43a439f72615 comment/format
Claus Gittinger <cg@exept.de>
parents: 13021
diff changeset
  3402
    "Modified: / 17-08-2010 / 17:28:05 / cg"
11496
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3403
!
74c8c4d468d7 prime stuff
Claus Gittinger <cg@exept.de>
parents: 11495
diff changeset
  3404
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3405
raisedTo:exp mod:mod
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3406
    "return the modulo (remainder) of
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3407
     the receiver raised to exp (an Integer) and mod (another Integer)"
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3408
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3409
    |result m t
5816
ce15ce5294b4 Cleanup unused method vars
Stefan Vogel <sv@exept.de>
parents: 5799
diff changeset
  3410
"/     eI   "{Class: SmallInteger}"
ce15ce5294b4 Cleanup unused method vars
Stefan Vogel <sv@exept.de>
parents: 5799
diff changeset
  3411
     bits "{Class: SmallInteger}"|
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3412
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3413
    "use the addition chaining algorithm"
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3414
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3415
    exp == 0 ifTrue:[
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3416
        ^ 1
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3417
    ].
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3418
    exp == 1 ifTrue:[
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3419
        mod isNumber ifTrue:[
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3420
            ^ self \\ mod.
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3421
        ]
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3422
    ].
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3423
    exp negative ifTrue:[
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3424
        ^ self class
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3425
            raise:#domainErrorSignal
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3426
            receiver:self
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3427
            selector:#raisedTo:mod:
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3428
            arguments:(Array with:exp with:mod)
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3429
            errorString:'modulo arithmethic with negative exponent'
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3430
    ].
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3431
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3432
    m := mod asModuloNumber.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3433
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3434
    result := 1.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3435
    t := m modulusOf:self.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3436
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3437
    "/ to be validated ...
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3438
"/    (exp class == SmallInteger) ifTrue:[
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3439
"/        eI := exp.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3440
"/        [eI ~~ 0] whileTrue:[
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3441
"/            (eI bitAnd:1) == 1 ifTrue:[
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3442
"/                result := m modulusOf:(result * t).
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3443
"/            ].
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3444
"/            t := m modulusOf:(t * t).
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3445
"/            eI := eI bitShift:-1.
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3446
"/        ].
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3447
"/        ^ result.
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3448
"/    ].
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3449
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3450
    bits := exp highBit.
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3451
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3452
    1 to:bits-1 do:[:i|
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3453
        (exp bitAt:i) == 1 ifTrue:[
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3454
            result := m modulusOf:(result * t).
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3455
        ].
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3456
        t := m modulusOf:(t * t).
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3457
    ].
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3458
    result := m modulusOf:(result * t).
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3459
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3460
    ^ result
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3461
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3462
    "
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3463
     2 raisedTo:2 mod:3
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3464
      20000000000000 raisedTo:200 mod:190  ->  30
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3465
     (20000000000000 raisedTo:200) \\ 190
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3466
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3467
      Time millisecondsToRun:[10000 timesRepeat:[
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3468
                                20000000000000 raisedTo:200 mod:190
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3469
                              ]
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3470
                             ]
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3471
8335
e7fa7779b1b9 Fix #raisedTo:mod: for expontents 1 and 0
Stefan Vogel <sv@exept.de>
parents: 8289
diff changeset
  3472
     Time millisecondsToRun:[1000 timesRepeat:[
12280
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3473
                                (20000000000000 raisedTo:200) \\ 190
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3474
                             ]
b2bbbfd2444e added: #raisedTo:modulo:
Stefan Vogel <sv@exept.de>
parents: 12255
diff changeset
  3475
                            ]
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3476
    "
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3477
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3478
    "Created: / 27.4.1999 / 15:19:22 / stefan"
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3479
    "Modified: / 5.5.1999 / 11:18:20 / stefan"
6195
9e60c38d1d61 #raise:receiver:selector...
Claus Gittinger <cg@exept.de>
parents: 6055
diff changeset
  3480
    "Modified: / 16.11.2001 / 14:15:21 / cg"
4973
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
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3483
raisedToCrtModP:p q:q ep:ep eq:eq u:u
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3484
    "Application of the Chinese Remainder Theorem (CRT).
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3485
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3486
     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
  3487
     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
  3488
     modulus, the Chinese Remainder Theorem to do the computation mod p and
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3489
     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
  3490
     precomputed values, but does not actually require the modulus n or the
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3491
     exponent e.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3492
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3493
     expout = expin ^ e mod (p*q).
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3494
     We form this by evaluating
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3495
     p2 = (expin ^ e) mod p and
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3496
     q2 = (expin ^ e) mod q
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3497
     and then combining the two by the CRT.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3498
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3499
     Two optimisations of this are possible.  First, we can reduce expin
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3500
     modulo p and q before starting.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3501
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3502
     Second, since we know the factorisation of p and q (trivially derived
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3503
     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
  3504
     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
  3505
     to throw away multiples of phi(p) or phi(q) in e.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3506
     Letting ep = e mod phi(p) and
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3507
              eq = e mod phi(q)
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3508
     then combining these two speedups, we only need to evaluate
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3509
     p2 = ((expin mod p) ^ ep) mod p and
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3510
     q2 = ((expin mod q) ^ eq) mod q.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3511
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3512
     Now we need to apply the CRT.  Starting with
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3513
     expout = p2 (mod p) and
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3514
     expout = q2 (mod q)
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3515
     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
  3516
     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
  3517
     (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
  3518
     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
  3519
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3520
     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
  3521
     Since we want 0 <= k < q, we can thus find k as
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3522
     k = (u * (q2-p2)) mod q.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3523
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3524
     Once we have k, evaluating p2 + p * k is easy, and
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3525
     that gives us the result
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3526
    "
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3527
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3528
    |result t mp mq|
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3529
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3530
    mp := p asModuloNumber.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3531
    t := mp modulusOf:self.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3532
    result := t raisedTo:ep mod:mp.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3533
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3534
    mq := q asModuloNumber.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3535
    t := mq modulusOf:self.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3536
    t := t raisedTo:eq mod:mq.
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
    "now p2 is in result, q2 in t"
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
    t := t -= result.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3541
    t < 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3542
        t := t + q.
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3543
    ].
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3544
    t := t *= u.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3545
    t := mq modulusOf:t.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3546
    t := t *= p.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3547
    result := result += t.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3548
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3549
    ^ result.
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3550
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3551
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3552
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3553
    "
4973
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3554
     2 raisedTo:2 mod:3
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3555
      20000000000000 raisedTo:200 mod:190
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3556
     (20000000000000 raisedTo:200) \\ 190
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3557
    "
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3558
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3559
    "Created: / 30.4.1999 / 15:53:15 / stefan"
2bbd09250179 Fix CRT
Stefan Vogel <sv@exept.de>
parents: 4972
diff changeset
  3560
    "Modified: / 5.5.1999 / 11:01:15 / stefan"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3561
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3562
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3563
!Integer methodsFor:'printing & storing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3564
16038
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3565
asBCD
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3566
    "return an integer which represents the BCD encoded value of the receiver;
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3567
     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
  3568
     of the result. (aka 162 -> 0x162).
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3569
     This conversion is useful for some communication protocols,
16040
4708e4544528 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16038
diff changeset
  3570
     or control systems, which represent numbers this way...
4708e4544528 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16038
diff changeset
  3571
     This fallback code is not particularily tuned or optimized for speed."
16038
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3572
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3573
    |rest twoDigits hi lo shift out|
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 := 0. shift := 0.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3576
    rest := self.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3577
    [rest > 0] whileTrue:[
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3578
        twoDigits := rest \\ 100.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3579
        rest := rest // 100.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3580
        hi := twoDigits // 10.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3581
        lo := twoDigits \\ 10.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3582
        out := out bitOr:(((hi bitShift:4)+lo) bitShift:shift).
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3583
        shift := shift + 8.
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3584
    ].
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3585
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3586
    ^ out
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
     (100 factorial) asBCD
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3590
     999999999 asBCD 
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3591
     100000000 asBCD   
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3592
     123456789 asBCD   
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3593
     99999999 asBCD  
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3594
     12345678 asBCD
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3595
     12345678 asBCD 
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3596
     12345678 asBCD hexPrintString
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3597
     12345678901234567890 asBCD
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3598
    "
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3599
!
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3600
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3601
asBCDBytes
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3602
    "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
  3603
     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
  3604
     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
  3605
     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
  3606
     or control systems, which represent big numbers this way...
16038
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3607
     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
  3608
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3609
    |s rest twoDigits hi lo|
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3610
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3611
    self == 0 ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3612
        ^ #[ 16r00 ]
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3613
    ].
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
    "/ 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
  3616
    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
  3617
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3618
    rest := self.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3619
    [rest > 0] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3620
        twoDigits := rest \\ 100.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3621
        rest := rest // 100.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3622
        hi := twoDigits \\ 10.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3623
        lo := twoDigits // 10.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3624
        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
  3625
    ].
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3626
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3627
    ^ s contents reverse
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3628
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3629
    "
16038
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3630
     12345678 asBCDBytes 
0de5f1f2a740 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16015
diff changeset
  3631
     12345678 asBCDBytes hexPrintString
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3632
     12345678901234567890 asBCDBytes
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3633
    "
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3634
!
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  3635
14294
914ff26e98c1 Implement #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 14166
diff changeset
  3636
displayOn:aGCOrStream
914ff26e98c1 Implement #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 14166
diff changeset
  3637
    "return a string to display the receiver.
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
  3638
     The output radix is usually 10, but can be changed by setting
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
  3639
     DefaultDisplayRadix (see Integer>>displayRadix:)"
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
  3640
14294
914ff26e98c1 Implement #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 14166
diff changeset
  3641
    "/ what a kludge - Dolphin and Squeak mean: printOn: a stream;
914ff26e98c1 Implement #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 14166
diff changeset
  3642
    "/ ST/X (and some old ST80's) mean: draw-yourself on a GC.
914ff26e98c1 Implement #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 14166
diff changeset
  3643
    (aGCOrStream isStream) ifFalse:[
914ff26e98c1 Implement #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 14166
diff changeset
  3644
        ^ super displayOn:aGCOrStream
914ff26e98c1 Implement #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 14166
diff changeset
  3645
    ].
914ff26e98c1 Implement #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 14166
diff changeset
  3646
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 52
diff changeset
  3647
    (DefaultDisplayRadix isNil or:[DefaultDisplayRadix == 10]) ifTrue:[
14294
914ff26e98c1 Implement #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 14166
diff changeset
  3648
        self printOn:aGCOrStream
914ff26e98c1 Implement #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 14166
diff changeset
  3649
    ] ifFalse:[
914ff26e98c1 Implement #displayOn: instead of #displayString
Stefan Vogel <sv@exept.de>
parents: 14166
diff changeset
  3650
        self printOn:aGCOrStream base:DefaultDisplayRadix showRadix:true.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 52
diff changeset
  3651
    ].
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
  3652
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3653
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3654
     Integer displayRadix:16. 12345
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3655
     Integer displayRadix:2.  12345
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3656
     Integer displayRadix:10. 12345
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3657
    "
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
  3658
!
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
  3659
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3660
errorPrintHex
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3661
    "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
  3662
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3663
     (self printStringRadix:16) errorPrint
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3664
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3665
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3666
hexPrintString
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3667
    "return a hex string representation of the receiver"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3668
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3669
    ^ self printStringRadix:16
3874
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3670
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3671
    "
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3672
     127 hexPrintString
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3673
     -1 hexPrintString
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3674
    "
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3675
a04715e25340 comment
Claus Gittinger <cg@exept.de>
parents: 3683
diff changeset
  3676
    "Modified: / 11.10.1998 / 01:15:43 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3677
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3678
2408
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3679
hexPrintString:size
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3680
    "return a hex string representation of the receiver,
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3681
     padded to size characters"
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3682
5799
547c417b23cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5782
diff changeset
  3683
"/    ^ (self printStringRadix:16) leftPaddedTo:size with:$0
547c417b23cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5782
diff changeset
  3684
    ^ self printStringRadix:16 size:size fill:$0
547c417b23cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5782
diff changeset
  3685
547c417b23cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5782
diff changeset
  3686
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3687
     12345 hexPrintString:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3688
     123 hexPrintString:4
5799
547c417b23cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 5782
diff changeset
  3689
    "
2408
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3690
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3691
    "Created: 18.2.1997 / 13:32:33 / cg"
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3692
!
fd31506f31ef added #hexPrintString:
Claus Gittinger <cg@exept.de>
parents: 2141
diff changeset
  3693
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3694
printHex
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3695
    "print the receiver as a hex number on the standard output stream"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3696
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3697
     (self printStringRadix:16) print
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3698
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3699
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3700
printOn:aStream
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3701
    "append a printed description of the receiver to aStream"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3702
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3703
    self printOn:aStream base:10
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3704
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3705
    "Modified: / 20.1.1998 / 14:10:45 / stefan"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3706
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  3707
4522
29a6625dc7b1 error: vs. error:mayProceed:
Claus Gittinger <cg@exept.de>
parents: 4424
diff changeset
  3708
printOn:aStream base:b
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3709
    "return a string representation of the receiver in the specified
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3710
     radix (without the initial XXr)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3711
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3712
    ^ self printOn:aStream base:b showRadix:false
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3713
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3714
    "
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3715
     10 printOn:Transcript base:3
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3716
     31 printOn:Transcript base:3
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3717
     -20 printOn:Transcript base:16
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3718
     -20 printOn:Transcript base:10
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3719
     3000 factorial printOn:Transcript base:10
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3720
    "
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3721
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3722
    "Modified: / 20.1.1998 / 18:05:02 / stefan"
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3723
    "Modified: / 7.9.2001 / 13:52:17 / cg"
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3724
!
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3725
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3726
printOn:aStream base:b showRadix:showRadix
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3727
    "append a string representation of the receiver in the specified numberBase to aStream
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3728
     (if showRadix is true, with initial XXr)
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3729
     The radix argument should be between 2 and 36."
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3730
4522
29a6625dc7b1 error: vs. error:mayProceed:
Claus Gittinger <cg@exept.de>
parents: 4424
diff changeset
  3731
    |base num s divMod mod r r2 r4 nD numN|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3732
4522
29a6625dc7b1 error: vs. error:mayProceed:
Claus Gittinger <cg@exept.de>
parents: 4424
diff changeset
  3733
    base := b.
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3734
    (base isInteger and:[ base between:2 and:36 ]) ifFalse:[
14967
0f7cf85949b2 class: Integer
Stefan Vogel <sv@exept.de>
parents: 14796
diff changeset
  3735
        ConversionError raiseRequestWith:self errorString:' - invalid base: ', base printString.
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3736
        base := 10.
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 52
diff changeset
  3737
    ].
06dbdeeed4f9 *** empty log message ***
claus
parents: 52
diff changeset
  3738
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3739
    showRadix ifTrue:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3740
        base printOn:aStream.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3741
        aStream nextPut:$r.
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3742
    ].
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3743
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3744
    (self = 0) ifTrue:[aStream nextPut:$0. ^ self].
11508
d1ed91142715 prime stuff printing fix.
Claus Gittinger <cg@exept.de>
parents: 11505
diff changeset
  3745
    (self negative) ifTrue:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3746
        aStream nextPut:$- .
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3747
        num := self negated.
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3748
    ] ifFalse:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3749
        num := self.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3750
    ].
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3751
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3752
    "
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3753
     claus: changed it from a recursive algorithm;
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3754
     (it used to trigger stack-overflow exceptions when printing
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3755
      3000 factorial ...)
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3756
    "
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3757
"/    leftPart := num // base.
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3758
"/    (leftPart ~= 0) ifTrue:[
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3759
"/        leftPart printOn:aStream base:base.
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3760
"/        aStream nextPut:(Character digitValue:(num \\ base).
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3761
"/        ^ self
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3762
"/    ].
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3763
"/    aStream nextPut:(Character digitValue:num).
2951
256e90eee7f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2816
diff changeset
  3764
3121
91de0211651c even faster largeInt printString, by doing it in bigger junks (8digits a time)
Claus Gittinger <cg@exept.de>
parents: 3060
diff changeset
  3765
    "/ 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
  3766
    "/ 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
  3767
    "/ 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
  3768
    "/ 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
  3769
    "/ 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
  3770
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3771
    r2 := base*base.   "/ radix^2
3138
1cd38a2d1924 oops - printString
ca
parents: 3136
diff changeset
  3772
    r4 := r2*r2.             "/ radix^4
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3773
    base <= 10 ifTrue:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3774
        r := r4*r2.        "/ radix^6
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3775
        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
  3776
    ] ifFalse:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3777
        r := r4*base.    "/ radix^5
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3778
        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
  3779
    ].
91de0211651c even faster largeInt printString, by doing it in bigger junks (8digits a time)
Claus Gittinger <cg@exept.de>
parents: 3060
diff changeset
  3780
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3781
    "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
  3782
     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
  3783
     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
  3784
    "
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3785
    s := WriteStream on:(String new:((num highBit // base highBit - 1) + 1)).
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3786
3121
91de0211651c even faster largeInt printString, by doing it in bigger junks (8digits a time)
Claus Gittinger <cg@exept.de>
parents: 3060
diff changeset
  3787
    [num >= r] whileTrue:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3788
        "/
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3789
        "/ chop off nD digits.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3790
        "/
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3791
        divMod := num divMod:r.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3792
        num := divMod at:1.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3793
        numN := divMod at:2.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3794
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3795
        "/ process them
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3796
        nD timesRepeat:[
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3797
            divMod := numN divMod:base.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3798
            numN := divMod at:1.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3799
            mod := divMod at:2.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3800
            s nextPut:(Character digitValue:mod).
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3801
        ].
2951
256e90eee7f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2816
diff changeset
  3802
    ].
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  3803
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  3804
    [num ~= 0] whileTrue:[
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3805
        divMod := num divMod:base.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3806
        num := divMod at:1.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3807
        mod := divMod at:2.
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3808
        s nextPut:(Character digitValue:mod).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  3809
    ].
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3810
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3811
    aStream nextPutAll:(s contents reverse).
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3812
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3813
    "
12976
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3814
        3000 factorial printOn:Transcript base:10
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3815
        10 printOn:Transcript base:3
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3816
        31 printOn:Transcript base:3
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3817
        -20  printOn:Transcript base:16
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3818
        -20  printOn:Transcript base:10
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3819
        Time millisecondsToRun:[10000 factorial printString]   7650
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3820
    "
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3821
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3822
    "Modified: / 20-01-1998 / 18:05:02 / stefan"
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3823
    "Created: / 07-09-2001 / 13:51:33 / cg"
a12aab15ce5a changed: #printOn:base:showRadix:
Claus Gittinger <cg@exept.de>
parents: 12875
diff changeset
  3824
    "Modified: / 02-08-2010 / 12:24:14 / cg"
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3825
!
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3826
15775
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3827
printOn:aStream base:baseInteger size:sz 
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3828
    "print a string representation of the receiver in the specified
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3829
     base. The string is padded on the left with fillCharacter to make
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3830
     its size as specified in sz."
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3831
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3832
    self printOn:aStream base:baseInteger size:sz fill:$0
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3833
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3834
    "
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3835
     1024 printOn:Transcript base:16 size:4
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3836
     1024 printOn:Transcript base:2 size:16.
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3837
     1024 printOn:Transcript base:16 size:8.
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3838
    "
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3839
!
94bd832a355e class: Integer
Claus Gittinger <cg@exept.de>
parents: 15765
diff changeset
  3840
7173
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3841
printOn:aStream base:baseInteger size:sz fill:fillCharacter
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3842
    "print a string representation of the receiver in the specified
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3843
     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
  3844
     its size as specified in sz."
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3845
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3846
    |stream string actualSize|
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3847
11793
87abb9669c47 changed #printOn:based:showRadix:
Stefan Vogel <sv@exept.de>
parents: 11654
diff changeset
  3848
    stream := WriteStream on:(String new:sz).
7173
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3849
    self printOn:stream base:baseInteger showRadix:false.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3850
    string := stream contents.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3851
    actualSize := string size.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3852
    actualSize < sz ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3853
        aStream next:sz-actualSize put:fillCharacter.
7173
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3854
    ].
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3855
    aStream nextPutAll:string.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3856
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3857
    "
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3858
     1024 printOn:Transcript base:16 size:4 fill:$0
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3859
     1024 printOn:Transcript base:2 size:16 fill:$.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3860
     1024 printOn:Transcript base:16 size:8 fill:Character space.
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3861
    "
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3862
!
a1d65d39dbfb *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 7155
diff changeset
  3863
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3864
printOn:aStream radix:base
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3865
    "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
  3866
     The receiver is printed in radix base (instead of the default, 10).
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3867
     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
  3868
8897
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
  3869
    <resource: #obsolete>
da8d205a93aa Mark obsolete method as obsolete
Stefan Vogel <sv@exept.de>
parents: 8892
diff changeset
  3870
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3871
    self printOn:aStream base:base
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3872
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3873
    "Modified: / 20.1.1998 / 14:10:45 / stefan"
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3874
    "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
  3875
!
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3876
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3877
printRomanOn:aStream
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3878
    "print the receiver as roman number to the receiver, aStream.
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3879
     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
  3880
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3881
    ^ self printRomanOn:aStream naive:false
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3882
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3883
    "
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3884
     1 to:10 do:[:i | i printRomanOn:Transcript. Transcript cr.].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3885
     1999 printRomanOn:Transcript. Transcript cr.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3886
     Date today year printRomanOn:Transcript. Transcript cr.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3887
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3888
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3889
    "test all between 1 and 9999:
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3890
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3891
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3892
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3893
        romanString := String streamContents:[:stream | n printRomanOn:stream].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3894
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3895
     ]
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3896
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3897
!
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3898
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3899
printRomanOn:aStream naive:naive
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3900
    "print the receiver as roman number to the receiver, aStream.
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3901
     The naive argument controls if the conversion is
6682
9a97f4deb836 more on roman numbers
Claus Gittinger <cg@exept.de>
parents: 6673
diff changeset
  3902
     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
  3903
     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
  3904
     The naive version is often used for page numbers in documents."
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
    |restValue spec|
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3907
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3908
    restValue := self.
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3909
    restValue > 0 ifFalse:[self error:'negative roman'].
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3910
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3911
    naive ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3912
        spec := #(
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3913
                " value string repeat "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3914
                   1000 'M'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3915
                    500 'D'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3916
                    100 'C'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3917
                     50 'L'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3918
                     10 'X'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3919
                      5 'V'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3920
                      1 'I'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3921
                 ).
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3922
    ] ifFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3923
        spec := #(
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3924
                " value string repeat "
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3925
                   1000 'M'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3926
                    900 'CM'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3927
                    500 'D'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3928
                    400 'CD'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3929
                    100 'C'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3930
                     90 'XC'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3931
                     50 'L'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3932
                     40 'XL'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3933
                     10 'X'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3934
                      9 'IX'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3935
                      5 'V'    false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3936
                      4 'IV'   false
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3937
                      1 'I'    true
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3938
                 ).
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3939
    ].
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3940
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  3941
    spec
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3942
        inGroupsOf:3
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3943
        do:[:rValue :rString :repeatFlag |
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3944
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3945
            [
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3946
                (restValue >= rValue) ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3947
                    aStream nextPutAll:rString.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3948
                    restValue := restValue - rValue.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3949
                ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3950
            ] doWhile:[ repeatFlag and:[ restValue >= rValue] ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3951
        ].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3952
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3953
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3954
     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
  3955
     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
  3956
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3957
     1999 printRomanOn:Transcript. Transcript cr.
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3958
     Date today year printRomanOn:Transcript. Transcript cr.
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3959
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3960
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3961
    "test all between 1 and 9999:
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3962
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3963
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3964
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3965
        romanString := String streamContents:[:stream | n printRomanOn:stream naive:false].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3966
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6673
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3967
     ]
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3968
    "
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3969
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3970
    "test naive all between 1 and 9999:
34547f06c5c7 roman numbers revisited
Claus Gittinger <cg@exept.de>
parents: 6640
diff changeset
  3971
      1 to:9999 do:[:n |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3972
        |romanString|
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3973
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3974
        romanString := String streamContents:[:stream | n printRomanOn:stream naive:true].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  3975
        (Integer readFromRomanString:romanString onError:nil) ~= n ifTrue:[self halt].
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3976
     ]
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3977
    "
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3978
!
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  3979
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  3980
printStringRadix:base
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3981
    "return a string representation of the receiver in the specified
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3982
     base; does NOT prepend XXr to the string.
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  3983
     See also: radixPrintStringRadix:
13718
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3984
               printOn:base:showRadix:"
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3985
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3986
    ^ self printStringRadix:base showRadix:false
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3987
15558
16088b17994a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15556
diff changeset
  3988
    "
16088b17994a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15556
diff changeset
  3989
     10 printStringRadix:16   
16088b17994a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15556
diff changeset
  3990
    "
16088b17994a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15556
diff changeset
  3991
13718
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3992
    "Created: / 19-01-1998 / 17:20:58 / stefan"
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3993
    "Modified: / 20-01-1998 / 14:10:54 / stefan"
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3994
    "Modified: / 23-09-2011 / 13:59:36 / cg"
15558
16088b17994a class: Integer
Claus Gittinger <cg@exept.de>
parents: 15556
diff changeset
  3995
    "Modified (comment): / 26-07-2013 / 12:55:18 / cg"
13718
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3996
!
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3997
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3998
printStringRadix:base showRadix:showRadixBoolean
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  3999
    "return a string representation of the receiver in the specified
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  4000
     base; does NOT prepend XXr to the string.
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  4001
     See also: radixPrintStringRadix:
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  4002
               printOn:base:showRadix:"
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  4003
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  4004
    |s|
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  4005
7685
535a69a7cd69 String new -> uninitializedNew: / basicNew:
Claus Gittinger <cg@exept.de>
parents: 7551
diff changeset
  4006
    s := WriteStream on:(String basicNew:20).
13718
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  4007
    self printOn:s base:base showRadix:showRadixBoolean.
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  4008
    ^ s contents
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  4009
13718
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  4010
    "Created: / 23-09-2011 / 13:59:19 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4011
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4012
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4013
printStringRadix:aRadix size:sz fill:fillCharacter
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4014
    "return a string representation of the receiver in the specified
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4015
     radix. The string is padded on the left with fillCharacter to make
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4016
     its size as specified in sz."
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4017
2951
256e90eee7f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2816
diff changeset
  4018
    |s actualSize|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4019
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4020
    s := self printStringRadix:aRadix.
2951
256e90eee7f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2816
diff changeset
  4021
    actualSize := s size.
256e90eee7f9 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2816
diff changeset
  4022
    actualSize < sz ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4023
        s := ((String new:(sz - actualSize)) atAllPut:fillCharacter) , s
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4024
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4025
    ^ s
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4026
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  4027
    "
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  4028
     1024 printStringRadix:16 size:4 fill:$0
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  4029
     1024 printStringRadix:2 size:16 fill:$.
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  4030
     1024 printStringRadix:16 size:8 fill:(Character space)
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
  4031
    "
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  4032
!
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  4033
5988
Claus Gittinger <cg@exept.de>
parents: 5882
diff changeset
  4034
radixPrintStringRadix:radix
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4035
    "return a string representation of the receiver in the specified
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  4036
     base; prepend XXr to the string"
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  4037
13718
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  4038
    ^ self printStringRadix:radix showRadix:true
216
a8abff749575 *** empty log message ***
claus
parents: 213
diff changeset
  4039
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4040
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4041
     31 radixPrintStringRadix:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4042
     31 radixPrintStringRadix:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4043
     31 radixPrintStringRadix:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4044
     31 radixPrintStringRadix:16
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4045
     31 radixPrintStringRadix:36
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4046
    "
3188
301eaf46b9e4 Use #printOn: instead of #printString as base method.
Stefan Vogel <sv@exept.de>
parents: 3162
diff changeset
  4047
13718
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  4048
    "Created: / 19-01-1998 / 17:38:00 / stefan"
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  4049
    "Modified: / 20-01-1998 / 14:11:03 / stefan"
936d2f4903c7 added: #printStringRadix:showRadix:
Claus Gittinger <cg@exept.de>
parents: 13387
diff changeset
  4050
    "Modified: / 23-09-2011 / 14:00:02 / cg"
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  4051
!
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  4052
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  4053
romanPrintString
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  4054
    "return a roman number representation of the receiver as a string"
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  4055
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  4056
    ^ String streamContents:[:stream | self printRomanOn:stream].
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  4057
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  4058
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4059
     1999 romanPrintString.
6635
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  4060
     Date today year romanPrintString.
3b5525d83d5d roman numbers
Claus Gittinger <cg@exept.de>
parents: 6534
diff changeset
  4061
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4062
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4063
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4064
!Integer methodsFor:'queries'!
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  4065
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4066
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
  4067
    "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
  4068
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4069
    self subclassResponsibility
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4070
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4071
    "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
  4072
     concrete subclasses."
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  4073
6055
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4074
"/    |num count|
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4075
"/
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4076
"/    num := self.
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4077
"/    count := n.
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4078
"/    [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
  4079
"/        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
  4080
"/        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
  4081
"/    ].
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4082
"/    ^ num \\ 256
159
514c749165c3 *** empty log message ***
claus
parents: 132
diff changeset
  4083
514c749165c3 *** empty log message ***
claus
parents: 132
diff changeset
  4084
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4085
     16r44332211 digitAt:1
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4086
     16r44332211 digitAt:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4087
     16r44332211 digitAt:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4088
     16r44332211 digitAt:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4089
     16r44332211 digitAt:5
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4090
     16r00332211 digitAt:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4091
     16r00332211 digitAt:5
159
514c749165c3 *** empty log message ***
claus
parents: 132
diff changeset
  4092
    "
6055
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4093
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4094
    "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
  4095
!
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4096
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4097
digitByteAt:n
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4098
    "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
  4099
     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
  4100
     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
  4101
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4102
    self subclassResponsibility
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4103
e4d5016bad38 no need for #digitAt: here - it ought to be redefined in ALL
Claus Gittinger <cg@exept.de>
parents: 5988
diff changeset
  4104
    "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
  4105
    "Modified: / 26.9.2001 / 21:20:19 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4106
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4107
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4108
digitLength
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4109
    "return the number of bytes needed for the binary representation
2816
62edd11b5e66 commentary
Claus Gittinger <cg@exept.de>
parents: 2794
diff changeset
  4110
     of the receiver.
62edd11b5e66 commentary
Claus Gittinger <cg@exept.de>
parents: 2794
diff changeset
  4111
     This method is redefined in concrete classes - the fallback here is
62edd11b5e66 commentary
Claus Gittinger <cg@exept.de>
parents: 2794
diff changeset
  4112
     never really used."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4113
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4114
    ^ (self log:256) ceiling asInteger
2816
62edd11b5e66 commentary
Claus Gittinger <cg@exept.de>
parents: 2794
diff changeset
  4115
62edd11b5e66 commentary
Claus Gittinger <cg@exept.de>
parents: 2794
diff changeset
  4116
    "Modified: 31.7.1997 / 13:19:06 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4117
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4118
13725
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4119
exponent
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4120
    "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
  4121
     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
  4122
     This assumes that the mantissa is normalized to
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4123
     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
  4124
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4125
    ^ self abs highBit
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4126
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4127
    "
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4128
     self assert:( 1.0 exponent = 1 exponent ).
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4129
     self assert:( 2.0 exponent = 2 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4130
     self assert:( 3.0 exponent = 3 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4131
     self assert:( 4.0 exponent = 4 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4132
     self assert:( 12345.0 exponent = 12345 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4133
     self assert:( 0.0 exponent = 0 exponent ).   
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4134
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4135
     self assert:( -1.0 exponent = -1 exponent ).
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4136
     self assert:( -2.0 exponent = -2 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4137
     self assert:( -3.0 exponent = -3 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4138
     self assert:( -4.0 exponent = -4 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4139
     self assert:( -12345.0 exponent = -12345 exponent ).  
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4140
    "
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4141
!
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4142
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4143
isInteger
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4144
    "return true, if the receiver is some kind of integer number"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4145
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4146
    ^ true
3036
f2d332547db7 added #isPowerOf2
Claus Gittinger <cg@exept.de>
parents: 2951
diff changeset
  4147
!
f2d332547db7 added #isPowerOf2
Claus Gittinger <cg@exept.de>
parents: 2951
diff changeset
  4148
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4149
isLiteral
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4150
    "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
  4151
     (i.e. can be used in constant arrays)"
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4152
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4153
    ^ true
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4154
!
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4155
9134
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4156
isPowerOf:p
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4157
    "return true, if the receiver is a power of p"
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4158
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4159
    p == 2 ifTrue:[ ^ self isPowerOfTwo].
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4160
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4161
    "/ the following is a q&d hack, using existing code.
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4162
    ^ (Integer
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4163
        readFromString:(self printStringRadix:p)
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4164
        radix:2
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4165
        onError:-1) isPowerOfTwo
9134
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4166
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4167
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4168
     16r0000000000000000 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4169
     16r0000004000000000 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4170
     16r0000004000000001 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4171
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4172
     16r0000000000000001 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4173
     16r0000000000000002 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4174
     16r0000000000000004 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4175
     16r0000000000000008 isPowerOf:2
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4176
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4177
     16r0000000000000001 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4178
     16r0000000000000002 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4179
     16r0000000000000004 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4180
     16r0000000000000008 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4181
     16r0000000000000010 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4182
     16r0000000000000020 isPowerOf:4
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4183
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4184
     3r0000000000000001 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4185
     3r0000000000000010 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4186
     3r0000000000000100 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4187
     3r0000000000001000 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4188
     3r0000000000001001 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4189
     3r0000000000002000 isPowerOf:3
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4190
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4191
     10 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4192
     20 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4193
     100 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4194
     110 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4195
     200 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4196
     1000 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4197
     10000 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4198
     100000 isPowerOf:10
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4199
     100001 isPowerOf:10
9134
98d5bfd1cc51 +isPowerOf:
Claus Gittinger <cg@exept.de>
parents: 9126
diff changeset
  4200
 "
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4201
!
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4202
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4203
isPowerOfTwo
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4204
    "return true, if the receiver is a power of 2"
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4205
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4206
    "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
  4207
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4208
    |maxBytes "{ Class: SmallInteger }"|
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4209
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4210
    maxBytes := self digitLength.
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4211
    (self digitAt:maxBytes) isPowerOfTwo ifFalse:[^ false].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4212
    1 to:maxBytes-1 do:[:byteIndex |
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4213
        (self digitAt:byteIndex) ~~ 0 ifTrue:[^ false].
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
    ^ true
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4216
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
     10000 factorial isPowerOfTwo  
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4219
     |n| n := 10000 factorial. Time millisecondsToRun:[1000 timesRepeat:[ n isPowerOfTwo]] 
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4220
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4221
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4222
     (2 raisedTo:10000) isPowerOfTwo  
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4223
     |n| n := (2 raisedTo:10000). Time millisecondsToRun:[1000 timesRepeat:[ n isPowerOfTwo]] 
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4224
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4225
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4226
    "Modified: / 20-06-2011 / 12:43:05 / cg"
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4227
!
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
isPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4230
    "return true if I am a prime Number.
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4231
     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
  4232
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4233
    |limit firstFewPrimes|
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4234
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4235
    self even ifTrue:[^ self == 2 ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4236
    self == 1 ifTrue:[^ false ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4237
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4238
    self <= (PrimeCache size*2) ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4239
        ^ PrimeCache at:self//2.
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4240
    ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4241
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4242
    limit := self sqrt.
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4243
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4244
    firstFewPrimes := self class primesUpTo2000.
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4245
    firstFewPrimes do:[:p |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4246
        p > limit ifTrue:[^ true].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4247
        (self \\ p) == 0 ifTrue:[ ^ false ].
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4248
    ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4249
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4250
    (firstFewPrimes last+2) to:limit by:2 do:[:i |
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4251
        (self \\ i) == 0 ifTrue:[ ^ false ].
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4252
    ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4253
    ^ true
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4254
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4255
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4256
     Integer primesUpTo:1000
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4257
     (1 to:1000000) count:[:n | n isPrime] 78498
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4258
     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
  4259
     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
  4260
     Time millisecondsToRun:[ (1 to:1000000) count:[:n | n isPrime]] 343    with primeCache
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4261
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4262
!
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4263
14677
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4264
nextMultipleOf: n
14680
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4265
    "return the multiple of n at or above the receiver.
16800
45ef192ee95f class: Integer
Claus Gittinger <cg@exept.de>
parents: 16723
diff changeset
  4266
     Useful for padding, aligning or rounding,
45ef192ee95f class: Integer
Claus Gittinger <cg@exept.de>
parents: 16723
diff changeset
  4267
     expecially when reading aligned binary data."
14677
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4268
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4269
    |rest|
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4270
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4271
    rest := self \\ n.
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4272
    rest == 0 ifTrue:[ ^ self ].
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4273
    ^ self + (n - rest)
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4274
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4275
    "
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4276
     1 nextMultipleOf: 4  
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4277
     2 nextMultipleOf: 4  
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4278
     3 nextMultipleOf: 4  
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4279
     4 nextMultipleOf: 4  
16800
45ef192ee95f class: Integer
Claus Gittinger <cg@exept.de>
parents: 16723
diff changeset
  4280
     5 nextMultipleOf: 4  
14677
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4281
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4282
     22 nextMultipleOf: 4 
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4283
    "
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4284
!
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  4285
14680
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4286
nextPowerOf2
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4287
    "return the power of 2 at or above the receiver.
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4288
     Useful for padding."
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4289
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4290
    |x t sh|
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
    x := self - 1.
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4293
    x := x bitOr: (x bitShift: -1).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4294
    x := x bitOr: (x bitShift: -2).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4295
    x := x bitOr: (x bitShift: -4).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4296
    x := x bitOr: (x bitShift: -8).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4297
    x := x bitOr: (t := x bitShift: -16).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4298
    t == 0 ifFalse:[
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4299
        sh := -32.
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4300
        [
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4301
            x := x bitOr: (t := x bitShift: sh).
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4302
            sh := sh + sh. 
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4303
        ] doWhile: [t ~~ 0]
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
    ^ x + 1 
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4306
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4307
    "
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4308
     1 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4309
     2 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4310
     3 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4311
     4 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4312
     5 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4313
     6 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4314
     7 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4315
     8 nextPowerOf2    
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4316
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4317
     22 nextPowerOf2
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4318
     12 factorial nextPowerOf2  isPowerOf:2  
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4319
     100 factorial nextPowerOf2  isPowerOf:2  
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4320
     1000 factorial nextPowerOf2  isPowerOf:2  
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4321
    "
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4322
!
eb312d015dd6 class: Integer
Claus Gittinger <cg@exept.de>
parents: 14677
diff changeset
  4323
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4324
nextPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4325
    "return the next prime after the receiver"
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4326
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4327
    |num|
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4328
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4329
    num := self + 1.
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4330
    num even ifTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4331
        num == 2 ifTrue:[^ num].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4332
        num := num + 1
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4333
    ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4334
    [num isPrime] whileFalse:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4335
        num := num + 2
13815
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4336
    ].
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4337
    ^ num
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4338
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4339
    "
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4340
     1 nextPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4341
     22 nextPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4342
     37 nextPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4343
     36 nextPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4344
     3456737 nextPrime
a03b833fb6f8 category of:
Claus Gittinger <cg@exept.de>
parents: 13725
diff changeset
  4345
    "
13905
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4346
!
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4347
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4348
parityOdd
13914
725916ddad3f comment/format
Claus Gittinger <cg@exept.de>
parents: 13907
diff changeset
  4349
    "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
  4350
     (i.e. true for odd parity)
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4351
     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
  4352
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4353
    ^ self bitCount odd
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4354
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4355
    "
13907
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4356
     0 parityOdd    
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4357
     1 parityOdd    
13907
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4358
     2 parityOdd    
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4359
     4 parityOdd    
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4360
     5 parityOdd    
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4361
     7 parityOdd    
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4362
     33 parityOdd   
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4363
     6 parityOdd    
13905
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4364
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4365
     1 to:1000000 do:[:n |
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4366
        self assert:(n parityOdd = ((n printStringRadix:2) occurrencesOf:$1) odd).
13905
7eb024efb58a added: #parity
Claus Gittinger <cg@exept.de>
parents: 13815
diff changeset
  4367
     ]
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4368
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4369
     0 to:255 do:[:n |
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4370
        |p|
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4371
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4372
        p := 
13907
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4373
            (((((((((n rightShift: 7) 
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4374
            bitXor: (n rightShift: 6)) 
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4375
                bitXor: (n rightShift: 5))
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4376
                    bitXor: (n rightShift: 4))
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4377
                        bitXor: (n rightShift: 3))
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4378
                            bitXor: (n rightShift: 2))
13907
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4379
                                bitXor: (n rightShift: 1))
5135b15eebab comment/format in: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13906
diff changeset
  4380
                                    bitXor: n) bitAnd:1) == 1.
13906
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4381
        self assert:(n parityOdd = p).
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4382
     ]
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4383
    "
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4384
5543bafd72a9 added: #parityOdd
Claus Gittinger <cg@exept.de>
parents: 13905
diff changeset
  4385
    "Created: / 09-01-2012 / 17:18:06 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4386
! !
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  4387
16293
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4388
!Integer methodsFor:'special modulo arithmetic'!
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4389
12605
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4390
add_32:anInteger
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4391
    "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
  4392
     Both must be either Small- or LargeIntegers.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4393
     Returns a signed 32bit number.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4394
     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
  4395
     modulu operations with C semantics."
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4396
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4397
%{  /* NOCONTEXT */
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4398
    int val1, val2, rslt;
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
    if (__isSmallInteger(self)) {
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4401
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4402
    } else {
12605
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4403
        val1 = __longIntVal(self);
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4404
        if (!val1) goto bad;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4405
    }
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4406
    if (__isSmallInteger(anInteger)) {
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4407
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4408
    } else {
12605
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4409
        val2 = __longIntVal(anInteger);
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4410
        if (!val2) goto bad;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4411
    }
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4412
    rslt = val1 + val2;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4413
    RETURN(__MKINT(rslt));
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4414
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4415
  bad: ;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4416
%}.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4417
    self primitiveFailed.
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
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4420
add_32u:anInteger
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4421
    "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
  4422
     Both must be either Small- or LargeIntegers.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4423
     Returns an unsigned 32bit number.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4424
     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
  4425
     modulu operations with C semantics."
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4426
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4427
%{  /* NOCONTEXT */
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4428
    int val1, val2, rslt;
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
    if (__isSmallInteger(self)) {
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4431
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4432
    } else {
12605
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4433
        val1 = __longIntVal(self);
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4434
        if (!val1) goto bad;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4435
    }
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4436
    if (__isSmallInteger(anInteger)) {
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4437
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4438
    } else {
12605
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4439
        val2 = __longIntVal(anInteger);
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4440
        if (!val2) goto bad;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4441
    }
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4442
    rslt = val1 + val2;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4443
    RETURN(__MKUINT((unsigned)rslt));
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4444
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4445
  bad: ;
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4446
%}.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4447
    self primitiveFailed.
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4448
!
9bf77c63d4b2 added:8 methods for 32bit modulu arithmetic
Claus Gittinger <cg@exept.de>
parents: 12588
diff changeset
  4449
13725
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4450
mul_32:anInteger
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4451
    "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
  4452
     Both must be either Small- or LargeIntegers.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4453
     Returns a signed 32bit number.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4454
     This (nonstandard) specialized method is provided to allow simulation of
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4455
     modulu operations with C semantics."
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4456
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4457
%{  /* NOCONTEXT */
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4458
    int val1, val2, rslt;
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
    if (__isSmallInteger(self)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4461
        val1 = __intVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4462
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4463
        val1 = __longIntVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4464
        if (!val1) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4465
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4466
    if (__isSmallInteger(anInteger)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4467
        val2 = __intVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4468
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4469
        val2 = __longIntVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4470
        if (!val2) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4471
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4472
    rslt = val1 * val2;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4473
    RETURN(__MKINT(rslt));
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4474
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4475
  bad: ;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4476
%}.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4477
    self primitiveFailed.
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
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4480
mul_32u:anInteger
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4481
    "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
  4482
     Both must be either Small- or LargeIntegers.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4483
     Returns an unsigned 32bit number.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4484
     This (nonstandard) specialized method is provided to allow simulation of
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4485
     modulu operations with C semantics."
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4486
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4487
%{  /* NOCONTEXT */
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4488
    int val1, val2, rslt;
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
    if (__isSmallInteger(self)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4491
        val1 = __intVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4492
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4493
        val1 = __longIntVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4494
        if (!val1) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4495
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4496
    if (__isSmallInteger(anInteger)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4497
        val2 = __intVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4498
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4499
        val2 = __longIntVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4500
        if (!val2) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4501
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4502
    rslt = val1 * val2;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4503
    RETURN(__MKUINT((unsigned)rslt));
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4504
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4505
  bad: ;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4506
%}.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4507
    self primitiveFailed.
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
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4510
sub_32:anInteger
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4511
    "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
  4512
     Both must be either Small- or LargeIntegers.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4513
     Returns a signed 32bit number.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4514
     This (nonstandard) specialized method is provided to allow simulation of
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4515
     modulu operations with C semantics."
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4516
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4517
%{  /* NOCONTEXT */
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4518
    int val1, val2, rslt;
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
    if (__isSmallInteger(self)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4521
        val1 = __intVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4522
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4523
        val1 = __longIntVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4524
        if (!val1) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4525
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4526
    if (__isSmallInteger(anInteger)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4527
        val2 = __intVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4528
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4529
        val2 = __longIntVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4530
        if (!val2) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4531
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4532
    rslt = val1 - val2;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4533
    RETURN(__MKINT(rslt));
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4534
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4535
  bad: ;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4536
%}.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4537
    self primitiveFailed.
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
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4540
sub_32u:anInteger
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4541
    "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
  4542
     Both must be either Small- or LargeIntegers.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4543
     Returns an unsigned 32bit number.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4544
     This (nonstandard) specialized method is provided to allow simulation of
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4545
     modulu operations with C semantics."
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4546
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4547
%{  /* NOCONTEXT */
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4548
    int val1, val2, rslt;
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
    if (__isSmallInteger(self)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4551
        val1 = __intVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4552
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4553
        val1 = __longIntVal(self);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4554
        if (!val1) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4555
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4556
    if (__isSmallInteger(anInteger)) {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4557
        val2 = __intVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4558
    } else {
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4559
        val2 = __longIntVal(anInteger);
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4560
        if (!val2) goto bad;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4561
    }
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4562
    rslt = val1 - val2;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4563
    RETURN(__MKUINT((unsigned)rslt));
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4564
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4565
  bad: ;
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4566
%}.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4567
    self primitiveFailed.
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4568
! !
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4569
16293
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4570
!Integer methodsFor:'special modulo bit operators'!
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
asSigned32
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4573
    "return a 32-bit integer with my bit-pattern. For protocol completeness."
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4574
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4575
    ^ self
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
asUnsigned32
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4579
    "return a 32-bit integer with my bit-pattern, but positive.
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4580
     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
  4581
     convert C/Java numbers."
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4582
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4583
    self < 0 ifTrue:[
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4584
        ^ 16r100000000 + self
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4585
    ].
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4586
    ^ self
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4587
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
     (-1 asUnsigned32) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4590
     1 asUnsigned32
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4591
     (SmallInteger minVal asUnsigned32) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4592
     (SmallInteger maxVal asUnsigned32) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4593
    "
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
asUnsigned64
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4597
    "return a 64-bit integer with my bit-pattern, but positive.
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4598
     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
  4599
     convert C/Java numbers."
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4600
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4601
    self < 0 ifTrue:[
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4602
        ^ 16r10000000000000000 + self
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4603
    ].
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4604
    ^ self
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4605
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4606
    "
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4607
     (-1 asUnsigned64) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4608
     1 asUnsigned64
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4609
     (SmallInteger minVal asUnsigned64) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4610
     (SmallInteger maxVal asUnsigned64) hexPrintString
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4611
    "
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4612
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4613
    "Created: / 26-07-2013 / 13:45:11 / cg"
0eb93c6dd384 class: Integer
Claus Gittinger <cg@exept.de>
parents: 16120
diff changeset
  4614
!
13725
90db4d7613ee category of:15 methods
Claus Gittinger <cg@exept.de>
parents: 13718
diff changeset
  4615
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4616
bitAnd_32:anInteger
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4617
    "return a C-semantic 32bit locical-and of the receiver and
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4618
     the argument. Both must be either Small- or LargeIntegers.
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4619
     Returns a signed 32bit number.
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4620
     This (nonstandard) specialized method is provided to allow simulation of
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4621
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4622
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4623
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4624
    int val1, val2, rslt;
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
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4627
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4628
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4629
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4630
        if (!val1) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4631
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4632
    if (__isSmallInteger(anInteger)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4633
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4634
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4635
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4636
        if (!val2) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4637
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4638
    rslt = val1 & val2;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4639
    RETURN(__MKINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4640
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4641
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4642
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4643
    self primitiveFailed.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4644
!
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4645
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4646
bitAnd_32u:anInteger
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4647
    "return a C-semantic 32bit locical-and of the receiver and
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4648
     the argument. Both must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4649
     Returns an unsigned 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4650
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4651
     bit operations with C semantics."
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4652
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4653
%{  /* NOCONTEXT */
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4654
    int val1, val2, rslt;
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4655
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4656
    if (__isSmallInteger(self)) {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4657
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4658
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4659
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4660
        if (!val1) goto bad;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4661
    }
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4662
    if (__isSmallInteger(anInteger)) {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4663
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4664
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4665
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4666
        if (!val2) goto bad;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4667
    }
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4668
    rslt = val1 & val2;
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4669
    RETURN(__MKUINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4670
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4671
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4672
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4673
    self primitiveFailed.
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
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4676
bitInvert_32
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4677
    "return a C-semantic 32bit complement of the receiver,
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4678
     which must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4679
     Returns a signed 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4680
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4681
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4682
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4683
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4684
    int val, rslt;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4685
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4686
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4687
        val = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4688
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4689
        val = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4690
        if (!val) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4691
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4692
    rslt = ~val;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4693
    RETURN(__MKINT(rslt));
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4694
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4695
  bad: ;
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4696
%}.
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4697
    self primitiveFailed.
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4698
!
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4699
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4700
bitInvert_32u
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4701
    "return a C-semantic 32bit complement of the receiver,
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4702
     which must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4703
     Returns an unsigned 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4704
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4705
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4706
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4707
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4708
    int val, rslt;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4709
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4710
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4711
        val = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4712
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4713
        val = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4714
        if (!val) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4715
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4716
    rslt = ~val;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4717
    RETURN(__MKUINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4718
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4719
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4720
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4721
    self primitiveFailed.
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
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4724
bitOr_32:anInteger
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4725
    "return a C-semantic 32bit locical-or of the receiver and
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4726
     the argument. Both must be either Small- or LargeIntegers.
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4727
     Returns a signed 32bit number.
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4728
     This (nonstandard) specialized method is provided to allow simulation of
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4729
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4730
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4731
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4732
    int val1, val2, rslt;
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
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4735
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4736
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4737
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4738
        if (!val1) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4739
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4740
    if (__isSmallInteger(anInteger)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4741
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4742
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4743
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4744
        if (!val2) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4745
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4746
    rslt = val1 | val2;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4747
    RETURN(__MKINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4748
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4749
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4750
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4751
    self primitiveFailed.
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
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4754
bitOr_32u:anInteger
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4755
    "return a C-semantic 32bit locical-or of the receiver and
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4756
     the argument. Both must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4757
     Returns an unsigned 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4758
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4759
     bit operations with C semantics."
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4760
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4761
%{  /* NOCONTEXT */
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4762
    int val1, val2, rslt;
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4763
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4764
    if (__isSmallInteger(self)) {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4765
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4766
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4767
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4768
        if (!val1) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4769
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4770
    if (__isSmallInteger(anInteger)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4771
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4772
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4773
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4774
        if (!val2) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4775
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4776
    rslt = val1 | val2;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4777
    RETURN(__MKUINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4778
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4779
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4780
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4781
    self primitiveFailed.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4782
!
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4783
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4784
bitXor_32:anInteger
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4785
    "return a C-semantic 32bit locical-xor of the receiver and
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4786
     the argument. Both must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4787
     Returns a signed 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4788
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4789
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4790
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4791
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4792
    int val1, val2, rslt;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4793
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4794
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4795
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4796
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4797
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4798
        if (!val1) goto bad;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4799
    }
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4800
    if (__isSmallInteger(anInteger)) {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4801
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4802
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4803
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4804
        if (!val2) goto bad;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4805
    }
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4806
    rslt = val1 ^ val2;
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4807
    RETURN(__MKINT(rslt));
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4808
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4809
  bad: ;
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4810
%}.
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4811
    self primitiveFailed.
12255
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
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4814
bitXor_32u:anInteger
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4815
    "return a C-semantic 32bit locical-xor of the receiver and
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4816
     the argument. Both must be either Small- or LargeIntegers.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4817
     Returns an unsigned 32bit number.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4818
     This (nonstandard) specialized method is provided to allow simulation of
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4819
     bit operations with C semantics."
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4820
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4821
%{  /* NOCONTEXT */
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4822
    int val1, val2, rslt;
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
    if (__isSmallInteger(self)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4825
        val1 = __intVal(self);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4826
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4827
        val1 = __longIntVal(self);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4828
        if (!val1) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4829
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4830
    if (__isSmallInteger(anInteger)) {
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4831
        val2 = __intVal(anInteger);
12652
840f87f12979 changed:14 methods
Claus Gittinger <cg@exept.de>
parents: 12605
diff changeset
  4832
    } else {
12255
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4833
        val2 = __longIntVal(anInteger);
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4834
        if (!val2) goto bad;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4835
    }
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4836
    rslt = val1 ^ val2;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4837
    RETURN(__MKUINT(rslt));
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4838
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4839
  bad: ;
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4840
%}.
80362b5e0067 added:6 methods
Claus Gittinger <cg@exept.de>
parents: 12147
diff changeset
  4841
    self primitiveFailed.
2458
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4842
! !
4f29a9dd12fe checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2457
diff changeset
  4843
4653
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4844
!Integer methodsFor:'tracing'!
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4845
4682
4158042a9c8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4653
diff changeset
  4846
traceInto:aRequestor level:level from:referrer
4653
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4847
    "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
  4848
4682
4158042a9c8c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 4653
diff changeset
  4849
    ^ aRequestor traceInteger:self level:level from:referrer
4653
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4850
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4851
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4852
! !
b3d38149fbde added #hasSharedInstances & tracing support
Claus Gittinger <cg@exept.de>
parents: 4643
diff changeset
  4853
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4854
!Integer methodsFor:'truncation & rounding'!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4855
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4856
ceiling
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4857
    "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
  4858
     For integers, this is the receiver itself."
345
claus
parents: 328
diff changeset
  4859
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4860
    ^ self
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4861
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4862
    "Modified: 18.7.1996 / 12:44:06 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4863
!
345
claus
parents: 328
diff changeset
  4864
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4865
compressed
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4866
    "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
  4867
     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
  4868
     zeros removed. This method is redefined in LargeInteger."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4869
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4870
    ^ self
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4871
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4872
    "Modified: 5.11.1996 / 14:07:41 / cg"
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  4873
!
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  4874
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4875
floor
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4876
    "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
  4877
     For integers, this is the receiver itself."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4878
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4879
    ^ self
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4880
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4881
    "Modified: 18.7.1996 / 12:44:00 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4882
!
202
40ca7cc6fb9c *** empty log message ***
claus
parents: 159
diff changeset
  4883
1866
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4884
fractionPart
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4885
    "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
  4886
     (i.e. the receiver minus its truncated value)
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4887
     Since integers have no fraction, return 0 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
    ^ 0
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 fractionPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4893
     1.2345e6 fractionPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4894
     1000 fractionPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4895
     10000000000000000 fractionPart
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:27:44 / 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
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4901
integerPart
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4902
    "return a number with value from digits before the decimal point.
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4903
     (i.e. the receivers truncated value)
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4904
     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
  4905
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4906
    ^ self
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4907
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4908
    "
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4909
     1234.56789 integerPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4910
     1.2345e6 integerPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4911
     1000 integerPart
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4912
     10000000000000000 integerPart
1866
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4913
    "
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4914
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4915
    "Modified: 4.11.1996 / 20:28:22 / cg"
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4916
!
225afe414934 added fractionPart & integerPart for protocol completeness
Claus Gittinger <cg@exept.de>
parents: 1842
diff changeset
  4917
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4918
normalize
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4919
    "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
  4920
     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
  4921
     zeros removed.
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4922
     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
  4923
     renamed to #compressed for ST-80 compatibility."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4924
9261
275c3c6392ed mark obsolete method
Stefan Vogel <sv@exept.de>
parents: 9141
diff changeset
  4925
    <resource: #obsolete>
275c3c6392ed mark obsolete method
Stefan Vogel <sv@exept.de>
parents: 9141
diff changeset
  4926
1883
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4927
    ^ self compressed
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4928
d3fbf4b36be7 renamed #normalize to #compressed (ST_80 compat)
Claus Gittinger <cg@exept.de>
parents: 1866
diff changeset
  4929
    "Modified: 5.11.1996 / 14:08:24 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4930
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  4931
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4932
rounded
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4933
    "return the receiver rounded toward the next Integer -
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4934
     for integers this is the receiver itself."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4935
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4936
    ^ self
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4937
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4938
    "Modified: 18.7.1996 / 12:44:24 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4939
!
69
4564b6328136 *** empty log message ***
claus
parents: 54
diff changeset
  4940
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4941
truncated
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  4942
    "return the receiver truncated towards zero as Integer
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4943
     for integers this is the receiver itself."
159
514c749165c3 *** empty log message ***
claus
parents: 132
diff changeset
  4944
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4945
    ^ self
1558
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4946
864bddaf96e8 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  4947
    "Modified: 18.7.1996 / 12:44:33 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  4948
! !
569
7134eb78cf48 readFrom:onError: can now also read from a string
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  4949
8394
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4950
!Integer methodsFor:'visiting'!
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4951
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4952
acceptVisitor:aVisitor with:aParameter
16723
12737e7310ae comment/format only
Claus Gittinger <cg@exept.de>
parents: 16379
diff changeset
  4953
    "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
  4954
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4955
    ^ aVisitor visitInteger:self with:aParameter
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4956
! !
da194de43766 Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 8335
diff changeset
  4957
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4958
!Integer::ModuloNumber class methodsFor:'documentation'!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4959
4803
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4960
copyright
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4961
"
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4962
 COPYRIGHT (c) 1999 by eXept Software AG
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4963
              All Rights Reserved
4803
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4964
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4965
 This software is furnished under a license and may be used
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4966
 only in accordance with the terms of that license and with the
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4967
 inclusion of the above copyright notice.   This software may not
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4968
 be provided or otherwise made available to, or used by, any
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4969
 other person.  No title to or ownership of the software is
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4970
 hereby transferred.
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4971
"
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4972
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4973
!
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4974
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4975
documentation
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4976
"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4977
    This is a helper class to perform fast computation of the modulus.
4609
6a1819c7a743 comment
Claus Gittinger <cg@exept.de>
parents: 4522
diff changeset
  4978
    (with big numbers, this does make a difference)
4803
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4979
47355eb08e99 comment
Claus Gittinger <cg@exept.de>
parents: 4801
diff changeset
  4980
    WARNING: this does only work with numbers which have no common
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4981
             divisor (which is true for cryptographic applications).
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4982
             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
  4983
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4984
    [author:]
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4985
        Stefan Vogel
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4986
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4987
    [see also:]
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4988
        Integer SmallInteger LargeInsteger
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
    [instance variables:]
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4991
        modulus       the modulus
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4992
        reciprocal    reciprocal of the modulus
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4993
        shift         shift count to cut off some bits
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4994
"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4995
!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4996
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4997
examples
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  4998
"
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  4999
                                                                [exBegin]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5000
        17 asModuloNumber modulusOf:38
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5001
                                                                [exEnd]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5002
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5003
                                                                [exBegin]
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5004
        38 \\ 17
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5005
                                                                [exEnd]
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5006
"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5007
! !
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5008
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5009
!Integer::ModuloNumber class methodsFor:'instance creation'!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5010
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5011
modulus:anInteger
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5012
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5013
    ^ self new modulus:anInteger
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5014
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5015
    "Created: / 3.5.1999 / 11:13:15 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5016
    "Modified: / 3.5.1999 / 11:18:37 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5017
! !
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5018
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5019
!Integer::ModuloNumber methodsFor:'accessing'!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5020
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5021
modulus
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5022
    "return the modulus"
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5023
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5024
    ^ modulus
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5025
!
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5026
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5027
modulus:n
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5028
    "set the modulus"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5029
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5030
    modulus := n.
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5031
    reciprocal := n integerReciprocal.
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5032
    shift := n highBit negated.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5033
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5034
    "Created: / 3.5.1999 / 10:02:39 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5035
    "Modified: / 3.5.1999 / 14:30:49 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5036
! !
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5037
5238
f7a816a660a3 categories
Claus Gittinger <cg@exept.de>
parents: 5210
diff changeset
  5038
!Integer::ModuloNumber methodsFor:'arithmetic'!
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5039
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5040
modulusOf:aNumber
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5041
    "compute the aNumber modulo myself.
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5042
     The shortcut works only, if aNumber is < modulo * modulo
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5043
     (When doing arithmethic modulo something).
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5044
     Otherwise do it the long way"
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5045
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5046
    |e t cnt|
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5047
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5048
    "throw off low nbits(modulus)"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5049
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  5050
    e := aNumber bitShift:shift.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5051
    e := e * reciprocal.
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  5052
    e := e bitShift:shift.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5053
    e := e * modulus.
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5054
    e := aNumber - e.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5055
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5056
    "this subtract is done max 2 times"
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5057
    cnt := 2.
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5058
    [(t := e - modulus) >= 0] whileTrue:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5059
        e := t.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5060
        cnt == 0 ifTrue:[
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5061
            "shortcut didn't work, do it the long way"
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5062
            ^ e \\ modulus.
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5063
        ].
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5064
        cnt := cnt - 1.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5065
    ].
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5066
    ^ e.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5067
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5068
    "
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5069
     |m|
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5070
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5071
     m := self new modulus:7.
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5072
     m modulusOf:55.
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5073
    "
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5074
4971
aed19001173f Fix ModuloNumber for large numbers.
Stefan Vogel <sv@exept.de>
parents: 4952
diff changeset
  5075
    "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
  5076
     |m|
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5077
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5078
     m := self new modulus:7.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5079
     m modulusOf:123456789901398721398721931729371293712943794254034548369328469438562948623498659238469234659823469823658423659823658.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5080
    "
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5081
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5082
    "SLOW (using standard \\ operation):
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5083
     |m|
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5084
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5085
     m := 123456789901398721398721931729371293712943794254034548369328469438562948623498659238469234659823469823658423659823658.
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5086
     Time millisecondsToRun:[
15841
7c222b07168f class: Integer
Stefan Vogel <sv@exept.de>
parents: 15775
diff changeset
  5087
        100000 timesRepeat:[
15559
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5088
            874928459437598375937451931729371293712943794254034548369328469438562948623498659238469234659823469823658423659823658 \\ m
ce8f0cd2024d class: Integer
Claus Gittinger <cg@exept.de>
parents: 15558
diff changeset
  5089
        ]
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5090
     ]
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  5091
    "
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5092
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5093
    "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
  5094
     |m|
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5095
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5096
     m := self new modulus:123456789901398721398721931729371293712943794254034548369328469438562948623498659238469234659823469823658423659823658.
15902
873997dcf4cf AbortSignal -> AbortOperationRequest
Stefan Vogel <sv@exept.de>
parents: 15841
diff changeset
  5097
    m modulusOf:874928459437598375937451931729371293712943794254034548369328469438562948623498659238469234659823469823658423659823658.
873997dcf4cf AbortSignal -> AbortOperationRequest
Stefan Vogel <sv@exept.de>
parents: 15841
diff changeset
  5098
10730930127807326146398409623772237722337234475792709784029183368622308259008044569184592041059181058049458041058052     ]
11587
deec7da18100 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 11582
diff changeset
  5099
    "
4801
edf02501d5e2 comment about divisor-size vs. dividend-size in ModuloNumber
Claus Gittinger <cg@exept.de>
parents: 4682
diff changeset
  5100
4142
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5101
    "Modified: / 3.5.1999 / 14:30:32 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5102
! !
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5103
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5104
!Integer::ModuloNumber methodsFor:'converting'!
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5105
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5106
asModuloNumber
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5107
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5108
    ^ self
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5109
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5110
    "Created: / 3.5.1999 / 14:48:27 / stefan"
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5111
! !
a881cc4bfaec Make ModuloNumber a private class.
Stefan Vogel <sv@exept.de>
parents: 4141
diff changeset
  5112
1842
b28609c73839 added divMod: for faster largeNumber printString generation.
Claus Gittinger <cg@exept.de>
parents: 1700
diff changeset
  5113
!Integer class methodsFor:'documentation'!
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  5114
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 569
diff changeset
  5115
version
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  5116
    ^ '$Header: /cvs/stx/stx/libbasic/Integer.st,v 1.310 2015-05-20 16:01:16 cg Exp $'
12122
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  5117
!
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  5118
Claus Gittinger <cg@exept.de>
parents: 11945
diff changeset
  5119
version_CVS
18380
fb43eb504bde class: Integer
Claus Gittinger <cg@exept.de>
parents: 18230
diff changeset
  5120
    ^ '$Header: /cvs/stx/stx/libbasic/Integer.st,v 1.310 2015-05-20 16:01:16 cg Exp $'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  5121
! !
6858
13919a7544b6 raisedToInteger pushed up
Claus Gittinger <cg@exept.de>
parents: 6682
diff changeset
  5122
14677
9f2ca6ba577f class: Integer
Claus Gittinger <cg@exept.de>
parents: 14491
diff changeset
  5123
4996
c3716cebe47b added a bcdConversionErrorSignal
Claus Gittinger <cg@exept.de>
parents: 4973
diff changeset
  5124
Integer initialize!