OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgo/] [go/] [math/] [big/] [nat.go] - Blame information for rev 747

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 747 jeremybenn
// Copyright 2009 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
4
 
5
// Package big implements multi-precision arithmetic (big numbers).
6
// The following numeric types are supported:
7
//
8
//      - Int   signed integers
9
//      - Rat   rational numbers
10
//
11
// Methods are typically of the form:
12
//
13
//      func (z *Int) Op(x, y *Int) *Int        (similar for *Rat)
14
//
15
// and implement operations z = x Op y with the result as receiver; if it
16
// is one of the operands it may be overwritten (and its memory reused).
17
// To enable chaining of operations, the result is also returned. Methods
18
// returning a result other than *Int or *Rat take one of the operands as
19
// the receiver.
20
//
21
package big
22
 
23
// This file contains operations on unsigned multi-precision integers.
24
// These are the building blocks for the operations on signed integers
25
// and rationals.
26
 
27
import (
28
        "errors"
29
        "io"
30
        "math"
31
        "math/rand"
32
        "sync"
33
)
34
 
35
// An unsigned integer x of the form
36
//
37
//   x = x[n-1]*_B^(n-1) + x[n-2]*_B^(n-2) + ... + x[1]*_B + x[0]
38
//
39
// with 0 <= x[i] < _B and 0 <= i < n is stored in a slice of length n,
40
// with the digits x[i] as the slice elements.
41
//
42
// A number is normalized if the slice contains no leading 0 digits.
43
// During arithmetic operations, denormalized values may occur but are
44
// always normalized before returning the final result. The normalized
45
// representation of 0 is the empty or nil slice (length = 0).
46
//
47
type nat []Word
48
 
49
var (
50
        natOne = nat{1}
51
        natTwo = nat{2}
52
        natTen = nat{10}
53
)
54
 
55
func (z nat) clear() {
56
        for i := range z {
57
                z[i] = 0
58
        }
59
}
60
 
61
func (z nat) norm() nat {
62
        i := len(z)
63
        for i > 0 && z[i-1] == 0 {
64
                i--
65
        }
66
        return z[0:i]
67
}
68
 
69
func (z nat) make(n int) nat {
70
        if n <= cap(z) {
71
                return z[0:n] // reuse z
72
        }
73
        // Choosing a good value for e has significant performance impact
74
        // because it increases the chance that a value can be reused.
75
        const e = 4 // extra capacity
76
        return make(nat, n, n+e)
77
}
78
 
79
func (z nat) setWord(x Word) nat {
80
        if x == 0 {
81
                return z.make(0)
82
        }
83
        z = z.make(1)
84
        z[0] = x
85
        return z
86
}
87
 
88
func (z nat) setUint64(x uint64) nat {
89
        // single-digit values
90
        if w := Word(x); uint64(w) == x {
91
                return z.setWord(w)
92
        }
93
 
94
        // compute number of words n required to represent x
95
        n := 0
96
        for t := x; t > 0; t >>= _W {
97
                n++
98
        }
99
 
100
        // split x into n words
101
        z = z.make(n)
102
        for i := range z {
103
                z[i] = Word(x & _M)
104
                x >>= _W
105
        }
106
 
107
        return z
108
}
109
 
110
func (z nat) set(x nat) nat {
111
        z = z.make(len(x))
112
        copy(z, x)
113
        return z
114
}
115
 
116
func (z nat) add(x, y nat) nat {
117
        m := len(x)
118
        n := len(y)
119
 
120
        switch {
121
        case m < n:
122
                return z.add(y, x)
123
        case m == 0:
124
                // n == 0 because m >= n; result is 0
125
                return z.make(0)
126
        case n == 0:
127
                // result is x
128
                return z.set(x)
129
        }
130
        // m > 0
131
 
132
        z = z.make(m + 1)
133
        c := addVV(z[0:n], x, y)
134
        if m > n {
135
                c = addVW(z[n:m], x[n:], c)
136
        }
137
        z[m] = c
138
 
139
        return z.norm()
140
}
141
 
142
func (z nat) sub(x, y nat) nat {
143
        m := len(x)
144
        n := len(y)
145
 
146
        switch {
147
        case m < n:
148
                panic("underflow")
149
        case m == 0:
150
                // n == 0 because m >= n; result is 0
151
                return z.make(0)
152
        case n == 0:
153
                // result is x
154
                return z.set(x)
155
        }
156
        // m > 0
157
 
158
        z = z.make(m)
159
        c := subVV(z[0:n], x, y)
160
        if m > n {
161
                c = subVW(z[n:], x[n:], c)
162
        }
163
        if c != 0 {
164
                panic("underflow")
165
        }
166
 
167
        return z.norm()
168
}
169
 
170
func (x nat) cmp(y nat) (r int) {
171
        m := len(x)
172
        n := len(y)
173
        if m != n || m == 0 {
174
                switch {
175
                case m < n:
176
                        r = -1
177
                case m > n:
178
                        r = 1
179
                }
180
                return
181
        }
182
 
183
        i := m - 1
184
        for i > 0 && x[i] == y[i] {
185
                i--
186
        }
187
 
188
        switch {
189
        case x[i] < y[i]:
190
                r = -1
191
        case x[i] > y[i]:
192
                r = 1
193
        }
194
        return
195
}
196
 
197
func (z nat) mulAddWW(x nat, y, r Word) nat {
198
        m := len(x)
199
        if m == 0 || y == 0 {
200
                return z.setWord(r) // result is r
201
        }
202
        // m > 0
203
 
204
        z = z.make(m + 1)
205
        z[m] = mulAddVWW(z[0:m], x, y, r)
206
 
207
        return z.norm()
208
}
209
 
210
// basicMul multiplies x and y and leaves the result in z.
211
// The (non-normalized) result is placed in z[0 : len(x) + len(y)].
212
func basicMul(z, x, y nat) {
213
        z[0 : len(x)+len(y)].clear() // initialize z
214
        for i, d := range y {
215
                if d != 0 {
216
                        z[len(x)+i] = addMulVVW(z[i:i+len(x)], x, d)
217
                }
218
        }
219
}
220
 
