// $G $D/$F.go && $L $F.$A && ./$A.out

// 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.

// Power series package
// A power series is a channel, along which flow rational
// coefficients.  A denominator of zero signifies the end.
// Original code in Newsqueak by Doug McIlroy.
// See Squinting at Power Series by Doug McIlroy,
//   http://www.cs.bell-labs.com/who/rsc/thread/squint.pdf
// Like powser1.go but uses channels of interfaces.
// Has not been cleaned up as much as powser1.go, to keep
// it distinct and therefore a different test.

package main

import "os"

type rat struct  {
	num, den  int64	// numerator, denominator
}

type item interface {
	pr()
	eq(c item) bool
}

func (u *rat) pr(){
	if u.den==1 {
		print(u.num)
	} else {
		print(u.num, "/", u.den)
	}
	print(" ")
}

func (u *rat) eq(c item) bool {
	c1 := c.(*rat)
	return u.num == c1.num && u.den == c1.den
}

type dch struct {
	req chan  int
	dat chan  item
	nam int
}

type dch2 [2] *dch

var chnames string
var chnameserial int
var seqno int

func mkdch() *dch {
	c := chnameserial % len(chnames)
	chnameserial++
	d := new(dch)
	d.req = make(chan int)
	d.dat = make(chan item)
	d.nam = c
	return d
}

func mkdch2() *dch2 {
	d2 := new(dch2)
	d2[0] = mkdch()
	d2[1] = mkdch()
	return d2
}

// split reads a single demand channel and replicates its
// output onto two, which may be read at different rates.
// A process is created at first demand for an item and dies
// after the item has been sent to both outputs.

// When multiple generations of split exist, the newest
// will service requests on one channel, which is
// always renamed to be out[0]; the oldest will service
// requests on the other channel, out[1].  All generations but the
// newest hold queued data that has already been sent to
// out[0].  When data has finally been sent to out[1],
// a signal on the release-wait channel tells the next newer
// generation to begin servicing out[1].

func dosplit(in *dch, out *dch2, wait chan int ){
	both := false	// do not service both channels

	select {
	case <-out[0].req:
		
	case <-wait:
		both = true
		select {
		case <-out[0].req:
			
		case <-out[1].req:
			out[0],out[1] = out[1], out[0]
		}
	}

	seqno++
	in.req <- seqno
	release := make(chan  int)
	go dosplit(in, out, release)
	dat := <-in.dat
	out[0].dat <- dat
	if !both {
		<-wait
	}
	<-out[1].req
	out[1].dat <- dat
	release <- 0
}

func split(in *dch, out *dch2){
	release := make(chan int)
	go dosplit(in, out, release)
	release <- 0
}

func put(dat item, out *dch){
	<-out.req
	out.dat <- dat
}

func get(in *dch) *rat {
	seqno++
	in.req <- seqno
	return (<-in.dat).(*rat)
}

// Get one item from each of n demand channels

func getn(in []*dch) []item {
	n:=len(in)
	if n != 2 { panic("bad n in getn") }
	req := make([] chan int, 2)
	dat := make([] chan item, 2)
	out := make([]item, 2)
	var i int
	var it item
	for i=0; i<n; i++ {
		req[i] = in[i].req
		dat[i] = nil
	}
	for n=2*n; n>0; n-- {
		seqno++

		select{
		case req[0] <- seqno:
			dat[0] = in[0].dat
			req[0] = nil
		case req[1] <- seqno:
			dat[1] = in[1].dat
			req[1] = nil
		case it = <-dat[0]:
			out[0] = it
			dat[0] = nil
		case it = <-dat[1]:
			out[1] = it
			dat[1] = nil
		}
	}
	return out
}

// Get one item from each of 2 demand channels

func get2(in0 *dch, in1 *dch)  []item {
	return getn([]*dch{in0, in1})
}

func copy(in *dch, out *dch){
	for {
		<-out.req
		out.dat <- get(in)
	}
}

func repeat(dat item, out *dch){
	for {
		put(dat, out)
	}
}

type PS *dch	// power series
type PS2 *[2] PS // pair of power series

var Ones PS
var Twos PS

func mkPS() *dch {
	return mkdch()
}

func mkPS2() *dch2 {
	return mkdch2()
}

// Conventions
// Upper-case for power series.
// Lower-case for rationals.
// Input variables: U,V,...
// Output variables: ...,Y,Z

// Integer gcd; needed for rational arithmetic

func gcd (u, v int64) int64{
	if u < 0 { return gcd(-u, v) }
	if u == 0 { return v }
	return gcd(v%u, u)
}

// Make a rational from two ints and from one int

