mirror of
https://github.com/golang/go
synced 2024-11-12 09:20:22 -07:00
delete
R=r DELTA=791 (0 added, 791 deleted, 0 changed) OCL=35154 CL=35154
This commit is contained in:
parent
5124e66fca
commit
16ce29802a
117
usr/rsc/gmp/6c.c
117
usr/rsc/gmp/6c.c
@ -1,117 +0,0 @@
|
|||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "runtime.h"
|
|
||||||
#include "cgocall.h"
|
|
||||||
|
|
||||||
typedef struct Int Int;
|
|
||||||
struct Int
|
|
||||||
{
|
|
||||||
void *v;
|
|
||||||
};
|
|
||||||
|
|
||||||
// turn on ffi
|
|
||||||
#pragma dynld initcgo initcgo "libcgo.so"
|
|
||||||
#pragma dynld cgo cgo "libcgo.so"
|
|
||||||
|
|
||||||
#pragma dynld c_free free "gmp.so"
|
|
||||||
void (*c_free)(void*);
|
|
||||||
|
|
||||||
// pull in gmp routines, implemented in gcc.c, from gmp.so
|
|
||||||
#pragma dynld gmp_addInt gmp_addInt "gmp.so"
|
|
||||||
#pragma dynld gmp_stringInt gmp_stringInt "gmp.so"
|
|
||||||
#pragma dynld gmp_newInt gmp_newInt "gmp.so"
|
|
||||||
#pragma dynld gmp_subInt gmp_subInt "gmp.so"
|
|
||||||
#pragma dynld gmp_mulInt gmp_mulInt "gmp.so"
|
|
||||||
#pragma dynld gmp_divInt gmp_divInt "gmp.so"
|
|
||||||
#pragma dynld gmp_modInt gmp_modInt "gmp.so"
|
|
||||||
#pragma dynld gmp_expInt gmp_expInt "gmp.so"
|
|
||||||
#pragma dynld gmp_gcdInt gmp_gcdInt "gmp.so"
|
|
||||||
#pragma dynld gmp_negInt gmp_negInt "gmp.so"
|
|
||||||
#pragma dynld gmp_absInt gmp_absInt "gmp.so"
|
|
||||||
#pragma dynld gmp_cmpInt gmp_cmpInt "gmp.so"
|
|
||||||
#pragma dynld gmp_stringInt gmp_stringInt "gmp.so"
|
|
||||||
#pragma dynld gmp_probablyPrimeInt gmp_probablyPrimeInt "gmp.so"
|
|
||||||
#pragma dynld gmp_lshInt gmp_lshInt "gmp.so"
|
|
||||||
#pragma dynld gmp_rshInt gmp_rshInt "gmp.so"
|
|
||||||
#pragma dynld gmp_lenInt gmp_lenInt "gmp.so"
|
|
||||||
#pragma dynld gmp_setInt gmp_setInt "gmp.so"
|
|
||||||
#pragma dynld gmp_setBytesInt gmp_setBytesInt "gmp.so"
|
|
||||||
#pragma dynld gmp_setStringInt gmp_setStringInt "gmp.so"
|
|
||||||
#pragma dynld gmp_bytesInt gmp_bytesInt "gmp.so"
|
|
||||||
#pragma dynld gmp_divModInt gmp_divModInt "gmp.so"
|
|
||||||
#pragma dynld gmp_setInt64Int gmp_setInt64Int "gmp.so"
|
|
||||||
#pragma dynld gmp_int64Int gmp_int64Int "gmp.so"
|
|
||||||
|
|
||||||
void (*gmp_addInt)(void*);
|
|
||||||
void (*gmp_stringInt)(void*);
|
|
||||||
void (*gmp_newInt)(void*);
|
|
||||||
void (*gmp_subInt)(void*);
|
|
||||||
void (*gmp_mulInt)(void*);
|
|
||||||
void (*gmp_divInt)(void*);
|
|
||||||
void (*gmp_modInt)(void*);
|
|
||||||
void (*gmp_expInt)(void*);
|
|
||||||
void (*gmp_gcdInt)(void*);
|
|
||||||
void (*gmp_negInt)(void*);
|
|
||||||
void (*gmp_absInt)(void*);
|
|
||||||
void (*gmp_cmpInt)(void*);
|
|
||||||
void (*gmp_stringInt)(void*);
|
|
||||||
void (*gmp_probablyPrimeInt)(void*);
|
|
||||||
void (*gmp_lshInt)(void*);
|
|
||||||
void (*gmp_rshInt)(void*);
|
|
||||||
void (*gmp_lenInt)(void*);
|
|
||||||
void (*gmp_setInt)(void*);
|
|
||||||
void (*gmp_setBytesInt)(void*);
|
|
||||||
void (*gmp_setStringInt)(void*);
|
|
||||||
void (*gmp_bytesInt)(void*);
|
|
||||||
void (*gmp_divModInt)(void*);
|
|
||||||
void (*gmp_setInt64Int)(void*);
|
|
||||||
void (*gmp_int64Int)(void*);
|
|
||||||
|
|
||||||
void gmp·addInt(Int *z, Int *x, Int *y, Int *ret) { cgocall(gmp_addInt, &z); }
|
|
||||||
void gmp·subInt(Int *z, Int *x, Int *y, Int *ret) { cgocall(gmp_subInt, &z); }
|
|
||||||
void gmp·mulInt(Int *z, Int *x, Int *y, Int *ret) { cgocall(gmp_mulInt, &z); }
|
|
||||||
void gmp·divInt(Int *z, Int *x, Int *y, Int *ret) { cgocall(gmp_divInt, &z); }
|
|
||||||
void gmp·modInt(Int *z, Int *x, Int *y, Int *ret) { cgocall(gmp_modInt, &z); }
|
|
||||||
void gmp·expInt(Int *z, Int *x, Int *y, Int *m, Int *ret) { cgocall(gmp_expInt, &z); }
|
|
||||||
void gmp·GcdInt(Int *d, Int *x, Int *y, Int *a, Int *b) { cgocall(gmp_gcdInt, &d); }
|
|
||||||
void gmp·negInt(Int *z, Int *x, Int *ret) { cgocall(gmp_negInt, &z); }
|
|
||||||
void gmp·absInt(Int *z, Int *x, Int *ret) { cgocall(gmp_absInt, &z); }
|
|
||||||
void gmp·CmpInt(Int *x, Int *y, int32 ret) { cgocall(gmp_cmpInt, &x); }
|
|
||||||
void gmp·probablyPrimeInt(Int *z, int32 nreps, int32 pad, int32 ret) { cgocall(gmp_probablyPrimeInt, &z); }
|
|
||||||
void gmp·lshInt(Int *z, Int *x, uint32 s, Int *ret) { cgocall(gmp_lshInt, &z); }
|
|
||||||
void gmp·rshInt(Int *z, Int *x, uint32 s, Int *ret) { cgocall(gmp_rshInt, &z); }
|
|
||||||
void gmp·lenInt(Int *z, int32 ret) { cgocall(gmp_lenInt, &z); }
|
|
||||||
void gmp·setInt(Int *z, Int *x, Int *ret) { cgocall(gmp_setInt, &z); }
|
|
||||||
void gmp·setBytesInt(Int *z, Array b, Int *ret) { cgocall(gmp_setBytesInt, &z); }
|
|
||||||
void gmp·setStringInt(Int *z, String s, int32 base, int32 ret) { cgocall(gmp_setStringInt, &z); }
|
|
||||||
void gmp·bytesInt(Int *z, Array ret) { cgocall(gmp_bytesInt, &z); }
|
|
||||||
void gmp·DivModInt(Int *q, Int *r, Int *x, Int *y) { cgocall(gmp_divModInt, &q); }
|
|
||||||
void gmp·setInt64Int(Int *z, int64 x, Int *ret) { cgocall(gmp_setInt64Int, &z); }
|
|
||||||
void gmp·int64Int(Int *z, int64 ret) { cgocall(gmp_int64Int, &z); }
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp·stringInt(Int *z, String ret)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
byte *p;
|
|
||||||
} a;
|
|
||||||
a.z = z;
|
|
||||||
a.p = nil;
|
|
||||||
cgocall(gmp_stringInt, &a);
|
|
||||||
ret = gostring(a.p);
|
|
||||||
cgocall(c_free, a.p);
|
|
||||||
FLUSH(&ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp·NewInt(uint64 x, Int *z)
|
|
||||||
{
|
|
||||||
if(sizeof(uintptr) != 8) *(int32*)0 = 0;
|
|
||||||
z = mallocgc(sizeof *z);
|
|
||||||
FLUSH(&z);
|
|
||||||
cgocall(gmp_newInt, &x);
|
|
||||||
}
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
|||||||
# Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
# Use of this source code is governed by a BSD-style
|
|
||||||
# license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
# FFI demo
|
|
||||||
|
|
||||||
include ../../../src/Make.$(GOARCH)
|
|
||||||
|
|
||||||
all: gmp.a gmp.so
|
|
||||||
|
|
||||||
gcc.o: gcc.c
|
|
||||||
gcc -fPIC -O2 -o gcc.o -c gcc.c
|
|
||||||
|
|
||||||
gmp.so: gcc.o
|
|
||||||
gcc -shared -o gmp.so gcc.o -L$(GOROOT)/pkg/$(GOOS)_$(GOARCH) -lcgo -lgmp
|
|
||||||
|
|
||||||
gmp.a: 6c.6 go.6
|
|
||||||
gopack grc gmp.a 6c.6 go.6
|
|
||||||
|
|
||||||
# from pkg/runtime/Makefile: TODO(rsc): how to deal with this?
|
|
||||||
# Set SIZE to 32 or 64.
|
|
||||||
SIZE_386=32
|
|
||||||
SIZE_amd64=64
|
|
||||||
SIZE_arm=32
|
|
||||||
SIZE=$(SIZE_$(GOARCH))
|
|
||||||
|
|
||||||
# Setup CFLAGS. Add -D_64BIT on 64-bit platforms (sorry).
|
|
||||||
CFLAGS_64=-D_64BIT
|
|
||||||
# TODO(kaib): fix register allocation to honor extern register so we
|
|
||||||
# can enable optimizations again.
|
|
||||||
CFLAGS_arm=-N
|
|
||||||
CFLAGS=-I$(GOOS) -I$(GOOS)/$(GOARCH) -wF $(CFLAGS_$(SIZE)) $(CFLAGS_$(GOARCH))
|
|
||||||
|
|
||||||
6c.6: 6c.c
|
|
||||||
6c -FVw $(CFLAGS) -I$(GOROOT)/src/pkg/runtime 6c.c
|
|
||||||
|
|
||||||
go.6: go.go
|
|
||||||
6g go.go
|
|
||||||
|
|
||||||
PKG=$(GOROOT)/pkg/$(GOOS)_$(GOARCH)
|
|
||||||
|
|
||||||
install: $(PKG)/gmp.so $(PKG)/gmp.a
|
|
||||||
|
|
||||||
$(PKG)/gmp.so: gmp.so
|
|
||||||
cp gmp.so $@
|
|
||||||
|
|
||||||
$(PKG)/gmp.a: gmp.a
|
|
||||||
cp gmp.a $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.6 *.o *.so *.a
|
|
||||||
|
|
@ -1,349 +0,0 @@
|
|||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <gmp.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
typedef int32_t int32;
|
|
||||||
typedef uint32_t uint32;
|
|
||||||
typedef int64_t int64;
|
|
||||||
typedef uint64_t uint64;
|
|
||||||
|
|
||||||
typedef struct Slice Slice;
|
|
||||||
struct Slice
|
|
||||||
{
|
|
||||||
void *data;
|
|
||||||
uint32 len;
|
|
||||||
uint32 cap;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct String String;
|
|
||||||
struct String
|
|
||||||
{
|
|
||||||
void *data;
|
|
||||||
uint32 len;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct Int Int;
|
|
||||||
struct Int
|
|
||||||
{
|
|
||||||
mpz_t *mp;
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_newInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
uint64 x;
|
|
||||||
Int *z;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->z->mp = malloc(sizeof *a->z->mp);
|
|
||||||
mpz_init_set_ui(*a->z->mp, a->x);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_addInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
Int *y;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_add(*a->z->mp, *a->x->mp, *a->y->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_subInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
Int *y;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_sub(*a->z->mp, *a->x->mp, *a->y->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_mulInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
Int *y;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_mul(*a->z->mp, *a->x->mp, *a->y->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_setInt64Int(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
int64 x;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_set_si(*a->z->mp, a->x);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_int64Int(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
int64 ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = mpz_get_si(*a->z->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_divInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
Int *y;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_div(*a->z->mp, *a->x->mp, *a->y->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_modInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
Int *y;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_mod(*a->z->mp, *a->x->mp, *a->y->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_divModInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *d;
|
|
||||||
Int *m;
|
|
||||||
Int *x;
|
|
||||||
Int *y;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
mpz_tdiv_qr(*a->d->mp, *a->m->mp, *a->x->mp, *a->y->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_lshInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
uint32 s;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_mul_2exp(*a->z->mp, *a->x->mp, a->s);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_rshInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
int32 s;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_div_2exp(*a->z->mp, *a->x->mp, a->s);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_expInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
Int *y;
|
|
||||||
Int *w;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_powm(*a->z->mp, *a->x->mp, *a->y->mp, *a->w->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_gcdInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
Int *y;
|
|
||||||
Int *a;
|
|
||||||
Int *b;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_gcdext(*a->z->mp, *a->x->mp, *a->y->mp, *a->a->mp, *a->b->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_negInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_neg(*a->z->mp, *a->x->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_absInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_abs(*a->z->mp, *a->x->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_cmpInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *x;
|
|
||||||
Int *y;
|
|
||||||
int32 ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = mpz_cmp(*a->x->mp, *a->y->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_stringInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
char *p;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->p = mpz_get_str(NULL, 10, *a->z->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_setInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Int *x;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_set(*a->z->mp, *a->x->mp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_setBytesInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Slice b;
|
|
||||||
Int *ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = a->z;
|
|
||||||
mpz_import(*a->z->mp, a->b.len, 1, 1, 1, 0, a->b.data);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_lenInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
int32 ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = mpz_sizeinbase(*a->z->mp, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_bytesInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
Slice b;
|
|
||||||
} *a = v;
|
|
||||||
size_t n;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
n = (mpz_sizeinbase(*a->z->mp, 2) + 7) >> 3;
|
|
||||||
p = malloc(n); // TODO: mallocgc
|
|
||||||
mpz_export(p, &n, 1, 1, 1, 0, *a->z->mp);
|
|
||||||
a->b.data = p;
|
|
||||||
a->b.len = n;
|
|
||||||
a->b.cap = n;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_setStringInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
String s;
|
|
||||||
int32 base;
|
|
||||||
int32 pad;
|
|
||||||
int32 ret;
|
|
||||||
} *a = v;
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
p = malloc(a->s.len+1);
|
|
||||||
memmove(p, a->s.data, a->s.len);
|
|
||||||
p[a->s.len] = 0;
|
|
||||||
a->ret = mpz_set_str(*a->z->mp, p, a->base);
|
|
||||||
free(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
gmp_probablyPrimeInt(void *v)
|
|
||||||
{
|
|
||||||
struct {
|
|
||||||
Int *z;
|
|
||||||
int32 nreps;
|
|
||||||
int32 pad;
|
|
||||||
int32 ret;
|
|
||||||
} *a = v;
|
|
||||||
|
|
||||||
a->ret = mpz_probab_prime_p(*a->z->mp, a->nreps);
|
|
||||||
}
|
|
||||||
|
|
@ -1,130 +0,0 @@
|
|||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
package gmp
|
|
||||||
|
|
||||||
import "os"
|
|
||||||
|
|
||||||
type Int struct {
|
|
||||||
hidden *byte
|
|
||||||
}
|
|
||||||
|
|
||||||
func addInt(z, x, y *Int) *Int
|
|
||||||
func stringInt(z *Int) string
|
|
||||||
func divInt(z, x, y *Int) *Int
|
|
||||||
func mulInt(z, x, y *Int) *Int
|
|
||||||
func subInt(z, x, y *Int) *Int
|
|
||||||
func modInt(z, x, y *Int) *Int
|
|
||||||
func rshInt(z, x *Int, s uint) *Int
|
|
||||||
func lshInt(z, x *Int, s uint) *Int
|
|
||||||
func expInt(z, x, y, m *Int) *Int
|
|
||||||
func lenInt(z *Int) int
|
|
||||||
func bytesInt(z *Int) []byte
|
|
||||||
func setInt(z *Int, x *Int) *Int
|
|
||||||
func setBytesInt(z *Int, b []byte) *Int
|
|
||||||
func setStringInt(z *Int, s string, b int) int
|
|
||||||
func setInt64Int(z *Int, x int64) *Int
|
|
||||||
func int64Int(z *Int) int64
|
|
||||||
|
|
||||||
// NewInt returns a new Int initialized to x.
|
|
||||||
func NewInt(x int64) *Int
|
|
||||||
|
|
||||||
// z = x + y
|
|
||||||
func (z *Int) Add(x, y *Int) *Int {
|
|
||||||
return addInt(z, x, y)
|
|
||||||
}
|
|
||||||
|
|
||||||
// z = x - y
|
|
||||||
func (z *Int) Sub(x, y *Int) *Int {
|
|
||||||
return subInt(z, x, y)
|
|
||||||
}
|
|
||||||
|
|
||||||
// z = x * y
|
|
||||||
func (z *Int) Mul(x, y *Int) *Int {
|
|
||||||
return mulInt(z, x, y)
|
|
||||||
}
|
|
||||||
|
|
||||||
// z = x
|
|
||||||
func (z *Int) SetInt64(x int64) *Int {
|
|
||||||
return setInt64Int(z, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
// z = x / y
|
|
||||||
func (z *Int) Div(x, y *Int) *Int {
|
|
||||||
return divInt(z, x, y)
|
|
||||||
}
|
|
||||||
|
|
||||||
// z = x % y
|
|
||||||
func (z *Int) Mod(x, y *Int) *Int {
|
|
||||||
return modInt(z, x, y)
|
|
||||||
}
|
|
||||||
|
|
||||||
// z = x^y if m == nil, x^y % m otherwise
|
|
||||||
func (z *Int) Exp(x, y, m *Int) *Int {
|
|
||||||
return expInt(z, x, y, m);
|
|
||||||
}
|
|
||||||
|
|
||||||
// z = x << s
|
|
||||||
func (z *Int) Lsh(x *Int, s uint) *Int {
|
|
||||||
return lshInt(z, x, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
// z = x >> s
|
|
||||||
func (z *Int) Rsh(x *Int, s uint) *Int {
|
|
||||||
return rshInt(z, x, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
// z = x
|
|
||||||
func (z *Int) Set(x *Int) *Int {
|
|
||||||
return setInt(z, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Len returns length of z in bits.
|
|
||||||
func (z *Int) Len() int {
|
|
||||||
return lenInt(z);
|
|
||||||
}
|
|
||||||
|
|
||||||
func (z *Int) String() string {
|
|
||||||
return stringInt(z)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (z *Int) Int64() int64 {
|
|
||||||
return int64Int(z)
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: better name? Maybe return []byte instead?
|
|
||||||
// Bytes writes a big-endian representation of z into b.
|
|
||||||
// If b is not large enough to contain all of z, the lowest
|
|
||||||
// bits are stored.
|
|
||||||
func (z *Int) Bytes() []byte {
|
|
||||||
return bytesInt(z);
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBytes sets z to the integer represented by the bytes of b
|
|
||||||
// interpreted as a big-endian integer.
|
|
||||||
func (z *Int) SetBytes(b []byte) *Int {
|
|
||||||
return setBytesInt(z, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetString parses the string s in base b (8, 10, 16) and sets z to the result.
|
|
||||||
// It returns an error if the string cannot be parsed or the base is invalid.
|
|
||||||
func (z *Int) SetString(s string, b int) os.Error {
|
|
||||||
if b <= 0 || b > 36 || setStringInt(z, s, b) < 0 {
|
|
||||||
return os.EINVAL;
|
|
||||||
}
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
// GcdInt sets d to the greatest common divisor of a and b
|
|
||||||
// and sets x and y such that d = a*x + b*y.
|
|
||||||
// The inputs a and b must be positive.
|
|
||||||
// Pass x == nil and y == nil if only d is needed.
|
|
||||||
// If a <= 0 or b <= 0, GcdInt sets d, x, and y to zero.
|
|
||||||
func GcdInt(d, x, y, a, b *Int)
|
|
||||||
|
|
||||||
// CmpInt compares x and y. The result is -1, 0, +1.
|
|
||||||
func CmpInt(x, y *Int) int
|
|
||||||
|
|
||||||
// DivModInt sets q = x/y, r = x%y.
|
|
||||||
func DivModInt(q, r, x, y *Int)
|
|
@ -1,28 +0,0 @@
|
|||||||
// Copyright 2009 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import big "gmp"
|
|
||||||
//import "big"
|
|
||||||
import "fmt"
|
|
||||||
|
|
||||||
func Fib(n int) *big.Int {
|
|
||||||
a := big.NewInt(0);
|
|
||||||
b := big.NewInt(1);
|
|
||||||
|
|
||||||
for i := 0; i < n; i++ {
|
|
||||||
a, b = b, a;
|
|
||||||
b.Add(a, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
return b;
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
for i := 0; i <= 100; i++ {
|
|
||||||
fmt.Println(5*i, Fib(5*i));
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,144 +0,0 @@
|
|||||||
/*
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
* Neither the name of "The Computer Language Benchmarks Game" nor the
|
|
||||||
name of "The Computer Language Shootout Benchmarks" nor the names of
|
|
||||||
its contributors may be used to endorse or promote products derived
|
|
||||||
from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
TODO(rsc): delete this comment
|
|
||||||
TODO(rsc): move to test/bench once package "big" is ready
|
|
||||||
on r45:
|
|
||||||
|
|
||||||
make clean
|
|
||||||
make install
|
|
||||||
goc pidigits.go
|
|
||||||
ulimit -v 1000000 # 1GB
|
|
||||||
LD_LIBRARY_PATH=$GOROOT/pkg/linux_amd64 6.out
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* The Computer Language Benchmarks Game
|
|
||||||
* http://shootout.alioth.debian.org/
|
|
||||||
*
|
|
||||||
* contributed by The Go Authors.
|
|
||||||
* based on pidigits.c (by Paolo Bonzini & Sean Bartlett,
|
|
||||||
* modified by Michael Mellor)
|
|
||||||
*/
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
//"big";
|
|
||||||
big "gmp";
|
|
||||||
"flag";
|
|
||||||
"fmt";
|
|
||||||
"runtime";
|
|
||||||
)
|
|
||||||
|
|
||||||
var n = flag.Int("n", 27, "number of digits");
|
|
||||||
var silent = flag.Bool("s", false, "don't print result");
|
|
||||||
|
|
||||||
var (
|
|
||||||
tmp1 = big.NewInt(0);
|
|
||||||
tmp2 = big.NewInt(0);
|
|
||||||
numer = big.NewInt(1);
|
|
||||||
accum = big.NewInt(0);
|
|
||||||
denom = big.NewInt(1);
|
|
||||||
ten = big.NewInt(10);
|
|
||||||
)
|
|
||||||
|
|
||||||
func extract_digit() int64 {
|
|
||||||
if big.CmpInt(numer, accum) > 0 {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Compute (numer * 3 + accum) / denom
|
|
||||||
tmp1.Lsh(numer, 1).Add(tmp1, numer).Add(tmp1, accum);
|
|
||||||
big.DivModInt(tmp1, tmp2, tmp1, denom);
|
|
||||||
|
|
||||||
// Now, if (numer * 4 + accum) % denom...
|
|
||||||
tmp2.Add(tmp2, numer);
|
|
||||||
|
|
||||||
// ... is normalized, then the two divisions have the same result.
|
|
||||||
if big.CmpInt(tmp2, denom) >= 0 {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return tmp1.Int64();
|
|
||||||
}
|
|
||||||
|
|
||||||
func next_term(k int64) {
|
|
||||||
y2 := k*2 + 1;
|
|
||||||
|
|
||||||
accum.Add(accum, tmp1.Lsh(numer, 1));
|
|
||||||
accum.Mul(accum, tmp1.SetInt64(y2));
|
|
||||||
numer.Mul(numer, tmp1.SetInt64(k));
|
|
||||||
denom.Mul(denom, tmp1.SetInt64(y2));
|
|
||||||
}
|
|
||||||
|
|
||||||
func eliminate_digit(d int64) {
|
|
||||||
accum.Sub(accum, tmp1.Mul(denom, tmp1.SetInt64(d)));
|
|
||||||
accum.Mul(accum, ten);
|
|
||||||
numer.Mul(numer, ten);
|
|
||||||
}
|
|
||||||
|
|
||||||
func printf(s string, arg ...) {
|
|
||||||
if !*silent {
|
|
||||||
fmt.Printf(s, arg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
flag.Parse();
|
|
||||||
|
|
||||||
var m int; // 0 <= m < 10
|
|
||||||
for i, k := 0, int64(0); ; {
|
|
||||||
d := int64(-1);
|
|
||||||
for d < 0 {
|
|
||||||
k++;
|
|
||||||
next_term(k);
|
|
||||||
d = extract_digit();
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%c", d + '0');
|
|
||||||
|
|
||||||
i++;
|
|
||||||
m = i%10;
|
|
||||||
if m == 0 {
|
|
||||||
printf("\t:%d\n", i);
|
|
||||||
}
|
|
||||||
if i >= *n {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
eliminate_digit(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
if m > 0 {
|
|
||||||
printf("%s\t:%d\n", " "[m : 10], *n);
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Printf("%d calls; %d %d %d\n", runtime.Cgocalls(), numer.Len(), accum.Len(), denom.Len());
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user