221
// Fast version of z[0:n+n>>1].add(z[0:n+n>>1], x[0:n]) w/o bounds checks.
222
// Factored out for readability - do not use outside karatsuba.
223
func karatsubaAdd(z, x nat, n int) {
224
        if c := addVV(z[0:n], z, x); c != 0 {
225
                addVW(z[n:n+n>>1], z[n:], c)
226
        }
227
}
228
 
229
// Like karatsubaAdd, but does subtract.
230
func karatsubaSub(z, x nat, n int) {
231
        if c := subVV(z[0:n], z, x); c != 0 {
232
                subVW(z[n:n+n>>1], z[n:], c)
233
        }
234
}
235
 
236
// Operands that are shorter than karatsubaThreshold are multiplied using
237
// "grade school" multiplication; for longer operands the Karatsuba algorithm
238
// is used.
239
var karatsubaThreshold int = 32 // computed by calibrate.go
240
 
241
// karatsuba multiplies x and y and leaves the result in z.
242
// Both x and y must have the same length n and n must be a
243
// power of 2. The result vector z must have len(z) >= 6*n.
244
// The (non-normalized) result is placed in z[0 : 2*n].
245
func karatsuba(z, x, y nat) {
246
        n := len(y)
247
 
248
        // Switch to basic multiplication if numbers are odd or small.
249
        // (n is always even if karatsubaThreshold is even, but be
250
        // conservative)
251
        if n&1 != 0 || n < karatsubaThreshold || n < 2 {
252
                basicMul(z, x, y)
253
                return
254
        }
255
        // n&1 == 0 && n >= karatsubaThreshold && n >= 2
256
 
257
        // Karatsuba multiplication is based on the observation that
258
        // for two numbers x and y with:
259
        //
260
        //   x = x1*b + x0
261
        //   y = y1*b + y0
262
        //
263
        // the product x*y can be obtained with 3 products z2, z1, z0
264
        // instead of 4:
265
        //
266
        //   x*y = x1*y1*b*b + (x1*y0 + x0*y1)*b + x0*y0
267
        //       =    z2*b*b +              z1*b +    z0
268
        //
269
        // with:
270
        //
271
        //   xd = x1 - x0
272
        //   yd = y0 - y1
273
        //
274
        //   z1 =      xd*yd                    + z1 + z0
275
        //      = (x1-x0)*(y0 - y1)             + z1 + z0
276
        //      = x1*y0 - x1*y1 - x0*y0 + x0*y1 + z1 + z0
277
        //      = x1*y0 -    z1 -    z0 + x0*y1 + z1 + z0
278
        //      = x1*y0                 + x0*y1
279
 
280
        // split x, y into "digits"
281
        n2 := n >> 1              // n2 >= 1
282
        x1, x0 := x[n2:], x[0:n2] // x = x1*b + y0
283
        y1, y0 := y[n2:], y[0:n2] // y = y1*b + y0
284
 
285
        // z is used for the result and temporary storage:
286
        //
287
        //   6*n     5*n     4*n     3*n     2*n     1*n     0*n
288
        // z = [z2 copy|z0 copy| xd*yd | yd:xd | x1*y1 | x0*y0 ]
289
        //
290
        // For each recursive call of karatsuba, an unused slice of
291
        // z is passed in that has (at least) half the length of the
292
        // caller's z.
293
 
294
        // compute z0 and z2 with the result "in place" in z
295
        karatsuba(z, x0, y0)     // z0 = x0*y0
296
        karatsuba(z[n:], x1, y1) // z2 = x1*y1
297
 
298
        // compute xd (or the negative value if underflow occurs)
299
        s := 1 // sign of product xd*yd
300
        xd := z[2*n : 2*n+n2]
301
        if subVV(xd, x1, x0) != 0 { // x1-x0
302
                s = -s
303
                subVV(xd, x0, x1) // x0-x1
304
        }
305
 
306
        // compute yd (or the negative value if underflow occurs)
307
        yd := z[2*n+n2 : 3*n]
308
        if subVV(yd, y0, y1) != 0 { // y0-y1
309
                s = -s
310
                subVV(yd, y1, y0) // y1-y0
311
        }
312
 
313
        // p = (x1-x0)*(y0-y1) == x1*y0 - x1*y1 - x0*y0 + x0*y1 for s > 0
314
        // p = (x0-x1)*(y0-y1) == x0*y0 - x0*y1 - x1*y0 + x1*y1 for s < 0
315
        p := z[n*3:]
316
        karatsuba(p, xd, yd)
317
 
318
        // save original z2:z0
319
        // (ok to use upper half of z since we're done recursing)
320
        r := z[n*4:]
321
        copy(r, z)
322
 
323
        // add up all partial products
324
        //
325
        //   2*n     n     0
326
        // z = [ z2  | z0  ]
327
        //   +    [ z0  ]
328
        //   +    [ z2  ]
329
        //   +    [  p  ]
330
        //
331
        karatsubaAdd(z[n2:], r, n)
332
        karatsubaAdd(z[n2:], r[n:], n)
333
        if s > 0 {
334
                karatsubaAdd(z[n2:], p, n)
335
        } else {
336
                karatsubaSub(z[n2:], p, n)
337
        }
338
}
339
 
340
// alias returns true if x and y share the same base array.
341
func alias(x, y nat) bool {
342
        return cap(x) > 0 && cap(y) > 0 && &x[0:cap(x)][cap(x)-1] == &y[0:cap(y)][cap(y)-1]
343
}
344
 
345
// addAt implements z += x*(1<<(_W*i)); z must be long enough.
346
// (we don't use nat.add because we need z to stay the same
347
// slice, and we don't need to normalize z after each addition)
348
func addAt(z, x nat, i int) {
349
        if n := len(x); n > 0 {
350
                if c := addVV(z[i:i+n], z[i:], x); c != 0 {
351
                        j := i + n
352
                        if j < len(z) {
353
                                addVW(z[j:], z[j:], c)
354
                        }
355
                }
356
        }
357
}
358
 
359
func max(x, y int) int {
360
        if x > y {
361
                return x
362
        }
363
        return y
364
}
365
 
366
// karatsubaLen computes an approximation to the maximum k <= n such that
367
// k = p<= 0. Thus, the
368
// result is the largest number that can be divided repeatedly by 2 before
369
// becoming about the value of karatsubaThreshold.
370
func karatsubaLen(n int) int {
371
        i := uint(0)
372
        for n > karatsubaThreshold {
373
                n >>= 1
374
                i++
375
        }
376
        return n << i
377
}
378
 