func i2tor(u, v int64) *rat{
	g := gcd(u,v)
	r := new(rat)
	if v > 0 {
		r.num = u/g
		r.den = v/g
	} else {
		r.num = -u/g
		r.den = -v/g
	}
	return r
}

func itor(u int64) *rat{
	return i2tor(u, 1)
}

var zero *rat
var one *rat


// End mark and end test

var finis *rat

func end(u *rat) int64 {
	if u.den==0 { return 1 }
	return 0
}

// Operations on rationals

func add(u, v *rat) *rat {
	g := gcd(u.den,v.den)
	return  i2tor(u.num*(v.den/g)+v.num*(u.den/g),u.den*(v.den/g))
}

func mul(u, v *rat) *rat{
	g1 := gcd(u.num,v.den)
	g2 := gcd(u.den,v.num)
	r := new(rat)
	r.num =(u.num/g1)*(v.num/g2)
	r.den = (u.den/g2)*(v.den/g1)
	return r
}

func neg(u *rat) *rat{
	return i2tor(-u.num, u.den)
}

func sub(u, v *rat) *rat{
	return add(u, neg(v))
}

func inv(u *rat) *rat{	// invert a rat
	if u.num == 0 { panic("zero divide in inv") }
	return i2tor(u.den, u.num)
}

// print eval in floating point of PS at x=c to n terms
func Evaln(c *rat, U PS, n int) {
	xn := float64(1)
	x := float64(c.num)/float64(c.den)
	val := float64(0)
	for i:=0; i<n; i++ {
		u := get(U)
		if end(u) != 0 {
			break
		}
		val = val + x * float64(u.num)/float64(u.den)
		xn = xn*x
	}
	print(val, "\n")
}

// Print n terms of a power series
func Printn(U PS, n int){
	done := false
	for ; !done && n>0; n-- {
		u := get(U)
		if end(u) != 0 {
			done = true
		} else {
			u.pr()
		}
	}
	print(("\n"))
}

func Print(U PS){
	Printn(U,1000000000)
}

// Evaluate n terms of power series U at x=c
func eval(c *rat, U PS, n int) *rat{
	if n==0 { return zero }
	y := get(U)
	if end(y) != 0 { return zero }
	return add(y,mul(c,eval(c,U,n-1)))
}

// Power-series constructors return channels on which power
// series flow.  They start an encapsulated generator that
// puts the terms of the series on the channel.

// Make a pair of power series identical to a given power series

func Split(U PS) *dch2{
	UU := mkdch2()
	go split(U,UU)
	return UU
}

// Add two power series
func Add(U, V PS) PS{
	Z := mkPS()
	go func(U, V, Z PS){
		var uv [] item
		for {
			<-Z.req
			uv = get2(U,V)
			switch end(uv[0].(*rat))+2*end(uv[1].(*rat)) {
			case 0:
				Z.dat <- add(uv[0].(*rat), uv[1].(*rat))
			case 1:
				Z.dat <- uv[1]
				copy(V,Z)
			case 2:
				Z.dat <- uv[0]
				copy(U,Z)
			case 3:
				Z.dat <- finis
			}
		}
	}(U, V, Z)
	return Z
}

// Multiply a power series by a constant
func Cmul(c *rat,U PS) PS{
	Z := mkPS()
	go func(c *rat, U, Z PS){
		done := false
		for !done {
			<-Z.req
			u := get(U)
			if end(u) != 0 {
				done = true
			} else {
				Z.dat <- mul(c,u)
			}
		}
		Z.dat <- finis
	}(c, U, Z)
	return Z
}

// Subtract

func Sub(U, V PS) PS{
	return Add(U, Cmul(neg(one), V))
}

// Multiply a power series by the monomial x^n

func Monmul(U PS, n int) PS{
	Z := mkPS()
	go func(n int, U PS, Z PS){
		for ; n>0; n-- { put(zero,Z) }
		copy(U,Z)
	}(n, U, Z)
	return Z
}

// Multiply by x

func Xmul(U PS) PS{
	return Monmul(U,1)
}

func Rep(c *rat) PS{
	Z := mkPS()
	go repeat(c,Z)
	return Z
}

// Monomial c*x^n

func Mon(c *rat, n int) PS{
	Z:=mkPS()
	go func(c *rat, n int, Z PS){
		if(c.num!=0) {
			for ; n>0; n=n-1 { put(zero,Z) }
			put(c,Z)
		}
		put(finis,Z)
	}(c, n, Z)
	return Z
}

func Shift(c *rat, U PS) PS{
	Z := mkPS()
	go func(c *rat, U, Z PS){
		put(c,Z)
		copy(U,Z)
	}(c, U, Z)
	return Z
}

