1 // Copyright 2013 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.
22 H
= flag
.Int("H", 5, "Hilbert matrix size")
23 out
= flag
.String("out", "", "write generated program to out")
26 func TestHilbert(t
*testing
.T
) {
27 t
.Skip("skipping for gccgo--no importer")
30 src
:= program(*H
, *out
)
32 ioutil
.WriteFile(*out
, src
, 0666)
37 fset
:= token
.NewFileSet()
38 f
, err
:= parser
.ParseFile(fset
, "hilbert.go", src
, 0)
44 DefPredeclaredTestFuncs() // define assert built-in
45 conf
:= Config
{Importer
: importer
.Default()}
46 _
, err
= conf
.Check(f
.Name
.Name
, fset
, []*ast
.File
{f
}, nil)
52 func program(n
int, out
string) []byte {
55 g
.p(`// Code generated by: go test -run=Hilbert -H=%d -out=%q. DO NOT EDIT.
57 // This program tests arbitrary precision constant arithmetic
58 // by generating the constant elements of a Hilbert matrix H,
59 // its inverse I, and the product P = H*I. The product should
60 // be the identity matrix.
87 func (g
*gen
) p(format
string, args
...interface{}) {
88 fmt
.Fprintf(&g
.Buffer
, format
, args
...)
91 func (g
*gen
) hilbert(n
int) {
92 g
.p(`// Hilbert matrix, n = %d
95 for i
:= 0; i
< n
; i
++ {
97 for j
:= 0; j
< n
; j
++ {
105 for j
:= 0; j
< n
; j
++ {
109 g
.p("1.0/(iota + %d)", j
+1)
117 func (g
*gen
) inverse(n
int) {
118 g
.p(`// Inverse Hilbert matrix
121 for i
:= 0; i
< n
; i
++ {
122 for j
:= 0; j
< n
; j
++ {
127 g
.p("\ti%d_%d = %s%d * b%d_%d * b%d_%d * b%d_%d * b%d_%d\n",
128 i
, j
, s
, i
+j
+1, n
+i
, n
-j
-1, n
+j
, n
-i
-1, i
+j
, i
, i
+j
, i
)
135 func (g
*gen
) product(n
int) {
136 g
.p(`// Product matrix
139 for i
:= 0; i
< n
; i
++ {
140 for j
:= 0; j
< n
; j
++ {
141 g
.p("\tp%d_%d = ", i
, j
)
142 for k
:= 0; k
< n
; k
++ {
146 g
.p("h%d_%d*i%d_%d", i
, k
, k
, j
)
155 func (g
*gen
) verify(n
int) {
156 g
.p(`// Verify that product is the identity matrix
159 for i
:= 0; i
< n
; i
++ {
160 for j
:= 0; j
< n
; j
++ {
170 g
.p("p%d_%d == %d", i
, j
, v
)
176 // verify ok at type-check time
178 g
.p("const _ = assert(ok)\n\n")
182 func (g
*gen
) printProduct(n
int) {
183 g
.p("func printProduct() {\n")
184 for i
:= 0; i
< n
; i
++ {
186 for j
:= 0; j
< n
; j
++ {
197 func (g
*gen
) binomials(n
int) {
201 for j
:= 0; j
<= n
; j
++ {
205 for k
:= 0; k
<= j
; k
++ {
206 g
.p("\tb%d_%d = f%d / (f%d*f%d)\n", j
, k
, j
, k
, j
-k
)
212 func (g
*gen
) factorials(n
int) {
218 for i
:= 2; i
<= n
; i
++ {
219 g
.p("\tf%d = f%d * %d\n", i
, i
-1, i
)