379
func (z nat) mul(x, y nat) nat {
380
        m := len(x)
381
        n := len(y)
382
 
383
        switch {
384
        case m < n:
385
                return z.mul(y, x)
386
        case m == 0 || n == 0:
387
                return z.make(0)
388
        case n == 1:
389
                return z.mulAddWW(x, y[0], 0)
390
        }
391
        // m >= n > 1
392
 
393
        // determine if z can be reused
394
        if alias(z, x) || alias(z, y) {
395
                z = nil // z is an alias for x or y - cannot reuse
396
        }
397
 
398
        // use basic multiplication if the numbers are small
399
        if n < karatsubaThreshold || n < 2 {
400
                z = z.make(m + n)
401
                basicMul(z, x, y)
402
                return z.norm()
403
        }
404
        // m >= n && n >= karatsubaThreshold && n >= 2
405
 
406
        // determine Karatsuba length k such that
407
        //
408
        //   x = x1*b + x0
409
        //   y = y1*b + y0  (and k <= len(y), which implies k <= len(x))
410
        //   b = 1<<(_W*k)  ("base" of digits xi, yi)
411
        //
412
        k := karatsubaLen(n)
413
        // k <= n
414
 
415
        // multiply x0 and y0 via Karatsuba
416
        x0 := x[0:k]              // x0 is not normalized
417
        y0 := y[0:k]              // y0 is not normalized
418
        z = z.make(max(6*k, m+n)) // enough space for karatsuba of x0*y0 and full result of x*y
419
        karatsuba(z, x0, y0)
420
        z = z[0 : m+n] // z has final length but may be incomplete, upper portion is garbage
421
 
422
        // If x1 and/or y1 are not 0, add missing terms to z explicitly:
423
        //
424
        //     m+n       2*k       0
425
        //   z = [   ...   | x0*y0 ]
426
        //     +   [ x1*y1 ]
427
        //     +   [ x1*y0 ]
428
        //     +   [ x0*y1 ]
429
        //
430
        if k < n || m != n {
431
                x1 := x[k:] // x1 is normalized because x is
432
                y1 := y[k:] // y1 is normalized because y is
433
                var t nat
434
                t = t.mul(x1, y1)
435
                copy(z[2*k:], t)
436
                z[2*k+len(t):].clear() // upper portion of z is garbage
437
                t = t.mul(x1, y0.norm())
438
                addAt(z, t, k)
439
                t = t.mul(x0.norm(), y1)
440
                addAt(z, t, k)
441
        }
442
 
443
        return z.norm()
444
}
445
 
446
// mulRange computes the product of all the unsigned integers in the
447
// range [a, b] inclusively. If a > b (empty range), the result is 1.
448
func (z nat) mulRange(a, b uint64) nat {
449
        switch {
450
        case a == 0:
451
                // cut long ranges short (optimization)
452
                return z.setUint64(0)
453
        case a > b:
454
                return z.setUint64(1)
455
        case a == b:
456
                return z.setUint64(a)
457
        case a+1 == b:
458
                return z.mul(nat(nil).setUint64(a), nat(nil).setUint64(b))
459
        }
460
        m := (a + b) / 2
461
        return z.mul(nat(nil).mulRange(a, m), nat(nil).mulRange(m+1, b))
462
}
463
 
464
// q = (x-r)/y, with 0 <= r < y
465
func (z nat) divW(x nat, y Word) (q nat, r Word) {
466
        m := len(x)
467
        switch {
468
        case y == 0:
469
                panic("division by zero")
470
        case y == 1:
471
                q = z.set(x) // result is x
472
                return
473
        case m == 0:
474
                q = z.make(0) // result is 0
475
                return
476
        }
477
        // m > 0
478
        z = z.make(m)
479
        r = divWVW(z, 0, x, y)
480
        q = z.norm()
481
        return
482
}
483
 
484
func (z nat) div(z2, u, v nat) (q, r nat) {
485
        if len(v) == 0 {
486
                panic("division by zero")
487
        }
488
 
489
        if u.cmp(v) < 0 {
490
                q = z.make(0)
491
                r = z2.set(u)
492
                return
493
        }
494
 
495
        if len(v) == 1 {
496
                var rprime Word
497
                q, rprime = z.divW(u, v[0])
498
                if rprime > 0 {
499
                        r = z2.make(1)
500
                        r[0] = rprime
501
                } else {
502
                        r = z2.make(0)
503
                }
504
                return
505
        }
506
 
507
        q, r = z.divLarge(z2, u, v)
508
        return
509
}
510
 
511
// q = (uIn-r)/v, with 0 <= r < y
512
// Uses z as storage for q, and u as storage for r if possible.
513
// See Knuth, Volume 2, section 4.3.1, Algorithm D.
514
// Preconditions:
515
//    len(v) >= 2
516
//    len(uIn) >= len(v)
517
func (z nat) divLarge(u, uIn, v nat) (q, r nat) {
518
        n := len(v)
519
        m := len(uIn) - n
520
 
521
        // determine if z can be reused
522
        // TODO(gri) should find a better solution - this if statement
523
        //           is very costly (see e.g. time pidigits -s -n 10000)
524
        if alias(z, uIn) || alias(z, v) {
525
                z = nil // z is an alias for uIn or v - cannot reuse
526
        }
527
        q = z.make(m + 1)
528
 
529
        qhatv := make(nat, n+1)
530
        if alias(u, uIn) || alias(u, v) {
531
                u = nil // u is an alias for uIn or v - cannot reuse
532
        }
533
        u = u.make(len(uIn) + 1)
534
        u.clear()
535
 
536
        // D1.
537
        shift := leadingZeros(v[n-1])
538
        if shift > 0 {
539
                // do not modify v, it may be used by another goroutine simultaneously
540
                v1 := make(nat, n)
541
                shlVU(v1, v, shift)
542
                v = v1
543
        }
544
        u[len(uIn)] = shlVU(u[0:len(uIn)], uIn, shift)
545
 
546
        // D2.
547
        for j := m; j >= 0; j-- {
548
                // D3.
549
                qhat := Word(_M)
550
                if u[j+n] != v[n-1] {
551
                        var rhat Word
552
                        qhat, rhat = divWW(u[j+n], u[j+n-1], v[n-1])
553
 
554
                        // x1 | x2 = q̂v_{n-2}
555
                        x1, x2 := mulWW(qhat, v[n-2])
556
                        // test if q̂v_{n-2} > br̂ + u_{j+n-2}
557
                        for greaterThan(x1, x2, rhat, u[j+n-2]) {
558
                                qhat--
559
                                prevRhat := rhat
560
                                rhat += v[n-1]
561
                                // v[n-1] >= 0, so this tests for overflow.
562
                                if rhat < prevRhat {
563
                                        break
564
                                }
565
                                x1, x2 = mulWW(qhat, v[n-2])
566
                        }
567
                }
568
 
569
                // D4.
570
                qhatv[n] = mulAddVWW(qhatv[0:n], v, qhat, 0)
571
 
572
                c := subVV(u[j:j+len(qhatv)], u[j:], qhatv)
573
                if c != 0 {
574
                        c := addVV(u[j:j+n], u[j:], v)
575
                        u[j+n] += c
576
                        qhat--
577
                }
578
 
579
                q[j] = qhat
580
        }
581
 
582
        q = q.norm()
583
        shrVU(u, u, shift)
584
        r = u.norm()
585
 
586
        return q, r
587
}
588
 