// simple pole at 1: 1/(1-x) = 1 1 1 1 1 ...

// Convert array of coefficients, constant term first
// to a (finite) power series

/*
func Poly(a [] *rat) PS{
	Z:=mkPS()
	begin func(a [] *rat, Z PS){
		j:=0
		done:=0
		for j=len(a); !done&&j>0; j=j-1)
			if(a[j-1].num!=0) done=1
		i:=0
		for(; i<j; i=i+1) put(a[i],Z)
		put(finis,Z)
	}()
	return Z
}
*/

// Multiply. The algorithm is
//	let U = u + x*UU
//	let V = v + x*VV
//	then UV = u*v + x*(u*VV+v*UU) + x*x*UU*VV

func Mul(U, V PS) PS{
	Z:=mkPS()
	go func(U, V, Z PS){
		<-Z.req
		uv := get2(U,V)
		if end(uv[0].(*rat))!=0 || end(uv[1].(*rat)) != 0 {
			Z.dat <- finis
		} else {
			Z.dat <- mul(uv[0].(*rat),uv[1].(*rat))
			UU := Split(U)
			VV := Split(V)
			W := Add(Cmul(uv[0].(*rat),VV[0]),Cmul(uv[1].(*rat),UU[0]))
			<-Z.req
			Z.dat <- get(W)
			copy(Add(W,Mul(UU[1],VV[1])),Z)
		}
	}(U, V, Z)
	return Z
}

// Differentiate

func Diff(U PS) PS{
	Z:=mkPS()
	go func(U, Z PS){
		<-Z.req
		u := get(U)
		if end(u) == 0 {
			done:=false
			for i:=1; !done; i++ {
				u = get(U)
				if end(u) != 0 {
					done=true
				} else {
					Z.dat <- mul(itor(int64(i)),u)
					<-Z.req
				}
			}
		}
		Z.dat <- finis
	}(U, Z)
	return Z
}

// Integrate, with const of integration
func Integ(c *rat,U PS) PS{
	Z:=mkPS()
	go func(c *rat, U, Z PS){
		put(c,Z)
		done:=false
		for i:=1; !done; i++ {
			<-Z.req
			u := get(U)
			if end(u) != 0 { done= true }
			Z.dat <- mul(i2tor(1,int64(i)),u)
		}
		Z.dat <- finis
	}(c, U, Z)
	return Z
}

// Binomial theorem (1+x)^c

func Binom(c *rat) PS{
	Z:=mkPS()
	go func(c *rat, Z PS){
		n := 1
		t := itor(1)
		for c.num!=0 {
			put(t,Z)
			t = mul(mul(t,c),i2tor(1,int64(n)))
			c = sub(c,one)
			n++
		}
		put(finis,Z)
	}(c, Z)
	return Z
}

// Reciprocal of a power series
//	let U = u + x*UU
//	let Z = z + x*ZZ
//	(u+x*UU)*(z+x*ZZ) = 1
//	z = 1/u
//	u*ZZ + z*UU +x*UU*ZZ = 0
//	ZZ = -UU*(z+x*ZZ)/u

func Recip(U PS) PS{
	Z:=mkPS()
	go func(U, Z PS){
		ZZ:=mkPS2()
		<-Z.req
		z := inv(get(U))
		Z.dat <- z
		split(Mul(Cmul(neg(z),U),Shift(z,ZZ[0])),ZZ)
		copy(ZZ[1],Z)
	}(U, Z)
	return Z
}

// Exponential of a power series with constant term 0
// (nonzero constant term would make nonrational coefficients)
// bug: the constant term is simply ignored
//	Z = exp(U)
//	DZ = Z*DU
//	integrate to get Z

func Exp(U PS) PS{
	ZZ := mkPS2()
	split(Integ(one,Mul(ZZ[0],Diff(U))),ZZ)
	return ZZ[1]
}

// Substitute V for x in U, where the leading term of V is zero
//	let U = u + x*UU
//	let V = v + x*VV
//	then S(U,V) = u + VV*S(V,UU)
// bug: a nonzero constant term is ignored

func Subst(U, V PS) PS {
	Z:= mkPS()
	go func(U, V, Z PS) {
		VV := Split(V)
		<-Z.req
		u := get(U)
		Z.dat <- u
		if end(u) == 0 {
			if end(get(VV[0])) != 0 {
				put(finis,Z)
			} else {
				copy(Mul(VV[0],Subst(U,VV[1])),Z)
			}
		}
	}(U, V, Z)
	return Z
}

// Monomial Substition: U(c x^n)
// Each Ui is multiplied by c^i and followed by n-1 zeros

