[lrcalc] 03/03: Remove obsolete patch.
Tobias Hansen
thansen at alioth.debian.org
Mon Aug 26 19:41:04 UTC 2013
This is an automated email from the git hooks/post-receive script.
thansen pushed a commit to branch master
in repository lrcalc.
commit 24a0d6c44ca040e2f5d185cf103fc73d9983efd3
Author: Tobias Hansen <tobias.han at gmx.de>
Date: Mon Aug 26 21:43:21 2013 +0200
Remove obsolete patch.
---
debian/patches/programs-use-shared-libraries.patch | 2117 --------------------
1 file changed, 2117 deletions(-)
diff --git a/debian/patches/programs-use-shared-libraries.patch b/debian/patches/programs-use-shared-libraries.patch
deleted file mode 100644
index f08fb30..0000000
--- a/debian/patches/programs-use-shared-libraries.patch
+++ /dev/null
@@ -1,2117 +0,0 @@
---- a/lrcoef/Makefile.am
-+++ b/lrcoef/Makefile.am
-@@ -1,11 +1,8 @@
--AM_CFLAGS = -I .. -I ../mathlib
--
--noinst_LTLIBRARIES = libsymfcn.la
--libsymfcn_la_SOURCES = symfcn.c maple.c
-+AM_CFLAGS = -I .. -I ../mathlib -I ../symfcn
-
- bin_PROGRAMS = coprod lrcoef lrskew mult skew
--coprod_LDADD = ../mathlib/libmath.la libsymfcn.la
--lrskew_LDADD = ../mathlib/libmath.la libsymfcn.la
--lrcoef_LDADD = ../mathlib/libmath.la libsymfcn.la
--mult_LDADD = ../mathlib/libmath.la libsymfcn.la
--skew_LDADD = ../mathlib/libmath.la libsymfcn.la
-+coprod_LDFLAGS = -shared $(top_builddir)/liblrcalc.la
-+lrcoef_LDFLAGS = -shared $(top_builddir)/liblrcalc.la
-+lrskew_LDFLAGS = -shared $(top_builddir)/liblrcalc.la
-+mult_LDFLAGS = -shared $(top_builddir)/liblrcalc.la
-+skew_LDFLAGS = -shared $(top_builddir)/liblrcalc.la
---- a/lrcoef/maple.c
-+++ /dev/null
-@@ -1,86 +0,0 @@
--/* Littlewood-Richardson Calculator
-- * Copyright (C) 1999- Anders S. Buch (asbuch at math rutgers edu)
-- * See the file LICENSE for license information.
-- */
--
--#include <stdio.h>
--#include <vector.h>
--#include <hashtab.h>
--#include "maple.h"
--
--#define OUTPUT_WIDTH 60
--
--int _intlen(int x)
--{
-- int res = 1;
-- if (x < 0) { x = -x; res++; }
-- if (x >= 10) res++;
-- if (x >= 100) res++;
-- if (x >= 1000) res++;
-- if (x >= 10000) res++;
-- if (x >= 100000) res++;
-- return res;
--}
--
--int maple_print_term(int c, vector *v, char *letter)
--{
-- int x, i;
--#ifdef MULTLINE
-- int cols;
--#endif
--
-- putchar((c < 0) ? '-' : '+');
-- c = abs(c);
-- printf("%d*%s[", c, letter);
--#ifdef MULTLINE
-- cols = _intlen(c) + strlen(letter) + 3 + v_length(v);
--#endif
--
-- for (i = 0; i < v_length(v); i++)
-- {
-- if (i > 0)
-- putchar(',');
-- x = v_elem(v, i);
-- printf("%d", x);
--#ifdef MULTLINE
-- cols += _intlen(x);
--#endif
-- }
-- putchar(']');
--#ifdef MULTLINE
-- return cols;
--#else
-- return 0;
--#endif
--}
--
--void maple_print_lincomb(hashtab *ht, char *letter, int nl)
--{
-- hash_itr itr;
-- int column;
--
--#ifdef MULTILINE
-- putchar('(');
--#endif
-- column = 1;
-- for (hash_first(ht, itr); hash_good(itr); hash_next(itr))
-- {
-- if (hash_intvalue(itr) == 0)
-- continue;
--
-- column += maple_print_term(hash_intvalue(itr), hash_key(itr),letter);
--#ifdef MULTILINE
-- if (column >= OUTPUT_WIDTH)
-- {
-- putchar('\n');
-- column = 0;
-- }
--#endif
-- }
--#ifdef MULTILINE
-- printf(");\n");
--#else
-- if (nl)
-- putchar('\n');
--#endif
--}
---- a/lrcoef/maple.h
-+++ /dev/null
-@@ -1,6 +0,0 @@
--#ifndef _MAPLE_H
--#define _MAPLE_H
--
--void maple_print_lincomb(hashtab *ht, char *letter, int nl);
--
--#endif
---- a/lrcoef/symfcn.c
-+++ /dev/null
-@@ -1,873 +0,0 @@
--/* Littlewood-Richardson Calculator
-- * Copyright (C) 1999- Anders S. Buch (asbuch at math rutgers edu)
-- * See the file LICENSE for license information.
-- */
--
--#include <stdio.h>
--
--#include <alloc.h>
--#include <vector.h>
--#include <hashtab.h>
--
--#include "symfcn.h"
--
--
--int part_itr_sz(vector *part)
--{
-- int i, e, tot;
--
-- i = v_length(part) - 1;
-- while (i >= 0 && v_elem(part, i) == 1)
-- i--;
--
-- if (i < 0)
-- return 0;
--
-- e = v_elem(part, i);
-- tot = e + v_length(part) - i - 1;
--
-- while (tot >= e-1)
-- {
-- v_elem(part, i++) = e-1;
-- tot -= e-1;
-- }
-- if (tot > 0)
-- v_elem(part, i++) = tot;
-- v_length(part) = i;
--
-- return 1;
--}
--
--int part_itr_sub(vector *part, vector *outer)
--{
-- int i, e;
--
-- i = v_length(part) - 1;
-- while (i >= 0 && v_elem(part, i) == 0)
-- i--;
-- if (i < 0)
-- return 0;
--
-- e = v_elem(part, i) - 1;
-- if (e == 0)
-- {
-- v_length(part) = i;
-- return 1;
-- }
--
-- while (i < v_length(outer))
-- {
-- int x = v_elem(outer, i);
-- v_elem(part, i) = (e < x) ? e : x;
-- i++;
-- }
-- v_length(part) = v_length(outer);
--
-- return 1;
--}
--
--int part_itr_between(vector *part, vector *inner, vector *outer)
--{
-- int i, e;
--
-- i = v_length(part) - 1;
-- while (i >= 0 && v_elem(part, i) == v_elem(inner, i))
-- i--;
-- if (i < 0)
-- return 0;
--
-- e = v_elem(part, i) - 1;
-- if (e == 0)
-- {
-- v_length(part) = i;
-- return 1;
-- }
--
-- while (i < v_length(outer))
-- {
-- int x = v_elem(outer, i);
-- v_elem(part, i) = (e < x) ? e : x;
-- i++;
-- }
-- v_length(part) = v_length(outer);
--
-- return 1;
--}
--
--int part_length(vector *p)
--{
-- int n = v_length(p);
-- while (n > 0 && v_elem(p, n-1) == 0)
-- n--;
-- return n;
--}
--
--vector *part_conjugate(vector *p)
--{
-- int np, nc, j;
-- vector *conj;
--
-- np = v_length(p);
-- if (np == 0)
-- return v_new(0);
--
-- nc = v_elem(p, 0);
-- if (nc == 0)
-- return v_new(0);
--
-- conj = v_new(nc);
-- j = 0;
-- while (np > 0)
-- {
-- int jlim = v_elem(p, np - 1);
-- while (j < jlim)
-- v_elem(conj, j++) = np;
-- np--;
-- }
--
-- return conj;
--}
--
--int part_subset(vector *p1, vector *p2)
--{
-- int n;
--
-- n = part_length(p1);
-- if (n > v_length(p2))
-- return 0;
--
-- for (n--; n >= 0; n--)
-- if (v_elem(p1, n) > v_elem(p2, n))
-- return 0;
--
-- return 1;
--}
--
--
--void _chop_cols(vector *in1, vector *out)
--{
-- int n, m, mm, i;
--
-- n = v_length(in1);
-- m = v_elem(in1, n - 1);
-- mm = v_elem(out, n - 1);
-- if (m > mm)
-- m = mm;
--
-- for (i = 0; i < n; i++)
-- {
-- v_elem(in1, i) -= m;
-- v_elem(out, i) -= m;
-- }
--
-- v_length(in1) = part_length(in1);
-- v_length(out) = part_length(out);
--}
--
--void _chop_rows(vector *in1, vector *out)
--{
-- int m, i;
--
-- m = 1;
-- while (m < v_length(in1) && v_elem(in1, m) == v_elem(out, m))
-- m++;
--
-- for (i = 0; i < v_length(in1) - m; i++)
-- v_elem(in1, i) = v_elem(in1, i + m);
-- v_length(in1) -= m;
--
-- for (i = 0; i < v_length(out) - m; i++)
-- v_elem(out, i) = v_elem(out, i + m);
-- v_length(out) -= m;
--}
--
--
--long long lrcoef(vector *outer, vector *inner1, vector *inner2)
--{
-- vector *out, *in1, *in2, *out_conj, *cont, *vtmp;
-- int w_out, w_in1, w_in2, do_swap;
-- int rows, cols, i, j, stack_sz, sp, x;
-- int *skewtab, *itab, *jtab, *max_tab;
-- long long res;
--
-- out = v_new_copy(outer);
-- in1 = v_new_copy(inner1);
-- in2 = v_new_copy(inner2);
--
-- v_length(out) = part_length(out);
-- v_length(in1) = part_length(in1);
-- v_length(in2) = part_length(in2);
--
-- while (v_length(out) > 0 &&
-- v_length(out) >= v_length(in1) &&
-- v_length(out) >= v_length(in2))
-- {
-- if (v_length(in1) == v_length(out))
-- {
-- _chop_cols(in1, out);
-- }
-- else if (v_length(in2) == v_length(out))
-- {
-- _chop_cols(in2, out);
-- }
-- else if (v_length(in1) > 0 &&
-- v_elem(in1, 0) == v_elem(out, 0))
-- {
-- _chop_rows(in1, out);
-- }
-- else if (v_length(in2) > 0 &&
-- v_elem(in2, 0) == v_elem(out, 0))
-- {
-- _chop_rows(in2, out);
-- }
-- else
-- break;
-- }
--
-- w_in1 = v_sum(in1);
-- w_in2 = v_sum(in2);
-- w_out = v_sum(out);
--
-- if ((! part_subset(in1, out)) ||
-- (! part_subset(in2, out)) ||
-- (w_out != w_in1 + w_in2))
-- {
-- v_free(in1);
-- v_free(in2);
-- v_free(out);
-- return 0;
-- }
--
-- if (w_in1 <= 1 || w_in2 <= 1)
-- {
-- v_free(in1);
-- v_free(in2);
-- v_free(out);
-- return 1;
-- }
--
-- out_conj = part_conjugate(out);
--
-- do_swap = (w_in1 < w_in2);
--
-- if (w_in1 == w_in2)
-- {
-- int c1 = v_elem(in1, 0);
-- int r1 = v_length(in1);
-- int n1 = (c1 < r1) ? c1 : r1;
--
-- int c2 = v_elem(in2, 0);
-- int r2 = v_length(in2);
-- int n2 = (c2 < r2) ? c2 : r2;
--
-- do_swap = (n1 < n2);
-- }
--
-- if (do_swap)
-- {
-- int tmp;
--
-- tmp = w_in1;
-- w_in1 = w_in2;
-- w_in2 = tmp;
--
-- vtmp = in1;
-- in1 = in2;
-- in2 = vtmp;
-- }
--
-- if (v_length(in2) > v_elem(in2, 0))
-- {
-- vtmp = out;
-- out = out_conj;
-- out_conj = vtmp;
--
-- vtmp = part_conjugate(in1);
-- v_free(in1);
-- in1 = vtmp;
--
-- vtmp = part_conjugate(in2);
-- v_free(in2);
-- in2 = vtmp;
-- }
--
-- rows = v_length(out);
-- cols = v_elem(out, 0);
--
-- vtmp = v_new(rows);
-- for (i = 0; i < v_length(in1); i++)
-- v_elem(vtmp, i) = v_elem(in1, i);
-- for ( ; i < rows; i++)
-- v_elem(vtmp, i) = 0;
-- v_free(in1);
-- in1 = vtmp;
--
-- cont = v_new_zero(v_length(in2));
--
-- stack_sz = w_out - w_in1;
-- skewtab = amalloc(stack_sz * sizeof(int));
-- max_tab = amalloc(stack_sz * sizeof(int));
--
-- itab = amalloc(stack_sz * sizeof(int));
-- jtab = amalloc(stack_sz * sizeof(int));
-- sp = 0;
-- for (i = 0; i < v_length(out); i++)
-- {
-- int left = (i < v_length(in1)) ? v_elem(in1, i) : 0;
-- for (j = v_elem(out, i) - 1; j >= left; j--)
-- {
-- itab[sp] = i;
-- jtab[sp] = j;
-- sp++;
-- }
-- }
--
-- res = 0;
--
-- skewtab[0] = 0;
-- v_elem(cont, 0) = 1;
--
-- sp = 1;
-- i = itab[1];
-- j = jtab[1];
-- max_tab[1] = (i == itab[0]) ? 0 :
-- v_length(in2) + i - v_elem(out_conj, j);;
-- x = (j == jtab[0]) ? 1 : 0;
--
-- while (sp > 0)
-- {
-- /* in each loop, do one of the following:
-- *
-- * a) incr x
-- *
-- * b) put x; incr sp; get x;
-- *
-- * c) decr sp; get x; incr x;
-- *
-- * where: put/get involves updating cont and skewtab and
-- *
-- * incr sp includes setting max_tab[sp].
-- */
--
-- if (x > max_tab[sp])
-- {
-- sp--;
--
-- x = skewtab[sp];
-- v_elem(cont, x)--;
--
-- x++;
-- continue;
-- }
--
-- if (v_elem(cont, x) == v_elem(in2, x) ||
-- (x > 0 && v_elem(cont, x) >= v_elem(cont, x-1)))
-- {
-- x++;
-- continue;
-- }
--
-- if (sp + 1 == stack_sz)
-- {
-- /* special case: incr res; then same as c) */
-- res++;
--
-- sp--;
--
-- x = skewtab[sp];
-- v_elem(cont, x)--;
--
-- x++;
-- continue;
-- }
--
-- skewtab[sp] = x;
-- v_elem(cont, x)++;
--
-- sp++;
-- i = itab[sp];
-- j = jtab[sp];
--
-- if (j < v_elem(out, i) - 1)
-- max_tab[sp] = skewtab[sp - 1];
-- else
-- max_tab[sp] = v_length(in2) + i - v_elem(out_conj, j);
--
-- x = 0;
-- if (i > 0 && j >= v_elem(in1, i-1))
-- x = skewtab[sp + v_elem(in1, i-1) - v_elem(out, i)] + 1;
-- }
--
-- afree(skewtab);
-- afree(max_tab);
-- afree(itab);
-- afree(jtab);
--
-- v_free(in1);
-- v_free(in2);
-- v_free(out);
-- v_free(out_conj);
-- v_free(cont);
--
-- return res;
--}
--
--
--void st_setmin(skewtab *st, int y, int x)
--{
-- while (y < st->rows)
-- {
-- while (x >= v_elem(st->inner, y))
-- {
-- int e;
-- if (y == 0 || x < v_elem(st->inner, y-1))
-- e = 0;
-- else
-- e = st->matrix[x + (y-1) * st->cols] + 1;
--
-- st->matrix[x + y * st->cols] = e;
--
-- v_elem(st->conts, e)++;
--
-- x--;
-- }
-- y++;
--
-- if (y < st->rows)
-- x = v_elem(st->outer, y) - 1;
-- }
--}
--
--
--skewtab *st_new(vector *outer, vector *inner, vector *conts, int maxrows)
--{
-- int rows, cols, clen;
-- skewtab *st;
--
-- rows = v_length(outer);
-- cols = (rows == 0) ? 0 : v_elem(outer, 0);
--
-- st = amalloc(sizeof(skewtab) + sizeof(int) * (rows * cols - 1));
-- st->outer = outer;
-- st->inner = inner;
--
-- clen = (conts != NULL) ? v_length(conts) : 0;
-- clen += rows;
-- st->conts = v_new_zero(clen);
-- if (conts != NULL)
-- {
-- int i;
-- for (i = 0; i < v_length(conts); i++)
-- v_elem(st->conts, i) = v_elem(conts, i);
-- }
--
-- st->rows = rows;
-- st->cols = cols;
--
-- st_setmin(st, 0, v_elem(outer, 0) - 1);
--
-- st->conjugate = NULL;
-- if (maxrows >= clen)
-- maxrows = 0;
-- st->maxrows = maxrows;
--
-- if (maxrows == 0)
-- return st;
--
-- if (v_elem(st->conts, maxrows) != 0)
-- {
-- st_free(st);
-- return NULL;
-- }
--
-- st->conjugate = part_conjugate(outer);
--
-- return st;
--}
--
--int st_next(skewtab *st)
--{
-- int x, y, e;
--
-- for (y = st->rows - 1; y >= 0; y--)
-- {
-- int xlim = v_elem(st->outer, y);
--
-- for (x = v_elem(st->inner, y); x < xlim; x++)
-- {
-- int elim = (st->maxrows == 0)
-- ? v_length(st->conts) - 1
-- : st->maxrows + y - v_elem(st->conjugate, x);
--
-- if (x != xlim - 1)
-- {
-- int next_cell = st->matrix[x+1 + y * st->cols];
-- if (next_cell < elim)
-- elim = next_cell;
-- }
--
-- e = st->matrix[x + y * st->cols];
-- v_elem(st->conts, e)--;
--
-- e++;
-- while (e <= elim &&
-- v_elem(st->conts, e) == v_elem(st->conts, e-1))
-- e++;
--
-- if (e <= elim)
-- {
-- st->matrix[x + y * st->cols] = e;
-- v_elem(st->conts, e)++;
-- st_setmin(st, y, x-1);
-- return 1;
-- }
-- }
-- }
--
-- return 0;
--}
--
--void st_print(skewtab *st)
--{
-- int x, y;
--
-- vector *inner = st->inner;
-- vector *outer = st->outer;
--
-- for (y = 0; y < v_length(outer); y++)
-- {
-- for (x = 0; x < v_elem(outer, y); x++)
-- {
-- if (x < v_elem(inner, y))
-- putchar(' ');
-- else
-- printf("%d", st->matrix[x + y * st->cols]);
-- }
-- putchar('\n');
-- }
--}
--
--void st_free(skewtab *st)
--{
-- v_free(st->inner);
-- v_free(st->outer);
-- v_free(st->conts);
-- if (st->conjugate != NULL)
-- v_free(st->conjugate);
-- afree(st);
--}
--
--
--hashtab *skew(vector *outer, vector *inner, int maxrows)
--{
-- vector *out0, *in0;
-- hashtab *res;
-- vector *part;
-- skewtab *st;
-- int n, i;
--
-- res = hash_new((cmp_t) v_cmp, (hash_t) v_hash);
--
-- n = v_length(outer);
-- if (v_length(inner) > n)
-- return res;
--
-- out0 = v_new_copy(outer);
--
-- in0 = v_new_zero(n);
-- for (i = 0; i < v_length(inner); i++)
-- v_elem(in0, i) = v_elem(inner, i);
--
-- if (! v_lesseq(in0, out0))
-- {
-- v_free(in0);
-- v_free(out0);
-- return res;
-- }
--
-- st = st_new(out0, in0, NULL, maxrows);
--
-- part = v_new(n);
--
-- do {
-- int i, *valuep;
--
-- for (i = 0; i < v_length(st->conts) && v_elem(st->conts, i) != 0; i++)
-- v_elem(part, i) = v_elem(st->conts, i);
-- v_length(part) = i;
--
-- valuep = hash_mkfindint(res, part);
-- if (hash_key_used)
-- part = v_new(n);
-- (*valuep)++;
-- } while (st_next(st));
--
-- st_free(st);
-- v_free(part);
--
-- return res;
--}
--
--
--hashtab *mult(vector *sh1, vector *sh2, int maxrows)
--{
-- skewtab *st;
-- vector *part, *out0, *in0;
-- hashtab *res;
-- int n;
--
-- res = hash_new((cmp_t) v_cmp, (hash_t) v_hash);
--
-- if (v_sum(sh1) > v_sum(sh2))
-- {
-- vector *tmp = sh1;
-- sh1 = sh2;
-- sh2 = tmp;
-- }
--
-- out0 = v_new_copy(sh1);
-- in0 = v_new_zero(v_length(sh1));
-- st = st_new(out0, in0, sh2, maxrows);
-- if (st == NULL)
-- return res;
--
-- n = v_length(sh1) + v_length(sh2);
-- part = v_new(n);
--
-- do {
-- int i, *valuep;
--
-- for (i = 0; i < v_length(st->conts) && v_elem(st->conts, i) != 0; i++)
-- v_elem(part, i) = v_elem(st->conts, i);
-- v_length(part) = i;
--
-- valuep = hash_mkfindint(res, part);
-- if (hash_key_used)
-- part = v_new(n);
-- (*valuep)++;
--
-- } while (st_next(st));
--
-- st_free(st);
-- v_free(part);
--
-- return res;
--}
--
--
--hashtab *schur_lc_mult(hashtab *lc1, hashtab *lc2, int maxrows)
--{
-- hash_itr itr1, itr2, itr;
-- hashtab *pairs = hash_new((cmp_t) vp_cmp, (hash_t) vp_hash);
-- hashtab *res;
--
-- for (hash_first(lc1, itr1); hash_good(itr1); hash_next(itr1))
-- {
-- vector *v1 = hash_key(itr1);
-- int c1 = hash_intvalue(itr1);
--
-- for (hash_first(lc2, itr2); hash_good(itr2); hash_next(itr2))
-- {
-- vector *v2 = hash_key(itr2);
-- int c2 = hash_intvalue(itr2);
--
-- vecpair *vp = vp_new_unordered(v_new_copy(v1), v_new_copy(v2));
-- int *valp = hash_mkfind(pairs, vp);
-- *((int *) valp) += c1 * c2;
-- if (! hash_key_used)
-- vp_free(vp);
-- }
-- }
--
-- res = hash_new((cmp_t) v_cmp, (hash_t) v_hash);
--
-- for (hash_first(pairs, itr); hash_good(itr); hash_next(itr))
-- {
-- vecpair *vp = hash_key(itr);
-- int c = hash_intvalue(itr);
-- hashtab *prd;
--
-- prd = mult(vp_first(vp), vp_second(vp), maxrows);
-- lincomb_add_multiple(res, c, prd, (freekey_t) v_free1, NULL);
-- hash_free(prd); /* lincomb_add_multiple has frees the vectors */
-- }
--
-- free_vp_lincomb(pairs);
--
-- return res;
--}
--
--
--hashtab *coprod(vector *part, int all)
--{
-- hashtab *res = hash_new((cmp_t) vp_cmp, (hash_t) vp_hash);
-- int df, in_wt, wt = v_sum(part);
-- vecpair *vp;
-- vector *in = v_new_copy(part);
--
-- do {
-- in_wt = v_sum(in);
--
-- if (2 * in_wt >= wt)
-- {
-- hashtab *sk = skew(part, in, 0);
-- hash_itr itr;
--
-- for (hash_first(sk, itr); hash_good(itr); hash_next(itr))
-- {
-- vector *in2 = hash_key(itr);
-- int coef = hash_intvalue(itr);
--
-- df = 1;
-- if (2 * in_wt == wt && (df = v_cmp(in, in2)) < 0)
-- {
-- v_free(in2);
-- continue;
-- }
--
-- vp = vp_new(v_new_copy(in), in2);
-- hash_insertint(res, vp, coef);
--
-- if (all && df != 0)
-- {
-- vp = vp_new(v_new_copy(in2), v_new_copy(in));
-- hash_insertint(res, vp, coef);
-- }
-- }
--
-- hash_free(sk);
-- }
-- } while (part_itr_sub(in, part));
-- v_free(in);
--
-- return res;
--}
--
--
--int rim_hook(vector *lambda, int rows, int cols, int *qp)
--{
-- int i, j, len, sign, q, n;
--
-- len = v_length(lambda);
-- n = rows + cols;
--
-- q = 0;
-- for (i = 0; i < len; i++)
-- {
-- int a = v_elem(lambda, i) + rows - i - 1;
-- q += a / n;
-- a %= n;
-- v_elem(lambda, i) = a - rows + 1;
-- }
--
-- /* bubble sort :-( */
-- sign = (rows & 1) ? 0 : q;
-- for (i = 1; i < len; i++)
-- {
-- int a = v_elem(lambda, i);
-- for (j = i; j > 0 && a > v_elem(lambda, j-1); j--)
-- {
-- v_elem(lambda, j) = v_elem(lambda, j-1);
-- }
-- if (j > 0 && a == v_elem(lambda, j-1))
-- return 0;
-- v_elem(lambda, j) = a;
-- sign += i - j;
-- }
--
-- for (i = 0; i < len; i++)
-- {
-- v_elem(lambda, i) += i;
-- if (v_elem(lambda, i) < 0)
-- return 0;
-- }
--
-- while (len > 0 && v_elem(lambda, len - 1) == 0)
-- len--;
-- v_length(lambda) = len;
-- *qp = q;
-- return (sign & 1) ? -1 : 1;
--}
--
--list *_quantum_reduce(hashtab* s, int rows, int cols)
--{
-- int sign, q, *valuep;
-- list *qlist;
-- hash_itr itr;
--
-- qlist = l_newsz(10);
--
-- for (hash_first(s, itr); hash_good(itr); hash_next(itr))
-- {
-- vector *lambda = hash_key(itr);
-- int coef = hash_intvalue(itr);
-- hashtab *tab;
--
-- sign = rim_hook(lambda, rows, cols, &q);
--
-- if (sign == 0)
-- {
-- v_free(lambda);
-- continue;
-- }
--
-- while (q >= l_length(qlist))
-- l_append(qlist, hash_new((cmp_t) v_cmp, (hash_t) v_hash));
--
-- tab = l_elem(qlist, q);
-- valuep = hash_mkfindint(tab, lambda);
-- *valuep += sign * coef;
-- if (! hash_key_used)
-- v_free(lambda);
-- }
--
-- return qlist;
--}
--
--list *quantum_reduce(hashtab* s, int rows, int cols)
--{
-- list *qlist = _quantum_reduce(s, rows, cols);
-- hash_free(s);
-- return qlist;
--}
--
--void fusion_reduce(hashtab *lc, int rows, int cols, int opt_zero)
--{
-- int i, j, k, n, lamj;
-- list *qlist = _quantum_reduce(lc, rows, cols);
-- if (l_length(qlist) == 0)
-- {
-- hash_reset(lc);
-- return;
-- }
-- hash_copy(lc, l_elem(qlist, 0));
-- hash_free(l_elem(qlist, 0));
-- n = rows + cols;
-- for (i = 1; i < l_length(qlist); i++)
-- {
-- hashtab *tab = l_elem(qlist, i);
-- hash_itr itr;
--
-- for (hash_first(tab, itr); hash_good(itr); hash_next(itr))
-- {
-- vector *lambda = hash_key(itr);
-- vector *mu;
--
-- if (hash_intvalue(itr) == 0 && opt_zero == 0)
-- continue;
--
-- mu = v_new(rows);
-- for (j = 0; j < rows; j++)
-- {
-- lamj = (j < v_length(lambda)) ? v_elem(lambda,j) : 0;
-- k = (j + i) % rows;
-- v_elem(mu,k) = lamj + ((i+j) / rows) * cols + i;
-- }
-- hash_insertint(lc, mu, hash_intvalue(itr));
-- }
--
-- free_vec_lincomb(tab);
-- }
-- l_free(qlist);
--}
--
---- a/lrcoef/symfcn.h
-+++ /dev/null
-@@ -1,43 +0,0 @@
--#ifndef _SYMFCN_H
--#define _SYMFCN_H
--
--#include <hashtab.h>
--#include <vector.h>
--
--int part_itr_sz(vector *part);
--int part_itr_sub(vector *part, vector *outer);
--int part_itr_between(vector *part, vector *inner, vector *outer);
--
--int part_length(vector *p);
--vector *part_conjugate(vector *p);
--int part_subset(vector *p1, vector *p2);
--
--long long lrcoef(vector *outer, vector *inner1, vector *inner2);
--
--hashtab *skew(vector *outer, vector *inner, int maxrows);
--hashtab *mult(vector *sh1, vector *sh2, int maxrows);
--hashtab *coprod(vector *part, int all);
--
--hashtab *schur_lc_mult(hashtab *lc1, hashtab *lc2, int maxrows);
--
--list *quantum_reduce(hashtab* s, int rows, int cols);
--void fusion_reduce(hashtab *lc, int rows, int cols, int opt_zero);
--
--
--typedef struct {
-- vector *outer;
-- vector *inner;
-- vector *conts;
-- int maxrows;
-- vector *conjugate;
-- int rows;
-- int cols;
-- int matrix[1];
--} skewtab;
--
--skewtab *st_new(vector *outer, vector *inner, vector *conts, int maxrows);
--int st_next(skewtab *st);
--void st_print(skewtab *st);
--void st_free(skewtab *st);
--
--#endif
---- /dev/null
-+++ b/symfcn/maple.c
-@@ -0,0 +1,86 @@
-+/* Littlewood-Richardson Calculator
-+ * Copyright (C) 1999- Anders S. Buch (asbuch at math rutgers edu)
-+ * See the file LICENSE for license information.
-+ */
-+
-+#include <stdio.h>
-+#include <vector.h>
-+#include <hashtab.h>
-+#include "maple.h"
-+
-+#define OUTPUT_WIDTH 60
-+
-+int _intlen(int x)
-+{
-+ int res = 1;
-+ if (x < 0) { x = -x; res++; }
-+ if (x >= 10) res++;
-+ if (x >= 100) res++;
-+ if (x >= 1000) res++;
-+ if (x >= 10000) res++;
-+ if (x >= 100000) res++;
-+ return res;
-+}
-+
-+int maple_print_term(int c, vector *v, char *letter)
-+{
-+ int x, i;
-+#ifdef MULTLINE
-+ int cols;
-+#endif
-+
-+ putchar((c < 0) ? '-' : '+');
-+ c = abs(c);
-+ printf("%d*%s[", c, letter);
-+#ifdef MULTLINE
-+ cols = _intlen(c) + strlen(letter) + 3 + v_length(v);
-+#endif
-+
-+ for (i = 0; i < v_length(v); i++)
-+ {
-+ if (i > 0)
-+ putchar(',');
-+ x = v_elem(v, i);
-+ printf("%d", x);
-+#ifdef MULTLINE
-+ cols += _intlen(x);
-+#endif
-+ }
-+ putchar(']');
-+#ifdef MULTLINE
-+ return cols;
-+#else
-+ return 0;
-+#endif
-+}
-+
-+void maple_print_lincomb(hashtab *ht, char *letter, int nl)
-+{
-+ hash_itr itr;
-+ int column;
-+
-+#ifdef MULTILINE
-+ putchar('(');
-+#endif
-+ column = 1;
-+ for (hash_first(ht, itr); hash_good(itr); hash_next(itr))
-+ {
-+ if (hash_intvalue(itr) == 0)
-+ continue;
-+
-+ column += maple_print_term(hash_intvalue(itr), hash_key(itr),letter);
-+#ifdef MULTILINE
-+ if (column >= OUTPUT_WIDTH)
-+ {
-+ putchar('\n');
-+ column = 0;
-+ }
-+#endif
-+ }
-+#ifdef MULTILINE
-+ printf(");\n");
-+#else
-+ if (nl)
-+ putchar('\n');
-+#endif
-+}
---- /dev/null
-+++ b/symfcn/maple.h
-@@ -0,0 +1,6 @@
-+#ifndef _MAPLE_H
-+#define _MAPLE_H
-+
-+void maple_print_lincomb(hashtab *ht, char *letter, int nl);
-+
-+#endif
---- /dev/null
-+++ b/symfcn/symfcn.c
-@@ -0,0 +1,873 @@
-+/* Littlewood-Richardson Calculator
-+ * Copyright (C) 1999- Anders S. Buch (asbuch at math rutgers edu)
-+ * See the file LICENSE for license information.
-+ */
-+
-+#include <stdio.h>
-+
-+#include <alloc.h>
-+#include <vector.h>
-+#include <hashtab.h>
-+
-+#include "symfcn.h"
-+
-+
-+int part_itr_sz(vector *part)
-+{
-+ int i, e, tot;
-+
-+ i = v_length(part) - 1;
-+ while (i >= 0 && v_elem(part, i) == 1)
-+ i--;
-+
-+ if (i < 0)
-+ return 0;
-+
-+ e = v_elem(part, i);
-+ tot = e + v_length(part) - i - 1;
-+
-+ while (tot >= e-1)
-+ {
-+ v_elem(part, i++) = e-1;
-+ tot -= e-1;
-+ }
-+ if (tot > 0)
-+ v_elem(part, i++) = tot;
-+ v_length(part) = i;
-+
-+ return 1;
-+}
-+
-+int part_itr_sub(vector *part, vector *outer)
-+{
-+ int i, e;
-+
-+ i = v_length(part) - 1;
-+ while (i >= 0 && v_elem(part, i) == 0)
-+ i--;
-+ if (i < 0)
-+ return 0;
-+
-+ e = v_elem(part, i) - 1;
-+ if (e == 0)
-+ {
-+ v_length(part) = i;
-+ return 1;
-+ }
-+
-+ while (i < v_length(outer))
-+ {
-+ int x = v_elem(outer, i);
-+ v_elem(part, i) = (e < x) ? e : x;
-+ i++;
-+ }
-+ v_length(part) = v_length(outer);
-+
-+ return 1;
-+}
-+
-+int part_itr_between(vector *part, vector *inner, vector *outer)
-+{
-+ int i, e;
-+
-+ i = v_length(part) - 1;
-+ while (i >= 0 && v_elem(part, i) == v_elem(inner, i))
-+ i--;
-+ if (i < 0)
-+ return 0;
-+
-+ e = v_elem(part, i) - 1;
-+ if (e == 0)
-+ {
-+ v_length(part) = i;
-+ return 1;
-+ }
-+
-+ while (i < v_length(outer))
-+ {
-+ int x = v_elem(outer, i);
-+ v_elem(part, i) = (e < x) ? e : x;
-+ i++;
-+ }
-+ v_length(part) = v_length(outer);
-+
-+ return 1;
-+}
-+
-+int part_length(vector *p)
-+{
-+ int n = v_length(p);
-+ while (n > 0 && v_elem(p, n-1) == 0)
-+ n--;
-+ return n;
-+}
-+
-+vector *part_conjugate(vector *p)
-+{
-+ int np, nc, j;
-+ vector *conj;
-+
-+ np = v_length(p);
-+ if (np == 0)
-+ return v_new(0);
-+
-+ nc = v_elem(p, 0);
-+ if (nc == 0)
-+ return v_new(0);
-+
-+ conj = v_new(nc);
-+ j = 0;
-+ while (np > 0)
-+ {
-+ int jlim = v_elem(p, np - 1);
-+ while (j < jlim)
-+ v_elem(conj, j++) = np;
-+ np--;
-+ }
-+
-+ return conj;
-+}
-+
-+int part_subset(vector *p1, vector *p2)
-+{
-+ int n;
-+
-+ n = part_length(p1);
-+ if (n > v_length(p2))
-+ return 0;
-+
-+ for (n--; n >= 0; n--)
-+ if (v_elem(p1, n) > v_elem(p2, n))
-+ return 0;
-+
-+ return 1;
-+}
-+
-+
-+void _chop_cols(vector *in1, vector *out)
-+{
-+ int n, m, mm, i;
-+
-+ n = v_length(in1);
-+ m = v_elem(in1, n - 1);
-+ mm = v_elem(out, n - 1);
-+ if (m > mm)
-+ m = mm;
-+
-+ for (i = 0; i < n; i++)
-+ {
-+ v_elem(in1, i) -= m;
-+ v_elem(out, i) -= m;
-+ }
-+
-+ v_length(in1) = part_length(in1);
-+ v_length(out) = part_length(out);
-+}
-+
-+void _chop_rows(vector *in1, vector *out)
-+{
-+ int m, i;
-+
-+ m = 1;
-+ while (m < v_length(in1) && v_elem(in1, m) == v_elem(out, m))
-+ m++;
-+
-+ for (i = 0; i < v_length(in1) - m; i++)
-+ v_elem(in1, i) = v_elem(in1, i + m);
-+ v_length(in1) -= m;
-+
-+ for (i = 0; i < v_length(out) - m; i++)
-+ v_elem(out, i) = v_elem(out, i + m);
-+ v_length(out) -= m;
-+}
-+
-+
-+long long lrcoef(vector *outer, vector *inner1, vector *inner2)
-+{
-+ vector *out, *in1, *in2, *out_conj, *cont, *vtmp;
-+ int w_out, w_in1, w_in2, do_swap;
-+ int rows, cols, i, j, stack_sz, sp, x;
-+ int *skewtab, *itab, *jtab, *max_tab;
-+ long long res;
-+
-+ out = v_new_copy(outer);
-+ in1 = v_new_copy(inner1);
-+ in2 = v_new_copy(inner2);
-+
-+ v_length(out) = part_length(out);
-+ v_length(in1) = part_length(in1);
-+ v_length(in2) = part_length(in2);
-+
-+ while (v_length(out) > 0 &&
-+ v_length(out) >= v_length(in1) &&
-+ v_length(out) >= v_length(in2))
-+ {
-+ if (v_length(in1) == v_length(out))
-+ {
-+ _chop_cols(in1, out);
-+ }
-+ else if (v_length(in2) == v_length(out))
-+ {
-+ _chop_cols(in2, out);
-+ }
-+ else if (v_length(in1) > 0 &&
-+ v_elem(in1, 0) == v_elem(out, 0))
-+ {
-+ _chop_rows(in1, out);
-+ }
-+ else if (v_length(in2) > 0 &&
-+ v_elem(in2, 0) == v_elem(out, 0))
-+ {
-+ _chop_rows(in2, out);
-+ }
-+ else
-+ break;
-+ }
-+
-+ w_in1 = v_sum(in1);
-+ w_in2 = v_sum(in2);
-+ w_out = v_sum(out);
-+
-+ if ((! part_subset(in1, out)) ||
-+ (! part_subset(in2, out)) ||
-+ (w_out != w_in1 + w_in2))
-+ {
-+ v_free(in1);
-+ v_free(in2);
-+ v_free(out);
-+ return 0;
-+ }
-+
-+ if (w_in1 <= 1 || w_in2 <= 1)
-+ {
-+ v_free(in1);
-+ v_free(in2);
-+ v_free(out);
-+ return 1;
-+ }
-+
-+ out_conj = part_conjugate(out);
-+
-+ do_swap = (w_in1 < w_in2);
-+
-+ if (w_in1 == w_in2)
-+ {
-+ int c1 = v_elem(in1, 0);
-+ int r1 = v_length(in1);
-+ int n1 = (c1 < r1) ? c1 : r1;
-+
-+ int c2 = v_elem(in2, 0);
-+ int r2 = v_length(in2);
-+ int n2 = (c2 < r2) ? c2 : r2;
-+
-+ do_swap = (n1 < n2);
-+ }
-+
-+ if (do_swap)
-+ {
-+ int tmp;
-+
-+ tmp = w_in1;
-+ w_in1 = w_in2;
-+ w_in2 = tmp;
-+
-+ vtmp = in1;
-+ in1 = in2;
-+ in2 = vtmp;
-+ }
-+
-+ if (v_length(in2) > v_elem(in2, 0))
-+ {
-+ vtmp = out;
-+ out = out_conj;
-+ out_conj = vtmp;
-+
-+ vtmp = part_conjugate(in1);
-+ v_free(in1);
-+ in1 = vtmp;
-+
-+ vtmp = part_conjugate(in2);
-+ v_free(in2);
-+ in2 = vtmp;
-+ }
-+
-+ rows = v_length(out);
-+ cols = v_elem(out, 0);
-+
-+ vtmp = v_new(rows);
-+ for (i = 0; i < v_length(in1); i++)
-+ v_elem(vtmp, i) = v_elem(in1, i);
-+ for ( ; i < rows; i++)
-+ v_elem(vtmp, i) = 0;
-+ v_free(in1);
-+ in1 = vtmp;
-+
-+ cont = v_new_zero(v_length(in2));
-+
-+ stack_sz = w_out - w_in1;
-+ skewtab = amalloc(stack_sz * sizeof(int));
-+ max_tab = amalloc(stack_sz * sizeof(int));
-+
-+ itab = amalloc(stack_sz * sizeof(int));
-+ jtab = amalloc(stack_sz * sizeof(int));
-+ sp = 0;
-+ for (i = 0; i < v_length(out); i++)
-+ {
-+ int left = (i < v_length(in1)) ? v_elem(in1, i) : 0;
-+ for (j = v_elem(out, i) - 1; j >= left; j--)
-+ {
-+ itab[sp] = i;
-+ jtab[sp] = j;
-+ sp++;
-+ }
-+ }
-+
-+ res = 0;
-+
-+ skewtab[0] = 0;
-+ v_elem(cont, 0) = 1;
-+
-+ sp = 1;
-+ i = itab[1];
-+ j = jtab[1];
-+ max_tab[1] = (i == itab[0]) ? 0 :
-+ v_length(in2) + i - v_elem(out_conj, j);;
-+ x = (j == jtab[0]) ? 1 : 0;
-+
-+ while (sp > 0)
-+ {
-+ /* in each loop, do one of the following:
-+ *
-+ * a) incr x
-+ *
-+ * b) put x; incr sp; get x;
-+ *
-+ * c) decr sp; get x; incr x;
-+ *
-+ * where: put/get involves updating cont and skewtab and
-+ *
-+ * incr sp includes setting max_tab[sp].
-+ */
-+
-+ if (x > max_tab[sp])
-+ {
-+ sp--;
-+
-+ x = skewtab[sp];
-+ v_elem(cont, x)--;
-+
-+ x++;
-+ continue;
-+ }
-+
-+ if (v_elem(cont, x) == v_elem(in2, x) ||
-+ (x > 0 && v_elem(cont, x) >= v_elem(cont, x-1)))
-+ {
-+ x++;
-+ continue;
-+ }
-+
-+ if (sp + 1 == stack_sz)
-+ {
-+ /* special case: incr res; then same as c) */
-+ res++;
-+
-+ sp--;
-+
-+ x = skewtab[sp];
-+ v_elem(cont, x)--;
-+
-+ x++;
-+ continue;
-+ }
-+
-+ skewtab[sp] = x;
-+ v_elem(cont, x)++;
-+
-+ sp++;
-+ i = itab[sp];
-+ j = jtab[sp];
-+
-+ if (j < v_elem(out, i) - 1)
-+ max_tab[sp] = skewtab[sp - 1];
-+ else
-+ max_tab[sp] = v_length(in2) + i - v_elem(out_conj, j);
-+
-+ x = 0;
-+ if (i > 0 && j >= v_elem(in1, i-1))
-+ x = skewtab[sp + v_elem(in1, i-1) - v_elem(out, i)] + 1;
-+ }
-+
-+ afree(skewtab);
-+ afree(max_tab);
-+ afree(itab);
-+ afree(jtab);
-+
-+ v_free(in1);
-+ v_free(in2);
-+ v_free(out);
-+ v_free(out_conj);
-+ v_free(cont);
-+
-+ return res;
-+}
-+
-+
-+void st_setmin(skewtab *st, int y, int x)
-+{
-+ while (y < st->rows)
-+ {
-+ while (x >= v_elem(st->inner, y))
-+ {
-+ int e;
-+ if (y == 0 || x < v_elem(st->inner, y-1))
-+ e = 0;
-+ else
-+ e = st->matrix[x + (y-1) * st->cols] + 1;
-+
-+ st->matrix[x + y * st->cols] = e;
-+
-+ v_elem(st->conts, e)++;
-+
-+ x--;
-+ }
-+ y++;
-+
-+ if (y < st->rows)
-+ x = v_elem(st->outer, y) - 1;
-+ }
-+}
-+
-+
-+skewtab *st_new(vector *outer, vector *inner, vector *conts, int maxrows)
-+{
-+ int rows, cols, clen;
-+ skewtab *st;
-+
-+ rows = v_length(outer);
-+ cols = (rows == 0) ? 0 : v_elem(outer, 0);
-+
-+ st = amalloc(sizeof(skewtab) + sizeof(int) * (rows * cols - 1));
-+ st->outer = outer;
-+ st->inner = inner;
-+
-+ clen = (conts != NULL) ? v_length(conts) : 0;
-+ clen += rows;
-+ st->conts = v_new_zero(clen);
-+ if (conts != NULL)
-+ {
-+ int i;
-+ for (i = 0; i < v_length(conts); i++)
-+ v_elem(st->conts, i) = v_elem(conts, i);
-+ }
-+
-+ st->rows = rows;
-+ st->cols = cols;
-+
-+ st_setmin(st, 0, v_elem(outer, 0) - 1);
-+
-+ st->conjugate = NULL;
-+ if (maxrows >= clen)
-+ maxrows = 0;
-+ st->maxrows = maxrows;
-+
-+ if (maxrows == 0)
-+ return st;
-+
-+ if (v_elem(st->conts, maxrows) != 0)
-+ {
-+ st_free(st);
-+ return NULL;
-+ }
-+
-+ st->conjugate = part_conjugate(outer);
-+
-+ return st;
-+}
-+
-+int st_next(skewtab *st)
-+{
-+ int x, y, e;
-+
-+ for (y = st->rows - 1; y >= 0; y--)
-+ {
-+ int xlim = v_elem(st->outer, y);
-+
-+ for (x = v_elem(st->inner, y); x < xlim; x++)
-+ {
-+ int elim = (st->maxrows == 0)
-+ ? v_length(st->conts) - 1
-+ : st->maxrows + y - v_elem(st->conjugate, x);
-+
-+ if (x != xlim - 1)
-+ {
-+ int next_cell = st->matrix[x+1 + y * st->cols];
-+ if (next_cell < elim)
-+ elim = next_cell;
-+ }
-+
-+ e = st->matrix[x + y * st->cols];
-+ v_elem(st->conts, e)--;
-+
-+ e++;
-+ while (e <= elim &&
-+ v_elem(st->conts, e) == v_elem(st->conts, e-1))
-+ e++;
-+
-+ if (e <= elim)
-+ {
-+ st->matrix[x + y * st->cols] = e;
-+ v_elem(st->conts, e)++;
-+ st_setmin(st, y, x-1);
-+ return 1;
-+ }
-+ }
-+ }
-+
-+ return 0;
-+}
-+
-+void st_print(skewtab *st)
-+{
-+ int x, y;
-+
-+ vector *inner = st->inner;
-+ vector *outer = st->outer;
-+
-+ for (y = 0; y < v_length(outer); y++)
-+ {
-+ for (x = 0; x < v_elem(outer, y); x++)
-+ {
-+ if (x < v_elem(inner, y))
-+ putchar(' ');
-+ else
-+ printf("%d", st->matrix[x + y * st->cols]);
-+ }
-+ putchar('\n');
-+ }
-+}
-+
-+void st_free(skewtab *st)
-+{
-+ v_free(st->inner);
-+ v_free(st->outer);
-+ v_free(st->conts);
-+ if (st->conjugate != NULL)
-+ v_free(st->conjugate);
-+ afree(st);
-+}
-+
-+
-+hashtab *skew(vector *outer, vector *inner, int maxrows)
-+{
-+ vector *out0, *in0;
-+ hashtab *res;
-+ vector *part;
-+ skewtab *st;
-+ int n, i;
-+
-+ res = hash_new((cmp_t) v_cmp, (hash_t) v_hash);
-+
-+ n = v_length(outer);
-+ if (v_length(inner) > n)
-+ return res;
-+
-+ out0 = v_new_copy(outer);
-+
-+ in0 = v_new_zero(n);
-+ for (i = 0; i < v_length(inner); i++)
-+ v_elem(in0, i) = v_elem(inner, i);
-+
-+ if (! v_lesseq(in0, out0))
-+ {
-+ v_free(in0);
-+ v_free(out0);
-+ return res;
-+ }
-+
-+ st = st_new(out0, in0, NULL, maxrows);
-+
-+ part = v_new(n);
-+
-+ do {
-+ int i, *valuep;
-+
-+ for (i = 0; i < v_length(st->conts) && v_elem(st->conts, i) != 0; i++)
-+ v_elem(part, i) = v_elem(st->conts, i);
-+ v_length(part) = i;
-+
-+ valuep = hash_mkfindint(res, part);
-+ if (hash_key_used)
-+ part = v_new(n);
-+ (*valuep)++;
-+ } while (st_next(st));
-+
-+ st_free(st);
-+ v_free(part);
-+
-+ return res;
-+}
-+
-+
-+hashtab *mult(vector *sh1, vector *sh2, int maxrows)
-+{
-+ skewtab *st;
-+ vector *part, *out0, *in0;
-+ hashtab *res;
-+ int n;
-+
-+ res = hash_new((cmp_t) v_cmp, (hash_t) v_hash);
-+
-+ if (v_sum(sh1) > v_sum(sh2))
-+ {
-+ vector *tmp = sh1;
-+ sh1 = sh2;
-+ sh2 = tmp;
-+ }
-+
-+ out0 = v_new_copy(sh1);
-+ in0 = v_new_zero(v_length(sh1));
-+ st = st_new(out0, in0, sh2, maxrows);
-+ if (st == NULL)
-+ return res;
-+
-+ n = v_length(sh1) + v_length(sh2);
-+ part = v_new(n);
-+
-+ do {
-+ int i, *valuep;
-+
-+ for (i = 0; i < v_length(st->conts) && v_elem(st->conts, i) != 0; i++)
-+ v_elem(part, i) = v_elem(st->conts, i);
-+ v_length(part) = i;
-+
-+ valuep = hash_mkfindint(res, part);
-+ if (hash_key_used)
-+ part = v_new(n);
-+ (*valuep)++;
-+
-+ } while (st_next(st));
-+
-+ st_free(st);
-+ v_free(part);
-+
-+ return res;
-+}
-+
-+
-+hashtab *schur_lc_mult(hashtab *lc1, hashtab *lc2, int maxrows)
-+{
-+ hash_itr itr1, itr2, itr;
-+ hashtab *pairs = hash_new((cmp_t) vp_cmp, (hash_t) vp_hash);
-+ hashtab *res;
-+
-+ for (hash_first(lc1, itr1); hash_good(itr1); hash_next(itr1))
-+ {
-+ vector *v1 = hash_key(itr1);
-+ int c1 = hash_intvalue(itr1);
-+
-+ for (hash_first(lc2, itr2); hash_good(itr2); hash_next(itr2))
-+ {
-+ vector *v2 = hash_key(itr2);
-+ int c2 = hash_intvalue(itr2);
-+
-+ vecpair *vp = vp_new_unordered(v_new_copy(v1), v_new_copy(v2));
-+ int *valp = hash_mkfind(pairs, vp);
-+ *((int *) valp) += c1 * c2;
-+ if (! hash_key_used)
-+ vp_free(vp);
-+ }
-+ }
-+
-+ res = hash_new((cmp_t) v_cmp, (hash_t) v_hash);
-+
-+ for (hash_first(pairs, itr); hash_good(itr); hash_next(itr))
-+ {
-+ vecpair *vp = hash_key(itr);
-+ int c = hash_intvalue(itr);
-+ hashtab *prd;
-+
-+ prd = mult(vp_first(vp), vp_second(vp), maxrows);
-+ lincomb_add_multiple(res, c, prd, (freekey_t) v_free1, NULL);
-+ hash_free(prd); /* lincomb_add_multiple has frees the vectors */
-+ }
-+
-+ free_vp_lincomb(pairs);
-+
-+ return res;
-+}
-+
-+
-+hashtab *coprod(vector *part, int all)
-+{
-+ hashtab *res = hash_new((cmp_t) vp_cmp, (hash_t) vp_hash);
-+ int df, in_wt, wt = v_sum(part);
-+ vecpair *vp;
-+ vector *in = v_new_copy(part);
-+
-+ do {
-+ in_wt = v_sum(in);
-+
-+ if (2 * in_wt >= wt)
-+ {
-+ hashtab *sk = skew(part, in, 0);
-+ hash_itr itr;
-+
-+ for (hash_first(sk, itr); hash_good(itr); hash_next(itr))
-+ {
-+ vector *in2 = hash_key(itr);
-+ int coef = hash_intvalue(itr);
-+
-+ df = 1;
-+ if (2 * in_wt == wt && (df = v_cmp(in, in2)) < 0)
-+ {
-+ v_free(in2);
-+ continue;
-+ }
-+
-+ vp = vp_new(v_new_copy(in), in2);
-+ hash_insertint(res, vp, coef);
-+
-+ if (all && df != 0)
-+ {
-+ vp = vp_new(v_new_copy(in2), v_new_copy(in));
-+ hash_insertint(res, vp, coef);
-+ }
-+ }
-+
-+ hash_free(sk);
-+ }
-+ } while (part_itr_sub(in, part));
-+ v_free(in);
-+
-+ return res;
-+}
-+
-+
-+int rim_hook(vector *lambda, int rows, int cols, int *qp)
-+{
-+ int i, j, len, sign, q, n;
-+
-+ len = v_length(lambda);
-+ n = rows + cols;
-+
-+ q = 0;
-+ for (i = 0; i < len; i++)
-+ {
-+ int a = v_elem(lambda, i) + rows - i - 1;
-+ q += a / n;
-+ a %= n;
-+ v_elem(lambda, i) = a - rows + 1;
-+ }
-+
-+ /* bubble sort :-( */
-+ sign = (rows & 1) ? 0 : q;
-+ for (i = 1; i < len; i++)
-+ {
-+ int a = v_elem(lambda, i);
-+ for (j = i; j > 0 && a > v_elem(lambda, j-1); j--)
-+ {
-+ v_elem(lambda, j) = v_elem(lambda, j-1);
-+ }
-+ if (j > 0 && a == v_elem(lambda, j-1))
-+ return 0;
-+ v_elem(lambda, j) = a;
-+ sign += i - j;
-+ }
-+
-+ for (i = 0; i < len; i++)
-+ {
-+ v_elem(lambda, i) += i;
-+ if (v_elem(lambda, i) < 0)
-+ return 0;
-+ }
-+
-+ while (len > 0 && v_elem(lambda, len - 1) == 0)
-+ len--;
-+ v_length(lambda) = len;
-+ *qp = q;
-+ return (sign & 1) ? -1 : 1;
-+}
-+
-+list *_quantum_reduce(hashtab* s, int rows, int cols)
-+{
-+ int sign, q, *valuep;
-+ list *qlist;
-+ hash_itr itr;
-+
-+ qlist = l_newsz(10);
-+
-+ for (hash_first(s, itr); hash_good(itr); hash_next(itr))
-+ {
-+ vector *lambda = hash_key(itr);
-+ int coef = hash_intvalue(itr);
-+ hashtab *tab;
-+
-+ sign = rim_hook(lambda, rows, cols, &q);
-+
-+ if (sign == 0)
-+ {
-+ v_free(lambda);
-+ continue;
-+ }
-+
-+ while (q >= l_length(qlist))
-+ l_append(qlist, hash_new((cmp_t) v_cmp, (hash_t) v_hash));
-+
-+ tab = l_elem(qlist, q);
-+ valuep = hash_mkfindint(tab, lambda);
-+ *valuep += sign * coef;
-+ if (! hash_key_used)
-+ v_free(lambda);
-+ }
-+
-+ return qlist;
-+}
-+
-+list *quantum_reduce(hashtab* s, int rows, int cols)
-+{
-+ list *qlist = _quantum_reduce(s, rows, cols);
-+ hash_free(s);
-+ return qlist;
-+}
-+
-+void fusion_reduce(hashtab *lc, int rows, int cols, int opt_zero)
-+{
-+ int i, j, k, n, lamj;
-+ list *qlist = _quantum_reduce(lc, rows, cols);
-+ if (l_length(qlist) == 0)
-+ {
-+ hash_reset(lc);
-+ return;
-+ }
-+ hash_copy(lc, l_elem(qlist, 0));
-+ hash_free(l_elem(qlist, 0));
-+ n = rows + cols;
-+ for (i = 1; i < l_length(qlist); i++)
-+ {
-+ hashtab *tab = l_elem(qlist, i);
-+ hash_itr itr;
-+
-+ for (hash_first(tab, itr); hash_good(itr); hash_next(itr))
-+ {
-+ vector *lambda = hash_key(itr);
-+ vector *mu;
-+
-+ if (hash_intvalue(itr) == 0 && opt_zero == 0)
-+ continue;
-+
-+ mu = v_new(rows);
-+ for (j = 0; j < rows; j++)
-+ {
-+ lamj = (j < v_length(lambda)) ? v_elem(lambda,j) : 0;
-+ k = (j + i) % rows;
-+ v_elem(mu,k) = lamj + ((i+j) / rows) * cols + i;
-+ }
-+ hash_insertint(lc, mu, hash_intvalue(itr));
-+ }
-+
-+ free_vec_lincomb(tab);
-+ }
-+ l_free(qlist);
-+}
-+
---- /dev/null
-+++ b/symfcn/symfcn.h
-@@ -0,0 +1,43 @@
-+#ifndef _SYMFCN_H
-+#define _SYMFCN_H
-+
-+#include <hashtab.h>
-+#include <vector.h>
-+
-+int part_itr_sz(vector *part);
-+int part_itr_sub(vector *part, vector *outer);
-+int part_itr_between(vector *part, vector *inner, vector *outer);
-+
-+int part_length(vector *p);
-+vector *part_conjugate(vector *p);
-+int part_subset(vector *p1, vector *p2);
-+
-+long long lrcoef(vector *outer, vector *inner1, vector *inner2);
-+
-+hashtab *skew(vector *outer, vector *inner, int maxrows);
-+hashtab *mult(vector *sh1, vector *sh2, int maxrows);
-+hashtab *coprod(vector *part, int all);
-+
-+hashtab *schur_lc_mult(hashtab *lc1, hashtab *lc2, int maxrows);
-+
-+list *quantum_reduce(hashtab* s, int rows, int cols);
-+void fusion_reduce(hashtab *lc, int rows, int cols, int opt_zero);
-+
-+
-+typedef struct {
-+ vector *outer;
-+ vector *inner;
-+ vector *conts;
-+ int maxrows;
-+ vector *conjugate;
-+ int rows;
-+ int cols;
-+ int matrix[1];
-+} skewtab;
-+
-+skewtab *st_new(vector *outer, vector *inner, vector *conts, int maxrows);
-+int st_next(skewtab *st);
-+void st_print(skewtab *st);
-+void st_free(skewtab *st);
-+
-+#endif
---- /dev/null
-+++ b/symfcn/Makefile.am
-@@ -0,0 +1,4 @@
-+AM_CFLAGS = -I .. -I ../mathlib
-+
-+noinst_LTLIBRARIES = libsymfcn.la
-+libsymfcn_la_SOURCES = symfcn.c maple.c
---- a/Makefile.am
-+++ b/Makefile.am
-@@ -1,12 +1,12 @@
- ACLOCAL_AMFLAGS=-I m4
--SUBDIRS=mathlib lrcoef schubert
-+SUBDIRS=mathlib symfcn schubert . lrcoef
-
- lib_LTLIBRARIES = liblrcalc.la
- liblrcalc_la_SOURCES =
- liblrcalc_la_LDFLAGS = $(LIBLRCALC_LDFLAGS) -version-info 0:0:0
--liblrcalc_la_LIBADD = mathlib/libmath.la lrcoef/libsymfcn.la schubert/libschub.la
-+liblrcalc_la_LIBADD = mathlib/libmath.la symfcn/libsymfcn.la schubert/libschub.la
-
- lrcalcincludedir = $(includedir)/lrcalc
--lrcalcinclude_HEADERS=mathlib/*.h lrcoef/*.h schubert/*.h
-+lrcalcinclude_HEADERS=mathlib/*.h schubert/*.h symfcn/*.h
-
- TESTS=testsuite
---- a/configure.ac
-+++ b/configure.ac
-@@ -2,7 +2,7 @@
-
- AC_PREREQ([2.67])
- AC_INIT([lrcalc],[1.1.6],[asbuch at math rutgers edu])
--AC_CONFIG_SRCDIR(lrcoef/symfcn.h)
-+AC_CONFIG_SRCDIR(symfcn/symfcn.h)
- AC_CONFIG_HEADERS([config.h])
-
- AC_CONFIG_MACRO_DIR([m4])
-@@ -51,5 +51,6 @@
- AC_CONFIG_FILES([Makefile
- lrcoef/Makefile
- mathlib/Makefile
-- schubert/Makefile])
-+ schubert/Makefile
-+ symfcn/Makefile])
- AC_OUTPUT
---- a/schubert/Makefile.am
-+++ b/schubert/Makefile.am
-@@ -1,8 +1,8 @@
--AM_CFLAGS = -I .. -I ../mathlib -I ../lrcoef
-+AM_CFLAGS = -I .. -I ../mathlib -I ../symfcn
-
- bin_PROGRAMS = schubmult
-
- noinst_LTLIBRARIES = libschub.la
- libschub_la_SOURCES = schublib.c lincomb.c
-
--schubmult_LDADD = ../mathlib/libmath.la ../lrcoef/libsymfcn.la libschub.la
-+schubmult_LDADD = ../mathlib/libmath.la ../symfcn/libsymfcn.la libschub.la
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/lrcalc.git
More information about the debian-science-commits
mailing list