589
// Length of x in bits. x must be normalized.
590
func (x nat) bitLen() int {
591
        if i := len(x) - 1; i >= 0 {
592
                return i*_W + bitLen(x[i])
593
        }
594
        return 0
595
}
596
 
597
// MaxBase is the largest number base accepted for string conversions.
598
const MaxBase = 'z' - 'a' + 10 + 1 // = hexValue('z') + 1
599
 
600
func hexValue(ch rune) Word {
601
        d := int(MaxBase + 1) // illegal base
602
        switch {
603
        case '0' <= ch && ch <= '9':
604
                d = int(ch - '0')
605
        case 'a' <= ch && ch <= 'z':
606
                d = int(ch - 'a' + 10)
607
        case 'A' <= ch && ch <= 'Z':
608
                d = int(ch - 'A' + 10)
609
        }
610
        return Word(d)
611
}
612
 
613
// scan sets z to the natural number corresponding to the longest possible prefix
614
// read from r representing an unsigned integer in a given conversion base.
615
// It returns z, the actual conversion base used, and an error, if any. In the
616
// error case, the value of z is undefined. The syntax follows the syntax of
617
// unsigned integer literals in Go.
618
//
619
// The base argument must be 0 or a value from 2 through MaxBase. If the base
620
// is 0, the string prefix determines the actual conversion base. A prefix of
621
// ``0x'' or ``0X'' selects base 16; the ``0'' prefix selects base 8, and a
622
// ``0b'' or ``0B'' prefix selects base 2. Otherwise the selected base is 10.
623
//
624
func (z nat) scan(r io.RuneScanner, base int) (nat, int, error) {
625
        // reject illegal bases
626
        if base < 0 || base == 1 || MaxBase < base {
627
                return z, 0, errors.New("illegal number base")
628
        }
629
 
630
        // one char look-ahead
631
        ch, _, err := r.ReadRune()
632
        if err != nil {
633
                return z, 0, err
634
        }
635
 
636
        // determine base if necessary
637
        b := Word(base)
638
        if base == 0 {
639
                b = 10
640
                if ch == '0' {
641
                        switch ch, _, err = r.ReadRune(); err {
642
                        case nil:
643
                                b = 8
644
                                switch ch {
645
                                case 'x', 'X':
646
                                        b = 16
647
                                case 'b', 'B':
648
                                        b = 2
649
                                }
650
                                if b == 2 || b == 16 {
651
                                        if ch, _, err = r.ReadRune(); err != nil {
652
                                                return z, 0, err
653
                                        }
654
                                }
655
                        case io.EOF:
656
                                return z.make(0), 10, nil
657
                        default:
658
                                return z, 10, err
659
                        }
660
                }
661
        }
662
 
663
        // convert string
664
        // - group as many digits d as possible together into a "super-digit" dd with "super-base" bb
665
        // - only when bb does not fit into a word anymore, do a full number mulAddWW using bb and dd
666
        z = z.make(0)
667
        bb := Word(1)
668
        dd := Word(0)
669
        for max := _M / b; ; {
670
                d := hexValue(ch)
671
                if d >= b {
672
                        r.UnreadRune() // ch does not belong to number anymore
673
                        break
674
                }
675
 
676
                if bb <= max {
677
                        bb *= b
678
                        dd = dd*b + d
679
                } else {
680
                        // bb * b would overflow
681
                        z = z.mulAddWW(z, bb, dd)
682
                        bb = b
683
                        dd = d
684
                }
685
 
686
                if ch, _, err = r.ReadRune(); err != nil {
687
                        if err != io.EOF {
688
                                return z, int(b), err
689
                        }
690
                        break
691
                }
692
        }
693
 
694
        switch {
695
        case bb > 1:
696
                // there was at least one mantissa digit
697
                z = z.mulAddWW(z, bb, dd)
698
        case base == 0 && b == 8:
699
                // there was only the octal prefix 0 (possibly followed by digits > 7);
700
                // return base 10, not 8
701
                return z, 10, nil
702
        case base != 0 || b != 8:
703
                // there was neither a mantissa digit nor the octal prefix 0
704
                return z, int(b), errors.New("syntax error scanning number")
705
        }
706
 
707
        return z.norm(), int(b), nil
708
}
709
 
710
// Character sets for string conversion.
711
const (
712
        lowercaseDigits = "0123456789abcdefghijklmnopqrstuvwxyz"
713
        uppercaseDigits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
714
)
715
 
716
// decimalString returns a decimal representation of x.
717
// It calls x.string with the charset "0123456789".
718
func (x nat) decimalString() string {
719
        return x.string(lowercaseDigits[0:10])
720
}
721
 