func MonSubst(U PS, c0 *rat, n int) PS {
	Z:= mkPS()
	go func(U, Z PS, c0 *rat, n int) {
		c := one
		for {
			<-Z.req
			u := get(U)
			Z.dat <- mul(u, c)
			c = mul(c, c0)
			if end(u) != 0 {
				Z.dat <- finis
				break
			}
			for i := 1; i < n; i++ {
				<-Z.req
				Z.dat <- zero
			}
		}
	}(U, Z, c0, n)
	return Z
}


func Init() {
	chnameserial = -1
	seqno = 0
	chnames = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
	zero = itor(0)
	one = itor(1)
	finis = i2tor(1,0)
	Ones = Rep(one)
	Twos = Rep(itor(2))
}

func check(U PS, c *rat, count int, str string) {
	for i := 0; i < count; i++ {
		r := get(U)
		if !r.eq(c) {
			print("got: ")
			r.pr()
			print("should get ")
			c.pr()
			print("\n")
			panic(str)
		}
	}
}

const N=10
func checka(U PS, a []*rat, str string) {
	for i := 0; i < N; i++ {
		check(U, a[i], 1, str)
	}
}

func main() {
	Init()
	if len(os.Args) > 1 {  // print
		print("Ones: "); Printn(Ones, 10)
		print("Twos: "); Printn(Twos, 10)
		print("Add: "); Printn(Add(Ones, Twos), 10)
		print("Diff: "); Printn(Diff(Ones), 10)
		print("Integ: "); Printn(Integ(zero, Ones), 10)
		print("CMul: "); Printn(Cmul(neg(one), Ones), 10)
		print("Sub: "); Printn(Sub(Ones, Twos), 10)
		print("Mul: "); Printn(Mul(Ones, Ones), 10)
		print("Exp: "); Printn(Exp(Ones), 15)
		print("MonSubst: "); Printn(MonSubst(Ones, neg(one), 2), 10)
		print("ATan: "); Printn(Integ(zero, MonSubst(Ones, neg(one), 2)), 10)
	} else {  // test
		check(Ones, one, 5, "Ones")
		check(Add(Ones, Ones), itor(2), 0, "Add Ones Ones")  // 1 1 1 1 1
		check(Add(Ones, Twos), itor(3), 0, "Add Ones Twos") // 3 3 3 3 3
		a := make([]*rat, N)
		d := Diff(Ones)
		for i:=0; i < N; i++ {
			a[i] = itor(int64(i+1))
		}
		checka(d, a, "Diff")  // 1 2 3 4 5
		in := Integ(zero, Ones)
		a[0] = zero  // integration constant
		for i:=1; i < N; i++ {
			a[i] = i2tor(1, int64(i))
		}
		checka(in, a, "Integ")  // 0 1 1/2 1/3 1/4 1/5
		check(Cmul(neg(one), Twos), itor(-2), 10, "CMul")  // -1 -1 -1 -1 -1
		check(Sub(Ones, Twos), itor(-1), 0, "Sub Ones Twos")  // -1 -1 -1 -1 -1
		m := Mul(Ones, Ones)
		for i:=0; i < N; i++ {
			a[i] = itor(int64(i+1))
		}
		checka(m, a, "Mul")  // 1 2 3 4 5
		e := Exp(Ones)
		a[0] = itor(1)
		a[1] = itor(1)
		a[2] = i2tor(3,2)
		a[3] = i2tor(13,6)
		a[4] = i2tor(73,24)
		a[5] = i2tor(167,40)
		a[6] = i2tor(4051,720)
		a[7] = i2tor(37633,5040)
		a[8] = i2tor(43817,4480)
		a[9] = i2tor(4596553,362880)
		checka(e, a, "Exp")  // 1 1 3/2 13/6 73/24
		at := Integ(zero, MonSubst(Ones, neg(one), 2))
		for c, i := 1, 0; i < N; i++ {
			if i%2 == 0 {
				a[i] = zero
			} else {
				a[i] = i2tor(int64(c), int64(i))
				c *= -1
			}
		}
		checka(at, a, "ATan");  // 0 -1 0 -1/3 0 -1/5
/*
		t := Revert(Integ(zero, MonSubst(Ones, neg(one), 2)))
		a[0] = zero
		a[1] = itor(1)
		a[2] = zero
		a[3] = i2tor(1,3)
		a[4] = zero
		a[5] = i2tor(2,15)
		a[6] = zero
		a[7] = i2tor(17,315)
		a[8] = zero
		a[9] = i2tor(62,2835)
		checka(t, a, "Tan")  // 0 1 0 1/3 0 2/15
*/
	}
}