722
// string converts x to a string using digits from a charset; a digit with
723
// value d is represented by charset[d]. The conversion base is determined
724
// by len(charset), which must be >= 2 and <= 256.
725
func (x nat) string(charset string) string {
726
        b := Word(len(charset))
727
 
728
        // special cases
729
        switch {
730
        case b < 2 || MaxBase > 256:
731
                panic("illegal base")
732
        case len(x) == 0:
733
                return string(charset[0])
734
        }
735
 
736
        // allocate buffer for conversion
737
        i := int(float64(x.bitLen())/math.Log2(float64(b))) + 1 // off by one at most
738
        s := make([]byte, i)
739
 
740
        // convert power of two and non power of two bases separately
741
        if b == b&-b {
742
                // shift is base-b digit size in bits
743
                shift := uint(trailingZeroBits(b)) // shift > 0 because b >= 2
744
                mask := Word(1)<
745
                w := x[0]
746
                nbits := uint(_W) // number of unprocessed bits in w
747
 
748
                // convert less-significant words
749
                for k := 1; k < len(x); k++ {
750
                        // convert full digits
751
                        for nbits >= shift {
752
                                i--
753
                                s[i] = charset[w&mask]
754
                                w >>= shift
755
                                nbits -= shift
756
                        }
757
 
758
                        // convert any partial leading digit and advance to next word
759
                        if nbits == 0 {
760
                                // no partial digit remaining, just advance
761
                                w = x[k]
762
                                nbits = _W
763
                        } else {
764
                                // partial digit in current (k-1) and next (k) word
765
                                w |= x[k] << nbits
766
                                i--
767
                                s[i] = charset[w&mask]
768
 
769
                                // advance
770
                                w = x[k] >> (shift - nbits)
771
                                nbits = _W - (shift - nbits)
772
                        }
773
                }
774
 
775
                // convert digits of most-significant word (omit leading zeros)
776
                for nbits >= 0 && w != 0 {
777
                        i--
778
                        s[i] = charset[w&mask]
779
                        w >>= shift
780
                        nbits -= shift
781
                }
782
 
783
        } else {
784
                // determine "big base"; i.e., the largest possible value bb
785
                // that is a power of base b and still fits into a Word
786
                // (as in 10^19 for 19 decimal digits in a 64bit Word)
787
                bb := b      // big base is b**ndigits
788
                ndigits := 1 // number of base b digits
789
                for max := Word(_M / b); bb <= max; bb *= b {
790
                        ndigits++ // maximize ndigits where bb = b**ndigits, bb <= _M
791
                }
792
 
793
                // construct table of successive squares of bb*leafSize to use in subdivisions
794
                // result (table != nil) <=> (len(x) > leafSize > 0)
795
                table := divisors(len(x), b, ndigits, bb)
796
 
797
                // preserve x, create local copy for use by convertWords
798
                q := nat(nil).set(x)
799
 
800
                // convert q to string s in base b
801
                q.convertWords(s, charset, b, ndigits, bb, table)
802
 
803
                // strip leading zeros
804
                // (x != 0; thus s must contain at least one non-zero digit
805
                // and the loop will terminate)
806
                i = 0
807
                for zero := charset[0]; s[i] == zero; {
808
                        i++
809
                }
810
        }
811
 
812
        return string(s[i:])
813
}
814
 
815
// Convert words of q to base b digits in s. If q is large, it is recursively "split in half"
816
// by nat/nat division using tabulated divisors. Otherwise, it is converted iteratively using
817
// repeated nat/Word divison.
818
//
819
// The iterative method processes n Words by n divW() calls, each of which visits every Word in the
820
// incrementally shortened q for a total of n + (n-1) + (n-2) ... + 2 + 1, or n(n+1)/2 divW()'s.
821
// Recursive conversion divides q by its approximate square root, yielding two parts, each half
822
// the size of q. Using the iterative method on both halves means 2 * (n/2)(n/2 + 1)/2 divW()'s
823
// plus the expensive long div(). Asymptotically, the ratio is favorable at 1/2 the divW()'s, and
824
// is made better by splitting the subblocks recursively. Best is to split blocks until one more
825
// split would take longer (because of the nat/nat div()) than the twice as many divW()'s of the
826
// iterative approach. This threshold is represented by leafSize. Benchmarking of leafSize in the
827
// range 2..64 shows that values of 8 and 16 work well, with a 4x speedup at medium lengths and
828
// ~30x for 20000 digits. Use nat_test.go's BenchmarkLeafSize tests to optimize leafSize for
829
// specfic hardware.
830
//
831
func (q nat) convertWords(s []byte, charset string, b Word, ndigits int, bb Word, table []divisor) {
832
        // split larger blocks recursively
833
        if table != nil {
834
                // len(q) > leafSize > 0
835
                var r nat
836
                index := len(table) - 1
837
                for len(q) > leafSize {
838
                        // find divisor close to sqrt(q) if possible, but in any case < q
839
                        maxLength := q.bitLen()     // ~= log2 q, or at of least largest possible q of this bit length
840
                        minLength := maxLength >> 1 // ~= log2 sqrt(q)
841
                        for index > 0 && table[index-1].nbits > minLength {
842
                                index-- // desired
843
                        }
844
                        if table[index].nbits >= maxLength && table[index].bbb.cmp(q) >= 0 {
845
                                index--
846
                                if index < 0 {
847
                                        panic("internal inconsistency")
848
                                }
849
                        }
850
 
851
                        // split q into the two digit number (q'*bbb + r) to form independent subblocks
852
                        q, r = q.div(r, q, table[index].bbb)
853
 
854
                        // convert subblocks and collect results in s[:h] and s[h:]
855
                        h := len(s) - table[index].ndigits
856
                        r.convertWords(s[h:], charset, b, ndigits, bb, table[0:index])
857
                        s = s[:h] // == q.convertWords(s, charset, b, ndigits, bb, table[0:index+1])
858
                }
859
        }
860
 
861
        // having split any large blocks now process the remaining (small) block iteratively
862
        i := len(s)
863
        var r Word
864
        if b == 10 {
865
                // hard-coding for 10 here speeds this up by 1.25x (allows for / and % by constants)
866
                for len(q) > 0 {
867
                        // extract least significant, base bb "digit"
868
                        q, r = q.divW(q, bb)
869
                        for j := 0; j < ndigits && i > 0; j++ {
870
                                i--
871
                                // avoid % computation since r%10 == r - int(r/10)*10;
872
                                // this appears to be faster for BenchmarkString10000Base10
873
                                // and smaller strings (but a bit slower for larger ones)
874
                                t := r / 10
875
                                s[i] = charset[r-t<<3-t-t] // TODO(gri) replace w/ t*10 once compiler produces better code
876
                                r = t
877
                        }
878
                }
879
        } else {
880
                for len(q) > 0 {
881
                        // extract least significant, base bb "digit"
882
                        q, r = q.divW(q, bb)
883
                        for j := 0; j < ndigits && i > 0; j++ {
884
                                i--
885
                                s[i] = charset[r%b]
886
                                r /= b
887
                        }
888
                }
889
        }
890
 
891
        // prepend high-order zeroes
892
        zero := charset[0]
893
        for i > 0 { // while need more leading zeroes
894
                i--
895
                s[i] = zero
896
        }
897
}
898
 
899
// Split blocks greater than leafSize Words (or set to 0 to disable recursive conversion)
900
// Benchmark and configure leafSize using: gotest -test.bench="Leaf"
901
//   8 and 16 effective on 3.0 GHz Xeon "Clovertown" CPU (128 byte cache lines)
902
//   8 and 16 effective on 2.66 GHz Core 2 Duo "Penryn" CPU
903
var leafSize int = 8 // number of Word-size binary values treat as a monolithic block
904
 
905
type divisor struct {
906
        bbb     nat // divisor
907
        nbits   int // bit length of divisor (discounting leading zeroes) ~= log2(bbb)
908
        ndigits int // digit length of divisor in terms of output base digits
909
}
910
 
911
var cacheBase10 [64]divisor // cached divisors for base 10
912
var cacheLock sync.Mutex    // protects cacheBase10
913
 
914
// expWW computes x**y
915
func (z nat) expWW(x, y Word) nat {
916
        return z.expNN(nat(nil).setWord(x), nat(nil).setWord(y), nil)
917
}
918
 
919
// construct table of powers of bb*leafSize to use in subdivisions
920
func divisors(m int, b Word, ndigits int, bb Word) []divisor {
921
        // only compute table when recursive conversion is enabled and x is large
922
        if leafSize == 0 || m <= leafSize {
923
                return nil
924
        }
925
 
926
        // determine k where (bb**leafSize)**(2**k) >= sqrt(x)
927
        k := 1
928
        for words := leafSize; words < m>>1 && k < len(cacheBase10); words <<= 1 {
929
                k++
930
        }
931
 
932
        // create new table of divisors or extend and reuse existing table as appropriate
933
        var table []divisor
934
        var cached bool
935
        switch b {
936
        case 10:
937
                table = cacheBase10[0:k] // reuse old table for this conversion
938
                cached = true
939
        default:
940
                table = make([]divisor, k) // new table for this conversion
941
        }
942
 
943
        // extend table
944
        if table[k-1].ndigits == 0 {
945
                if cached {
946
                        cacheLock.Lock() // begin critical section
947
                }
948
 
949
                // add new entries as needed
950
                var larger nat
951
                for i := 0; i < k; i++ {
952
                        if table[i].ndigits == 0 {
953
                                if i == 0 {
954
                                        table[i].bbb = nat(nil).expWW(bb, Word(leafSize))
955
                                        table[i].ndigits = ndigits * leafSize
956
                                } else {
957
                                        table[i].bbb = nat(nil).mul(table[i-1].bbb, table[i-1].bbb)
958
                                        table[i].ndigits = 2 * table[i-1].ndigits
959
                                }
960
 
961
                                // optimization: exploit aggregated extra bits in macro blocks
962
                                larger = nat(nil).set(table[i].bbb)
963
                                for mulAddVWW(larger, larger, b, 0) == 0 {
964
                                        table[i].bbb = table[i].bbb.set(larger)
965
                                        table[i].ndigits++
966
                                }
967
 
968
                                table[i].nbits = table[i].bbb.bitLen()
969
                        }
970
                }
971
 
972
                if cached {
973
                        cacheLock.Unlock() // end critical section
974
                }
975
        }
976
 
977
        return table
978
}
979
 
980
const deBruijn32 = 0x077CB531
981
 
982
var deBruijn32Lookup = []byte{
983
        0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
984
        31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9,
985
}
986
 
987
const deBruijn64 = 0x03f79d71b4ca8b09
988
 
989
var deBruijn64Lookup = []byte{
990
        0, 1, 56, 2, 57, 49, 28, 3, 61, 58, 42, 50, 38, 29, 17, 4,
991
        62, 47, 59, 36, 45, 43, 51, 22, 53, 39, 33, 30, 24, 18, 12, 5,
992
        63, 55, 48, 27, 60, 41, 37, 16, 46, 35, 44, 21, 52, 32, 23, 11,
993
        54, 26, 40, 15, 34, 20, 31, 10, 25, 14, 19, 9, 13, 8, 7, 6,
994
}
995
 
996
// trailingZeroBits returns the number of consecutive zero bits on the right
997
// side of the given Word.
998
// See Knuth, volume 4, section 7.3.1
999
func trailingZeroBits(x Word) int {
1000
        // x & -x leaves only the right-most bit set in the word. Let k be the
1001
        // index of that bit. Since only a single bit is set, the value is two
1002
        // to the power of k. Multiplying by a power of two is equivalent to
1003
        // left shifting, in this case by k bits.  The de Bruijn constant is
1004
        // such that all six bit, consecutive substrings are distinct.
1005
        // Therefore, if we have a left shifted version of this constant we can
1006
        // find by how many bits it was shifted by looking at which six bit
1007
        // substring ended up at the top of the word.
1008
        switch _W {
1009
        case 32:
1010
                return int(deBruijn32Lookup[((x&-x)*deBruijn32)>>27])
1011
        case 64:
1012
                return int(deBruijn64Lookup[((x&-x)*(deBruijn64&_M))>>58])
1013
        default:
1014
                panic("Unknown word size")
1015
        }
1016
 
1017
        return 0
1018
}
1019
 
1020
// z = x << s
1021
func (z nat) shl(x nat, s uint) nat {
1022
        m := len(x)
1023
        if m == 0 {
1024
                return z.make(0)
1025
        }
1026
        // m > 0
1027
 
1028
        n := m + int(s/_W)
1029
        z = z.make(n + 1)
1030
        z[n] = shlVU(z[n-m:n], x, s%_W)
1031
        z[0 : n-m].clear()
1032
 
1033
        return z.norm()
1034
}
1035
 
1036
// z = x >> s
1037
func (z nat) shr(x nat, s uint) nat {
1038
        m := len(x)
1039
        n := m - int(s/_W)
1040
        if n <= 0 {
1041
                return z.make(0)
1042
        }
1043
        // n > 0
1044
 
1045
        z = z.make(n)
1046
        shrVU(z, x[m-n:], s%_W)
1047
 
1048
        return z.norm()
1049
}
1050
 
1051
func (z nat) setBit(x nat, i uint, b uint) nat {
1052
        j := int(i / _W)
1053
        m := Word(1) << (i % _W)
1054
        n := len(x)
1055
        switch b {
1056
        case 0:
1057
                z = z.make(n)
1058
                copy(z, x)
1059
                if j >= n {
1060
                        // no need to grow
1061
                        return z
1062
                }
1063
                z[j] &^= m
1064
                return z.norm()
1065
        case 1:
1066
                if j >= n {
1067
                        z = z.make(j + 1)
1068
                        z[n:].clear()
1069
                } else {
1070
                        z = z.make(n)
1071
                }
1072
                copy(z, x)
1073
                z[j] |= m
1074
                // no need to normalize
1075
                return z
1076
        }
1077
        panic("set bit is not 0 or 1")
1078
}
1079
 
1080
func (z nat) bit(i uint) uint {
1081
        j := int(i / _W)
1082
        if j >= len(z) {
1083
                return 0
1084
        }
1085
        return uint(z[j] >> (i % _W) & 1)
1086
}
1087
 
1088
func (z nat) and(x, y nat) nat {
1089
        m := len(x)
1090
        n := len(y)
1091
        if m > n {
1092
                m = n
1093
        }
1094
        // m <= n
1095
 
1096
        z = z.make(m)
1097
        for i := 0; i < m; i++ {
1098
                z[i] = x[i] & y[i]
1099
        }
1100
 
1101
        return z.norm()
1102
}
1103
 
1104
func (z nat) andNot(x, y nat) nat {
1105
        m := len(x)
1106
        n := len(y)
1107
        if n > m {
1108
                n = m
1109
        }
1110
        // m >= n
1111
 
1112
        z = z.make(m)
1113
        for i := 0; i < n; i++ {
1114
                z[i] = x[i] &^ y[i]
1115
        }
1116
        copy(z[n:m], x[n:m])
1117
 
1118
        return z.norm()
1119
}
1120
 
1121
func (z nat) or(x, y nat) nat {
1122
        m := len(x)
1123
        n := len(y)
1124
        s := x
1125
        if m < n {
1126
                n, m = m, n
1127
                s = y
1128
        }
1129
        // m >= n
1130
 
1131
        z = z.make(m)
1132
        for i := 0; i < n; i++ {
1133
                z[i] = x[i] | y[i]
1134
        }
1135
        copy(z[n:m], s[n:m])
1136
 
1137
        return z.norm()
1138
}
1139
 
1140
func (z nat) xor(x, y nat) nat {
1141
        m := len(x)
1142
        n := len(y)
1143
        s := x
1144
        if m < n {
1145
                n, m = m, n
1146
                s = y
1147
        }
1148
        // m >= n
1149
 
1150
        z = z.make(m)
1151
        for i := 0; i < n; i++ {
1152
                z[i] = x[i] ^ y[i]
1153
        }
1154
        copy(z[n:m], s[n:m])
1155
 
1156
        return z.norm()
1157
}
1158
 
1159
// greaterThan returns true iff (x1<<_W + x2) > (y1<<_W + y2)
1160
func greaterThan(x1, x2, y1, y2 Word) bool {
1161
        return x1 > y1 || x1 == y1 && x2 > y2
1162
}
1163
 
1164
// modW returns x % d.
1165
func (x nat) modW(d Word) (r Word) {
1166
        // TODO(agl): we don't actually need to store the q value.
1167
        var q nat
1168
        q = q.make(len(x))
1169
        return divWVW(q, 0, x, d)
1170
}
1171
 
1172
// powersOfTwoDecompose finds q and k with x = q * 1<
1173
func (x nat) powersOfTwoDecompose() (q nat, k int) {
1174
        if len(x) == 0 {
1175
                return x, 0
1176
        }
1177
 
1178
        // One of the words must be non-zero by definition,
1179
        // so this loop will terminate with i < len(x), and
1180
        // i is the number of 0 words.
1181
        i := 0
1182
        for x[i] == 0 {
1183
                i++
1184
        }
1185
        n := trailingZeroBits(x[i]) // x[i] != 0
1186
 
1187
        q = make(nat, len(x)-i)
1188
        shrVU(q, x[i:], uint(n))
1189
 
1190
        q = q.norm()
1191
        k = i*_W + n
1192
        return
1193
}
1194
 
1195
// random creates a random integer in [0..limit), using the space in z if
1196
// possible. n is the bit length of limit.
1197
func (z nat) random(rand *rand.Rand, limit nat, n int) nat {
1198
        if alias(z, limit) {
1199
                z = nil // z is an alias for limit - cannot reuse
1200
        }
1201
        z = z.make(len(limit))
1202
 
1203
        bitLengthOfMSW := uint(n % _W)
1204
        if bitLengthOfMSW == 0 {
1205
                bitLengthOfMSW = _W
1206
        }
1207
        mask := Word((1 << bitLengthOfMSW) - 1)
1208
 
1209
        for {
1210
                for i := range z {
1211
                        switch _W {
1212
                        case 32:
1213
                                z[i] = Word(rand.Uint32())
1214
                        case 64:
1215
                                z[i] = Word(rand.Uint32()) | Word(rand.Uint32())<<32
1216
                        }
1217
                }
1218
 
1219
                z[len(limit)-1] &= mask
1220
 
1221
                if z.cmp(limit) < 0 {
1222
                        break
1223
                }
1224
        }
1225
 
1226
        return z.norm()
1227
}
1228
 
1229
// If m != nil, expNN calculates x**y mod m. Otherwise it calculates x**y. It
1230
// reuses the storage of z if possible.
1231
func (z nat) expNN(x, y, m nat) nat {
1232
        if alias(z, x) || alias(z, y) {
1233
                // We cannot allow in place modification of x or y.
1234
                z = nil
1235
        }
1236
 
1237
        if len(y) == 0 {
1238
                z = z.make(1)
1239
                z[0] = 1
1240
                return z
1241
        }
1242
 
1243
        if m != nil {
1244
                // We likely end up being as long as the modulus.
1245
                z = z.make(len(m))
1246
        }
1247
        z = z.set(x)
1248
        v := y[len(y)-1]
1249
        // It's invalid for the most significant word to be zero, therefore we
1250
        // will find a one bit.
1251
        shift := leadingZeros(v) + 1
1252
        v <<= shift
1253
        var q nat
1254
 
1255
        const mask = 1 << (_W - 1)
1256
 
1257
        // We walk through the bits of the exponent one by one. Each time we
1258
        // see a bit, we square, thus doubling the power. If the bit is a one,
1259
        // we also multiply by x, thus adding one to the power.
1260
 
1261
        w := _W - int(shift)
1262
        for j := 0; j < w; j++ {
1263
                z = z.mul(z, z)
1264
 
1265
                if v&mask != 0 {
1266
                        z = z.mul(z, x)
1267
                }
1268
 
1269
                if m != nil {
1270
                        q, z = q.div(z, z, m)
1271
                }
1272
 
1273
                v <<= 1
1274
        }
1275
 
1276
        for i := len(y) - 2; i >= 0; i-- {
1277
                v = y[i]
1278
 
1279
                for j := 0; j < _W; j++ {
1280
                        z = z.mul(z, z)
1281
 
1282
                        if v&mask != 0 {
1283
                                z = z.mul(z, x)
1284
                        }
1285
 
1286
                        if m != nil {
1287
                                q, z = q.div(z, z, m)
1288
                        }
1289
 
1290
                        v <<= 1
1291
                }
1292
        }
1293
 
1294
        return z.norm()
1295
}
1296
 
1297
// probablyPrime performs reps Miller-Rabin tests to check whether n is prime.
1298
// If it returns true, n is prime with probability 1 - 1/4^reps.
1299
// If it returns false, n is not prime.
1300
func (n nat) probablyPrime(reps int) bool {
1301
        if len(n) == 0 {
1302
                return false
1303
        }
1304
 
1305
        if len(n) == 1 {
1306
                if n[0] < 2 {
1307
                        return false
1308
                }
1309
 
1310
                if n[0]%2 == 0 {
1311
                        return n[0] == 2
1312
                }
1313
 
1314
                // We have to exclude these cases because we reject all
1315
                // multiples of these numbers below.
1316
                switch n[0] {
1317
                case 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53:
1318
                        return true
1319
                }
1320
        }
1321
 
1322
        const primesProduct32 = 0xC0CFD797         // Π {p ∈ primes, 2 < p <= 29}
1323
        const primesProduct64 = 0xE221F97C30E94E1D // Π {p ∈ primes, 2 < p <= 53}
1324
 
1325
        var r Word
1326
        switch _W {
1327
        case 32:
1328
                r = n.modW(primesProduct32)
1329
        case 64:
1330
                r = n.modW(primesProduct64 & _M)
1331
        default:
1332
                panic("Unknown word size")
1333
        }
1334
 
1335
        if r%3 == 0 || r%5 == 0 || r%7 == 0 || r%11 == 0 ||
1336
                r%13 == 0 || r%17 == 0 || r%19 == 0 || r%23 == 0 || r%29 == 0 {
1337
                return false
1338
        }
1339
 
1340
        if _W == 64 && (r%31 == 0 || r%37 == 0 || r%41 == 0 ||
1341
                r%43 == 0 || r%47 == 0 || r%53 == 0) {
1342
                return false
1343
        }
1344
 
1345
        nm1 := nat(nil).sub(n, natOne)
1346
        // 1<
1347
        q, k := nm1.powersOfTwoDecompose()
1348
 
1349
        nm3 := nat(nil).sub(nm1, natTwo)
1350
        rand := rand.New(rand.NewSource(int64(n[0])))
1351
 
1352
        var x, y, quotient nat
1353
        nm3Len := nm3.bitLen()
1354
 
1355
NextRandom:
1356
        for i := 0; i < reps; i++ {
1357
                x = x.random(rand, nm3, nm3Len)
1358
                x = x.add(x, natTwo)
1359
                y = y.expNN(x, q, n)
1360
                if y.cmp(natOne) == 0 || y.cmp(nm1) == 0 {
1361
                        continue
1362
                }
1363
                for j := 1; j < k; j++ {
1364
                        y = y.mul(y, y)
1365
                        quotient, y = quotient.div(y, y, n)
1366
                        if y.cmp(nm1) == 0 {
1367
                                continue NextRandom
1368
                        }
1369
                        if y.cmp(natOne) == 0 {
1370
                                return false
1371
                        }
1372
                }
1373
                return false
1374
        }
1375
 
1376
        return true
1377
}
1378
 
1379
// bytes writes the value of z into buf using big-endian encoding.
1380
// len(buf) must be >= len(z)*_S. The value of z is encoded in the
1381
// slice buf[i:]. The number i of unused bytes at the beginning of
1382
// buf is returned as result.
1383
func (z nat) bytes(buf []byte) (i int) {
1384
        i = len(buf)
1385
        for _, d := range z {
1386
                for j := 0; j < _S; j++ {
1387
                        i--
1388
                        buf[i] = byte(d)
1389
                        d >>= 8
1390
                }
1391
        }
1392
 
1393
        for i < len(buf) && buf[i] == 0 {
1394
                i++
1395
        }
1396
 
1397
        return
1398
}
1399
 
1400
// setBytes interprets buf as the bytes of a big-endian unsigned
1401
// integer, sets z to that value, and returns z.
1402
func (z nat) setBytes(buf []byte) nat {
1403
        z = z.make((len(buf) + _S - 1) / _S)
1404
 
1405
        k := 0
1406
        s := uint(0)
1407
        var d Word
1408
        for i := len(buf); i > 0; i-- {
1409
                d |= Word(buf[i-1]) << s
1410
                if s += 8; s == _S*8 {
1411
                        z[k] = d
1412
                        k++
1413
                        s = 0
1414
                        d = 0
1415
                }
1416
        }
1417
        if k < len(z) {
1418
                z[k] = d
1419
        }
1420
 
1421
        return z.norm()
1422
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.