aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar herbelin <herbelin@85f007b7-540e-0410-9357-904b9bb8a0f7>2008-05-19 19:10:40 +0000
committerGravatar herbelin <herbelin@85f007b7-540e-0410-9357-904b9bb8a0f7>2008-05-19 19:10:40 +0000
commit7c51ef20064ed4f44a4e1dcb2040ec4b74919b5f (patch)
tree4cc4f55d026344c86de4381aa16cd2aa20f69150
parent133516a1acebebfce527204fe5109a5eecb9bb45 (diff)
Intégration de micromega ("omicron" pour fourier et sa variante sur Z,
"micromega" et "sos" pour les problèmes non linéaires sous-traités à csdp); mise en place d'un cache pour pouvoir rejouer les preuves sans avoir besoin de csdp (pour l'instant c'est du bricolage, faudra affiner cela). git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@10947 85f007b7-540e-0410-9357-904b9bb8a0f7
-rw-r--r--Makefile.build42
-rw-r--r--Makefile.common47
-rw-r--r--contrib/micromega/CheckerMaker.v20
-rw-r--r--contrib/micromega/Env.v182
-rw-r--r--contrib/micromega/EnvRing.v (renamed from contrib/micromega/NRing.v)224
-rw-r--r--contrib/micromega/Examples.v117
-rw-r--r--contrib/micromega/LICENSE.sos29
-rw-r--r--contrib/micromega/MExtraction.v23
-rw-r--r--contrib/micromega/Micromegatac.v79
-rw-r--r--contrib/micromega/OrderedRing.v25
-rw-r--r--contrib/micromega/QMicromega.v259
-rw-r--r--contrib/micromega/RMicromega.v148
-rw-r--r--contrib/micromega/Refl.v69
-rw-r--r--contrib/micromega/RingMicromega.v390
-rw-r--r--contrib/micromega/Tauto.v324
-rw-r--r--contrib/micromega/VarMap.v36
-rw-r--r--contrib/micromega/ZCoeff.v29
-rw-r--r--contrib/micromega/ZMicromega.v714
-rw-r--r--contrib/micromega/certificate.ml618
-rw-r--r--contrib/micromega/coq_micromega.ml1289
-rw-r--r--contrib/micromega/csdpcert.ml333
-rw-r--r--contrib/micromega/g_micromega.ml459
-rw-r--r--contrib/micromega/mfourier.ml667
-rw-r--r--contrib/micromega/micromega.ml1512
-rw-r--r--contrib/micromega/micromega.mli398
-rw-r--r--contrib/micromega/mutils.ml305
-rw-r--r--contrib/micromega/sos.ml1919
-rw-r--r--contrib/micromega/sos.mli66
-rw-r--r--contrib/micromega/vector.ml674
-rw-r--r--scripts/coqmktop.ml2
-rwxr-xr-xtest-suite/check2
-rw-r--r--test-suite/csdp.cache13100
-rw-r--r--test-suite/micromega/bertot.v22
-rw-r--r--test-suite/micromega/example.v347
-rw-r--r--test-suite/micromega/heap3_vcgen_25.v38
-rw-r--r--test-suite/micromega/qexample.v62
-rw-r--r--test-suite/micromega/rexample.v62
-rw-r--r--test-suite/micromega/square.v61
-rw-r--r--test-suite/micromega/zomicron.v27
-rw-r--r--test-suite/success/unification.v8
40 files changed, 23960 insertions, 368 deletions
diff --git a/Makefile.build b/Makefile.build
index 4b4ba73e9..598047dec 100644
--- a/Makefile.build
+++ b/Makefile.build
@@ -59,7 +59,7 @@ LOCALINCLUDES=-I config -I tools -I tools/coqdoc \
-I scripts -I lib -I kernel -I kernel/byterun -I library \
-I proofs -I tactics -I pretyping \
-I interp -I toplevel -I parsing -I ide/utils -I ide \
- -I contrib/omega -I contrib/romega \
+ -I contrib/omega -I contrib/romega -I contrib/micromega \
-I contrib/ring -I contrib/dp -I contrib/setoid_ring \
-I contrib/xml -I contrib/extraction \
-I contrib/interface -I contrib/fourier \
@@ -163,12 +163,12 @@ coqlight: theories-light tools coqbinaries
states:: states/initial.coq
-$(COQTOPOPT): $(COQMKTOP) $(LINKCMX) $(LIBCOQRUN) $(USERTACCMX)
+$(COQTOPOPT): $(COQMKTOP) $(LINKCMX) $(LIBCOQRUN)
$(SHOW)'COQMKTOP -o $@'
$(HIDE)$(COQMKTOP) -opt $(OPTFLAGS) -o $@
$(STRIP) $@
-$(COQTOPBYTE): $(COQMKTOP) $(LINKCMO) $(LIBCOQRUN) $(USERTACCMO)
+$(COQTOPBYTE): $(COQMKTOP) $(LINKCMO) $(LIBCOQRUN)
$(SHOW)'COQMKTOP -o $@'
$(HIDE)$(COQMKTOP) -top $(BYTEFLAGS) -o $@
@@ -307,14 +307,13 @@ parsing/highparsing.cmxa: $(HIGHPARSING:.cmo=.cmx)
$(SHOW)'OCAMLOPT -a -o $@'
$(HIDE)$(OCAMLOPT) $(OPTFLAGS) -a -o $@ $(HIGHPARSING:.cmo=.cmx)
-tactics/hightactics.cma: $(HIGHTACTICS) $(USERTACCMO)
+tactics/hightactics.cma: $(HIGHTACTICS)
$(SHOW)'OCAMLC -a -o $@'
- $(HIDE)$(OCAMLC) $(BYTEFLAGS) -a -o $@ $(HIGHTACTICS) $(USERTACCMO)
+ $(HIDE)$(OCAMLC) $(BYTEFLAGS) -a -o $@ $(HIGHTACTICS)
-tactics/hightactics.cmxa: $(HIGHTACTICS:.cmo=.cmx) $(USERTACCMO:.cmo=.cmx)
+tactics/hightactics.cmxa: $(HIGHTACTICS:.cmo=.cmx)
$(SHOW)'OCAMLOPT -a -o $@'
- $(HIDE)$(OCAMLOPT) $(OPTFLAGS) -a -o $@ $(HIGHTACTICS:.cmo=.cmx) \
- $(USERTACCMO:.cmo=.cmx)
+ $(HIDE)$(OCAMLOPT) $(OPTFLAGS) -a -o $@ $(HIGHTACTICS:.cmo=.cmx)
contrib/contrib.cma: $(CONTRIB)
$(SHOW)'OCAMLC -a -o $@'
@@ -325,6 +324,20 @@ contrib/contrib.cmxa: $(CONTRIB:.cmo=.cmx)
$(HIDE)$(OCAMLOPT) $(OPTFLAGS) -a -o $@ $(CONTRIB:.cmo=.cmx)
###########################################################################
+# Csdp to micromega special targets
+###########################################################################
+
+ifeq ($(BEST),opt)
+bin/csdpcert$(EXE): $(CSDPCERTCMX)
+ $(SHOW)'OCAMLOPT -o $@'
+ $(HIDE)$(OCAMLOPT) $(OPTFLAGS) nums.cmxa -o $@ $(CSDPCERTCMX)
+else
+bin/csdpcert$(EXE): $(CSDPCERTCMO)
+ $(SHOW)'OCAMLC -o $@'
+ $(HIDE)$(OCAMLC) -custom $(BYTEFLAGS) nums.cma -o $@ $(CSDPCERTCMO)
+endif
+
+###########################################################################
# CoqIde special targets
###########################################################################
@@ -343,12 +356,12 @@ coqide-byte: $(COQIDEBYTE) $(COQIDE)
coqide-opt: $(COQIDEBYTE) $(COQIDEOPT) $(COQIDE)
coqide-files: $(IDEFILES)
-$(COQIDEOPT): $(COQMKTOP) $(LINKCMX) $(LIBCOQRUN) $(USERTACCMX) ide/ide.cmxa
+$(COQIDEOPT): $(COQMKTOP) $(LINKCMX) $(LIBCOQRUN) ide/ide.cmxa
$(SHOW)'COQMKTOP -o $@'
$(HIDE)$(COQMKTOP) -ide -opt $(OPTFLAGS) -o $@
$(STRIP) $@
-$(COQIDEBYTE): $(COQMKTOP) $(LINKCMO) $(LIBCOQRUN) $(USERTACCMO) ide/ide.cma
+$(COQIDEBYTE): $(COQMKTOP) $(LINKCMO) $(LIBCOQRUN) ide/ide.cma
$(SHOW)'COQMKTOP -o $@'
$(HIDE)$(COQMKTOP) -g -ide -top $(BYTEFLAGS) -o $@
@@ -410,23 +423,23 @@ pcoq: pcoq-binaries pcoq-files
pcoq-binaries:: $(COQINTERFACE)
-bin/coq-interface$(EXE): $(COQMKTOP) $(LINKCMO) $(LIBCOQRUN) $(USERTACCMO) $(INTERFACE)
+bin/coq-interface$(EXE): $(COQMKTOP) $(LINKCMO) $(LIBCOQRUN) $(INTERFACE)
$(SHOW)'COQMKTOP -o $@'
$(HIDE)$(COQMKTOP) -top $(BYTEFLAGS) -o $@ $(INTERFACE)
-bin/coq-interface.opt$(EXE): $(COQMKTOP) $(LINKCMX) $(LIBCOQRUN) $(USERTACCMX) $(INTERFACECMX)
+bin/coq-interface.opt$(EXE): $(COQMKTOP) $(LINKCMX) $(LIBCOQRUN) $(INTERFACECMX)
$(SHOW)'COQMKTOP -o $@'
$(HIDE)$(COQMKTOP) -opt $(OPTFLAGS) -o $@ $(INTERFACECMX)
bin/parser$(EXE):$(LIBCOQRUN) $(PARSERCMO)
$(SHOW)'OCAMLC -o $@'
$(HIDE)$(OCAMLC) -custom -linkall $(BYTEFLAGS) -o $@ \
- dynlink.cma $(LIBCOQRUN) $(CMA) $(PARSERCMO)
+ dynlink.cma nums.cma $(LIBCOQRUN) $(CMA) $(PARSERCMO)
bin/parser.opt$(EXE): $(LIBCOQRUN) $(PARSERCMX)
$(SHOW)'OCAMLOPT -o $@'
$(HIDE)$(OCAMLOPT) -linkall $(OPTFLAGS) -o $@ \
- $(LIBCOQRUN) $(CMXA) $(PARSERCMX)
+ $(LIBCOQRUN) nums.cmxa $(CMXA) $(PARSERCMX)
pcoq-files:: $(INTERFACEVO) $(INTERFACERC)
@@ -497,6 +510,7 @@ noreal: logic arith bool zarith qarith lists sets fsets relations \
contrib: $(CONTRIBVO) $(CONTRIBCMO)
omega: $(OMEGAVO) $(OMEGACMO) $(ROMEGAVO) $(ROMEGACMO)
+micromega: $(MICROMEGAVO) $(MICROMEGACMO) $(CSDPCERT)
ring: $(RINGVO) $(RINGCMO)
setoid_ring: $(NEWRINGVO) $(NEWRINGCMO)
dp: $(DPCMO)
diff --git a/Makefile.common b/Makefile.common
index 4c86d6716..354a14724 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -38,6 +38,8 @@ OTHERBINARIES:=$(COQMKTOPBYTE) $(COQCBYTE)
MINICOQ:=bin/minicoq$(EXE)
+CSDPCERT:=bin/csdpcert
+
###########################################################################
# tools
###########################################################################
@@ -212,13 +214,8 @@ TOPLEVEL:=\
HIGHTACTICS:=\
tactics/refine.cmo tactics/extraargs.cmo \
- tactics/extratactics.cmo tactics/eauto.cmo tactics/class_tactics.cmo
-
-SPECTAC:= tactics/tauto.ml4 tactics/eqdecide.ml4
-USERTAC:= $(SPECTAC)
-
-USERTACCMO:=$(USERTAC:.ml4=.cmo)
-USERTACCMX:=$(USERTAC:.ml4=.cmx)
+ tactics/extratactics.cmo tactics/eauto.cmo tactics/class_tactics.cmo \
+ tactics/tauto.cmo tactics/eqdecide.cmo
OMEGACMO:=\
contrib/omega/omega.cmo contrib/omega/coq_omega.cmo \
@@ -228,6 +225,12 @@ ROMEGACMO:=\
contrib/romega/const_omega.cmo \
contrib/romega/refl_omega.cmo contrib/romega/g_romega.cmo
+MICROMEGACMO:=\
+ contrib/micromega/mutils.cmo contrib/micromega/vector.cmo \
+ contrib/micromega/micromega.cmo contrib/micromega/mfourier.cmo \
+ contrib/micromega/certificate.cmo \
+ contrib/micromega/coq_micromega.cmo contrib/micromega/g_micromega.cmo
+
RINGCMO:=\
contrib/ring/quote.cmo contrib/ring/g_quote.cmo \
contrib/ring/ring.cmo contrib/ring/g_ring.cmo
@@ -302,7 +305,8 @@ SUBTACCMO:=contrib/subtac/subtac_utils.cmo contrib/subtac/eterm.cmo \
RTAUTOCMO:=contrib/rtauto/proof_search.cmo contrib/rtauto/refl_tauto.cmo \
contrib/rtauto/g_rtauto.cmo
-CONTRIB:=$(OMEGACMO) $(ROMEGACMO) $(RINGCMO) $(NEWRINGCMO) $(DPCMO) $(FIELDCMO) \
+CONTRIB:=$(OMEGACMO) $(ROMEGACMO) $(MICROMEGACMO) \
+ $(RINGCMO) $(NEWRINGCMO) $(DPCMO) $(FIELDCMO) \
$(FOURIERCMO) $(EXTRACTIONCMO) $(JPROVERCMO) $(XMLCMO) \
$(CCCMO) $(FOCMO) $(SUBTACCMO) $(RTAUTOCMO) \
$(FUNINDCMO)
@@ -325,7 +329,7 @@ LINKCMX:=$(LINKCMOCMXA:.cmo=.cmx)
# objects known by the toplevel of Coq
OBJSCMO:=$(CONFIG) $(LIBREP) $(KERNEL) $(LIBRARY) $(PRETYPING) $(INTERP) \
$(PROOFS) $(PARSING) $(TACTICS) $(TOPLEVEL) $(HIGHPARSING) \
- $(HIGHTACTICS) $(USERTACMO) $(CONTRIB)
+ $(HIGHTACTICS) $(CONTRIB)
COQIDECMO:=ide/utils/okey.cmo ide/utils/config_file.cmo \
ide/utils/configwin_keys.cmo ide/utils/configwin_types.cmo \
@@ -375,6 +379,12 @@ PARSERCMX:= $(PARSERREQUIRESCMX) $(PARSERCODE:.cmo=.cmx)
INTERFACERC:= contrib/interface/vernacrc
+CSDPCERTCMO:= contrib/micromega/mutils.cmo contrib/micromega/micromega.cmo \
+ contrib/micromega/vector.cmo contrib/micromega/mfourier.cmo \
+ contrib/micromega/certificate.cmo \
+ contrib/micromega/sos.cmo contrib/micromega/csdpcert.cmo
+CSDPCERTCMX:= $(CSDPCERTCMO:.cmo=.cmx)
+
DEBUGPRINTERS:=dev/top_printers.cmo dev/vm_printers.cmo dev/printers.cma
COQDEPCMO:=config/coq_config.cmo tools/coqdep_lexer.cmo tools/coqdep.cmo
@@ -704,6 +714,15 @@ OMEGAVO:=$(addprefix contrib/omega/, \
ROMEGAVO:=$(addprefix contrib/romega/, \
ReflOmegaCore.vo ROmega.vo )
+MICROMEGAVO:=$(addprefix contrib/micromega/, \
+ CheckerMaker.vo Refl.vo \
+ Env.vo RingMicromega.vo \
+ EnvRing.vo VarMap.vo \
+ OrderedRing.vo ZCoeff.vo \
+ Micromegatac.vo ZMicromega.vo \
+ QMicromega.vo RMicromega.vo \
+ Tauto.vo )
+
RINGVO:=$(addprefix contrib/ring/, \
LegacyArithRing.vo Ring_normalize.vo \
LegacyRing_theory.vo LegacyRing.vo \
@@ -751,9 +770,9 @@ SUBTACVO:=$(addprefix theories/Program/, \
RTAUTOVO:=$(addprefix contrib/rtauto/, \
Bintree.vo Rtauto.vo )
-CONTRIBVO:= $(OMEGAVO) $(ROMEGAVO) $(RINGVO) $(FIELDVO) $(XMLVO) \
- $(FOURIERVO) $(JPROVERVO) $(CCVO) $(FUNINDVO) $(SUBTACVO) \
- $(RTAUTOVO) $(RECDEFVO) $(NEWRINGVO) $(DPVO)
+CONTRIBVO:= $(OMEGAVO) $(ROMEGAVO) $(MICROMEGAVO) $(RINGVO) $(FIELDVO) \
+ $(XMLVO) $(FOURIERVO) $(JPROVERVO) $(CCVO) $(FUNINDVO) \
+ $(SUBTACVO) $(RTAUTOVO) $(RECDEFVO) $(NEWRINGVO) $(DPVO)
ALLVO:= $(INITVO) $(THEORIESVO) $(CONTRIBVO)
@@ -808,12 +827,12 @@ STAGE1_TARGETS:= $(STAGE1) \
STAGE2_TARGETS:=$(COQBINARIES) lib kernel byterun library proofs tactics \
interp parsing pretyping highparsing toplevel hightactics \
coqide-binaries coqide-byte coqide-opt $(COQIDEOPT) $(COQIDEBYTE) $(COQIDE) \
- pcoq-binaries $(COQINTERFACE) coqbinaries pcoq $(TOOLS) tools \
+ pcoq-binaries $(COQINTERFACE) $(CSDPCERT) coqbinaries pcoq $(TOOLS) tools \
printers $(MINICOQ) debug
VO_TARGETS:=logic arith bool narith zarith qarith lists strings sets \
fsets allfsets relations wellfounded ints reals allreals \
setoids sorting natural integer rational numbers noreal \
- omega ring setoid_ring dp xml extraction field fourier jprover \
+ omega micromega ring setoid_ring dp xml extraction field fourier jprover \
funind cc programs subtac rtauto
DOC_TARGETS:=doc doc-html doc-ps doc-pdf stdlib refman tutorial faq rectutorial
STAGE3_TARGETS:=world install coqide coqide-files coq coqlib \
diff --git a/contrib/micromega/CheckerMaker.v b/contrib/micromega/CheckerMaker.v
index 8c491a55e..93b4d213f 100644
--- a/contrib/micromega/CheckerMaker.v
+++ b/contrib/micromega/CheckerMaker.v
@@ -1,10 +1,16 @@
-(********************************************************************)
-(* *)
-(* Micromega: A reflexive tactics using the Positivstellensatz *)
-(* *)
-(* Frédéric Besson (Irisa/Inria) 2006 *)
-(* *)
-(********************************************************************)
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
Require Import Setoid.
Require Import Decidable.
diff --git a/contrib/micromega/Env.v b/contrib/micromega/Env.v
new file mode 100644
index 000000000..40db9e464
--- /dev/null
+++ b/contrib/micromega/Env.v
@@ -0,0 +1,182 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import ZArith.
+Require Import Coq.Arith.Max.
+Require Import List.
+Set Implicit Arguments.
+
+(* I have addded a Leaf constructor to the varmap data structure (/contrib/ring/Quote.v)
+ -- this is harmless and spares a lot of Empty.
+ This means smaller proof-terms.
+ BTW, by dropping the polymorphism, I get small (yet noticeable) speed-up.
+*)
+
+Section S.
+
+ Variable D :Type.
+
+ Definition Env := positive -> D.
+
+ Definition jump (j:positive) (e:Env) := fun x => e (Pplus x j).
+
+ Definition nth (n:positive) (e : Env ) := e n.
+
+ Definition hd (x:D) (e: Env) := nth xH e.
+
+ Definition tail (e: Env) := jump xH e.
+
+ Lemma psucc : forall p, (match p with
+ | xI y' => xO (Psucc y')
+ | xO y' => xI y'
+ | 1%positive => 2%positive
+ end) = (p+1)%positive.
+ Proof.
+ destruct p.
+ auto with zarith.
+ rewrite xI_succ_xO.
+ auto with zarith.
+ reflexivity.
+ Qed.
+
+ Lemma jump_Pplus : forall i j l,
+ forall x, jump (i + j) l x = jump i (jump j l) x.
+ Proof.
+ unfold jump.
+ intros.
+ rewrite Pplus_assoc.
+ reflexivity.
+ Qed.
+
+ Lemma jump_simpl : forall p l,
+ forall x, jump p l x =
+ match p with
+ | xH => tail l x
+ | xO p => jump p (jump p l) x
+ | xI p => jump p (jump p (tail l)) x
+ end.
+ Proof.
+ destruct p ; unfold tail ; intros ; repeat rewrite <- jump_Pplus.
+ (* xI p = p + p + 1 *)
+ rewrite xI_succ_xO.
+ rewrite Pplus_diag.
+ rewrite <- Pplus_one_succ_r.
+ reflexivity.
+ (* xO p = p + p *)
+ rewrite Pplus_diag.
+ reflexivity.
+ reflexivity.
+ Qed.
+
+ Ltac jump_s :=
+ repeat
+ match goal with
+ | |- context [jump xH ?e] => rewrite (jump_simpl xH)
+ | |- context [jump (xO ?p) ?e] => rewrite (jump_simpl (xO p))
+ | |- context [jump (xI ?p) ?e] => rewrite (jump_simpl (xI p))
+ end.
+
+ Lemma jump_tl : forall j l, forall x, tail (jump j l) x = jump j (tail l) x.
+ Proof.
+ unfold tail.
+ intros.
+ repeat rewrite <- jump_Pplus.
+ rewrite Pplus_comm.
+ reflexivity.
+ Qed.
+
+ Lemma jump_Psucc : forall j l,
+ forall x, (jump (Psucc j) l x) = (jump 1 (jump j l) x).
+ Proof.
+ intros.
+ rewrite <- jump_Pplus.
+ rewrite Pplus_one_succ_r.
+ rewrite Pplus_comm.
+ reflexivity.
+ Qed.
+
+ Lemma jump_Pdouble_minus_one : forall i l,
+ forall x, (jump (Pdouble_minus_one i) (tail l)) x = (jump i (jump i l)) x.
+ Proof.
+ unfold tail.
+ intros.
+ repeat rewrite <- jump_Pplus.
+ rewrite <- Pplus_one_succ_r.
+ rewrite Psucc_o_double_minus_one_eq_xO.
+ rewrite Pplus_diag.
+ reflexivity.
+ Qed.
+
+ Lemma jump_x0_tail : forall p l, forall x, jump (xO p) (tail l) x = jump (xI p) l x.
+ Proof.
+ intros.
+ unfold jump.
+ unfold tail.
+ unfold jump.
+ rewrite <- Pplus_assoc.
+ simpl.
+ reflexivity.
+ Qed.
+
+ Lemma nth_spec : forall p l x,
+ nth p l =
+ match p with
+ | xH => hd x l
+ | xO p => nth p (jump p l)
+ | xI p => nth p (jump p (tail l))
+ end.
+ Proof.
+ unfold nth.
+ destruct p.
+ intros.
+ unfold jump, tail.
+ unfold jump.
+ rewrite Pplus_diag.
+ rewrite xI_succ_xO.
+ simpl.
+ reflexivity.
+ unfold jump.
+ rewrite Pplus_diag.
+ reflexivity.
+ unfold hd.
+ unfold nth.
+ reflexivity.
+ Qed.
+
+
+ Lemma nth_jump : forall p l x, nth p (tail l) = hd x (jump p l).
+ Proof.
+ unfold tail.
+ unfold hd.
+ unfold jump.
+ unfold nth.
+ intros.
+ rewrite Pplus_comm.
+ reflexivity.
+ Qed.
+
+ Lemma nth_Pdouble_minus_one :
+ forall p l, nth (Pdouble_minus_one p) (tail l) = nth p (jump p l).
+ Proof.
+ intros.
+ unfold tail.
+ unfold nth, jump.
+ rewrite Pplus_diag.
+ rewrite <- Psucc_o_double_minus_one_eq_xO.
+ rewrite Pplus_one_succ_r.
+ reflexivity.
+ Qed.
+
+End S.
+
diff --git a/contrib/micromega/NRing.v b/contrib/micromega/EnvRing.v
index b4c9cffe6..04e68272e 100644
--- a/contrib/micromega/NRing.v
+++ b/contrib/micromega/EnvRing.v
@@ -13,7 +13,7 @@
Set Implicit Arguments.
Require Import Setoid.
Require Import BinList.
-Require Import VarMap.
+Require Import Env.
Require Import BinPos.
Require Import BinNat.
Require Import BinInt.
@@ -393,7 +393,7 @@ Section MakeRingPol.
| zmon: positive -> Mon -> Mon
| vmon: positive -> Mon -> Mon.
- Fixpoint Mphi(l:off_map R) (M: Mon) {struct M} : R :=
+ Fixpoint Mphi(l:Env R) (M: Mon) {struct M} : R :=
match M with
mon0 => rI
| zmon j M1 => Mphi (jump j l) M1
@@ -490,7 +490,7 @@ Section MakeRingPol.
(** Evaluation of a polynomial towards R *)
- Fixpoint Pphi(l:off_map R) (P:Pol) {struct P} : R :=
+ Fixpoint Pphi(l:Env R) (P:Pol) {struct P} : R :=
match P with
| Pc c => [c]
| Pinj j Q => Pphi (jump j l) Q
@@ -554,6 +554,54 @@ Section MakeRingPol.
intros;simpl;apply (morph0 CRmorph).
Qed.
+Lemma env_morph : forall p e1 e2, (forall x, e1 x = e2 x) ->
+ p @ e1 = p @ e2.
+Proof.
+ induction p ; simpl.
+ reflexivity.
+ intros.
+ apply IHp.
+ intros.
+ unfold jump.
+ apply H.
+ intros.
+ rewrite (IHp1 e1 e2) ; auto.
+ rewrite (IHp2 (tail e1) (tail e2)) ; auto.
+ unfold hd. unfold nth. rewrite H. reflexivity.
+ unfold tail. unfold jump. intros ; apply H.
+Qed.
+
+Lemma Pjump_Pplus : forall P i j l, P @ (jump (i + j) l ) = P @ (jump j (jump i l)).
+Proof.
+ intros. apply env_morph. intros. rewrite <- jump_Pplus.
+ rewrite Pplus_comm.
+ reflexivity.
+Qed.
+
+Lemma Pjump_xO_tail : forall P p l,
+ P @ (jump (xO p) (tail l)) = P @ (jump (xI p) l).
+Proof.
+ intros.
+ apply env_morph.
+ intros.
+ rewrite (@jump_simpl R (xI p)).
+ rewrite (@jump_simpl R (xO p)).
+ reflexivity.
+Qed.
+
+Lemma Pjump_Pdouble_minus_one : forall P p l,
+ P @ (jump (Pdouble_minus_one p) (tail l)) = P @ (jump (xO p) l).
+Proof.
+ intros.
+ apply env_morph.
+ intros.
+ rewrite jump_Pdouble_minus_one.
+ rewrite (@jump_simpl R (xO p)).
+ reflexivity.
+Qed.
+
+
+
Lemma Pphi1 : forall l, P1@l == 1.
Proof.
intros;simpl;apply (morph1 CRmorph).
@@ -562,7 +610,8 @@ Section MakeRingPol.
Lemma mkPinj_ok : forall j l P, (mkPinj j P)@l == P@(jump j l).
Proof.
intros j l p;destruct p;simpl;rsimpl.
- rewrite <-jump_Pplus;rewrite Pplus_comm;rrefl.
+ rewrite Pjump_Pplus.
+ reflexivity.
Qed.
Let pow_pos_Pplus :=
@@ -581,13 +630,6 @@ Section MakeRingPol.
rewrite Pphi0. rewrite pow_pos_Pplus;rsimpl.
Qed.
- Ltac jump_simpl :=
- repeat (progress (
- match goal with
- | |- context [jump xH ?e] => rewrite (@jump_simpl R xH)
- | |- context [jump (xO ?p) ?e] => rewrite (@jump_simpl R (xO p))
- | |- context [jump (xI ?p) ?e] => rewrite (@jump_simpl R (xI p))
- end)).
Ltac Esimpl :=
repeat (progress (
@@ -666,15 +708,14 @@ Section MakeRingPol.
assert (H := ZPminus_spec p p0);destruct (ZPminus p p0).
rewrite H;Esimpl. rewrite IHP';rrefl.
rewrite H;Esimpl. rewrite IHP';Esimpl.
- rewrite <- jump_Pplus;rewrite Pplus_comm;rrefl.
+ rewrite Pjump_Pplus. rrefl.
rewrite H;Esimpl. rewrite IHP.
- rewrite <- jump_Pplus;rewrite Pplus_comm;rrefl.
+ rewrite Pjump_Pplus. rrefl.
destruct p0;simpl.
- rewrite IHP2;simpl; jump_simpl ;rsimpl.
- Esimpl.
+ rewrite IHP2;simpl. rsimpl.
+ rewrite Pjump_xO_tail. Esimpl.
rewrite IHP2;simpl.
- rewrite jump_Pdouble_minus_one.
- jump_simpl.
+ rewrite Pjump_Pdouble_minus_one.
rsimpl.
rewrite IHP'.
rsimpl.
@@ -682,10 +723,10 @@ Section MakeRingPol.
Esimpl2;add_push [c];rrefl.
destruct p0;simpl;Esimpl2.
rewrite IHP'2;simpl.
- jump_simpl.
+ rewrite Pjump_xO_tail.
rsimpl;add_push (P'1@l * (pow_pos rmul (hd 0 l) p));rrefl.
rewrite IHP'2;simpl.
- rewrite jump_Pdouble_minus_one;jump_simpl ; rsimpl.
+ rewrite Pjump_Pdouble_minus_one. rsimpl.
add_push (P'1@l * (pow_pos rmul (hd 0 l) p));rrefl.
rewrite IHP'2;rsimpl.
unfold tail.
@@ -700,9 +741,11 @@ Section MakeRingPol.
assert (forall P k l,
(PaddX Padd P'1 k P) @ l == P@l + P'1@l * pow_pos rmul (hd 0 l) k).
induction P;simpl;intros;try apply (ARadd_comm ARth).
- destruct p2; simpl; jump_simpl;try apply (ARadd_comm ARth).
- rewrite jump_Pdouble_minus_one.
- apply (ARadd_comm ARth).
+ destruct p2; simpl; try apply (ARadd_comm ARth).
+ rewrite Pjump_xO_tail.
+ apply (ARadd_comm ARth).
+ rewrite Pjump_Pdouble_minus_one.
+ apply (ARadd_comm ARth).
assert (H1 := ZPminus_spec p2 k);destruct (ZPminus p2 k);Esimpl2.
rewrite IHP'1;rsimpl; rewrite H1;add_push (P5 @ (tail l0));rrefl.
rewrite IHP'1;simpl;Esimpl.
@@ -728,25 +771,22 @@ Section MakeRingPol.
assert (H := ZPminus_spec p p0);destruct (ZPminus p p0).
rewrite H;Esimpl. rewrite IHP';rsimpl.
rewrite H;Esimpl. rewrite IHP';Esimpl.
- rewrite <- jump_Pplus;rewrite Pplus_comm;rrefl.
+ rewrite <- Pjump_Pplus;rewrite Pplus_comm;rrefl.
rewrite H;Esimpl. rewrite IHP.
- rewrite <- jump_Pplus;rewrite Pplus_comm;rrefl.
+ rewrite <- Pjump_Pplus;rewrite Pplus_comm;rrefl.
destruct p0;simpl.
- rewrite IHP2;simpl; jump_simpl ; rsimpl.
+ rewrite IHP2;simpl; try rewrite Pjump_xO_tail ; rsimpl.
rewrite IHP2;simpl.
- rewrite jump_Pdouble_minus_one;rsimpl.
+ rewrite Pjump_Pdouble_minus_one;rsimpl.
unfold tail ; rsimpl.
- jump_simpl.
- rsimpl.
rewrite IHP';rsimpl.
destruct P;simpl.
repeat rewrite Popp_ok;Esimpl2;rsimpl;add_push [c];try rrefl.
destruct p0;simpl;Esimpl2.
rewrite IHP'2;simpl;rsimpl;add_push (P'1@l * (pow_pos rmul (hd 0 l) p));trivial.
- jump_simpl.
- add_push (P @ ((jump p0 (jump p0 (tail l)))));rrefl.
- rewrite IHP'2;simpl;rewrite jump_Pdouble_minus_one;rsimpl.
- jump_simpl.
+ rewrite Pjump_xO_tail.
+ add_push (P @ ((jump (xI p0) l)));rrefl.
+ rewrite IHP'2;simpl;rewrite Pjump_Pdouble_minus_one;rsimpl.
add_push (- (P'1 @ l * pow_pos rmul (hd 0 l) p));rrefl.
unfold tail.
rewrite IHP'2;rsimpl;add_push (P @ (jump 1 l));rrefl.
@@ -761,9 +801,10 @@ Section MakeRingPol.
(PsubX Psub P'1 k P) @ l == P@l + - P'1@l * pow_pos rmul (hd 0 l) k).
induction P;simpl;intros.
rewrite Popp_ok;rsimpl;apply (ARadd_comm ARth);trivial.
- destruct p2;simpl; jump_simpl ; rewrite Popp_ok;rsimpl.
+ destruct p2;simpl; rewrite Popp_ok;rsimpl.
+ rewrite Pjump_xO_tail.
apply (ARadd_comm ARth);trivial.
- rewrite jump_Pdouble_minus_one.
+ rewrite Pjump_Pdouble_minus_one.
apply (ARadd_comm ARth);trivial.
apply (ARadd_comm ARth);trivial.
assert (H1 := ZPminus_spec p2 k);destruct (ZPminus p2 k);Esimpl2;rsimpl.
@@ -783,8 +824,8 @@ Section MakeRingPol.
Lemma PmulI_ok :
forall P',
- (forall (P : Pol) (l : off_map R), (Pmul P P') @ l == P @ l * P' @ l) ->
- forall (P : Pol) (p : positive) (l : off_map R),
+ (forall (P : Pol) (l : Env R), (Pmul P P') @ l == P @ l * P' @ l) ->
+ forall (P : Pol) (p : positive) (l : Env R),
(PmulI Pmul P' p P) @ l == P @ l * P' @ (jump p l).
Proof.
induction P;simpl;intros.
@@ -792,16 +833,15 @@ Section MakeRingPol.
assert (H1 := ZPminus_spec p p0);destruct (ZPminus p p0);Esimpl2.
rewrite H1; rewrite H;rrefl.
rewrite H1; rewrite H.
- rewrite Pplus_comm.
- rewrite jump_Pplus;simpl;rrefl.
- rewrite H1;rewrite Pplus_comm.
- rewrite jump_Pplus;rewrite IHP;rrefl.
+ rewrite Pjump_Pplus;simpl;rrefl.
+ rewrite H1.
+ rewrite Pjump_Pplus;rewrite IHP;rrefl.
destruct p0;Esimpl2.
- rewrite IHP1;rewrite IHP2;jump_simpl;rsimpl.
+ rewrite IHP1;rewrite IHP2;rsimpl.
+ rewrite Pjump_xO_tail.
mul_push (pow_pos rmul (hd 0 l) p);rrefl.
rewrite IHP1;rewrite IHP2;simpl;rsimpl.
- mul_push (pow_pos rmul (hd 0 l) p); rewrite jump_Pdouble_minus_one.
- jump_simpl.
+ mul_push (pow_pos rmul (hd 0 l) p); rewrite Pjump_Pdouble_minus_one.
rrefl.
rewrite IHP1;simpl;rsimpl.
mul_push (pow_pos rmul (hd 0 l) p).
@@ -857,9 +897,9 @@ Section MakeRingPol.
| xO j => Pinj (Pdouble_minus_one j) P ** P'2
| 1 => P ** P'2
end @ (tail l) == P @ (jump p0 l) * P'2 @ (tail l)).
- destruct p0;jump_simpl;rewrite IHP'2;Esimpl.
- jump_simpl ; reflexivity.
- rewrite jump_Pdouble_minus_one;Esimpl.
+ destruct p0;rewrite IHP'2;Esimpl.
+ rewrite Pjump_xO_tail. reflexivity.
+ rewrite Pjump_Pdouble_minus_one;Esimpl.
rewrite H;Esimpl.
rewrite Padd_ok; Esimpl2. rewrite Padd_ok; Esimpl2.
repeat (rewrite IHP'1 || rewrite IHP'2);simpl.
@@ -891,6 +931,57 @@ Lemma Pmul_ok : forall P P' l, (P**P')@l == P@l * P'@l.
rrefl.
Qed.
+ Lemma Mphi_morph : forall P env env', (forall x, env x = env' x ) ->
+ Mphi env P = Mphi env' P.
+ Proof.
+ induction P ; simpl.
+ reflexivity.
+ intros.
+ apply IHP.
+ intros.
+ unfold jump.
+ apply H.
+ (**)
+ intros.
+ replace (Mphi (tail env) P) with (Mphi (tail env') P).
+ unfold hd. unfold nth.
+ rewrite H.
+ reflexivity.
+ apply IHP.
+ unfold tail,jump.
+ intros. symmetry. apply H.
+ Qed.
+
+Lemma Mjump_xO_tail : forall M p l,
+ Mphi (jump (xO p) (tail l)) M = Mphi (jump (xI p) l) M.
+Proof.
+ intros.
+ apply Mphi_morph.
+ intros.
+ rewrite (@jump_simpl R (xI p)).
+ rewrite (@jump_simpl R (xO p)).
+ reflexivity.
+Qed.
+
+Lemma Mjump_Pdouble_minus_one : forall M p l,
+ Mphi (jump (Pdouble_minus_one p) (tail l)) M = Mphi (jump (xO p) l) M.
+Proof.
+ intros.
+ apply Mphi_morph.
+ intros.
+ rewrite jump_Pdouble_minus_one.
+ rewrite (@jump_simpl R (xO p)).
+ reflexivity.
+Qed.
+
+Lemma Mjump_Pplus : forall M i j l, Mphi (jump (i + j) l ) M = Mphi (jump j (jump i l)) M.
+Proof.
+ intros. apply Mphi_morph. intros. rewrite <- jump_Pplus.
+ rewrite Pplus_comm.
+ reflexivity.
+Qed.
+
+
Lemma mkZmon_ok: forall M j l,
Mphi l (mkZmon j M) == Mphi l (zmon j M).
@@ -900,14 +991,13 @@ Lemma Pmul_ok : forall P P' l, (P**P')@l == P@l * P'@l.
Lemma zmon_pred_ok : forall M j l,
Mphi (tail l) (zmon_pred j M) == Mphi l (zmon j M).
Proof.
- destruct j; simpl;intros auto; rsimpl.
+ destruct j; simpl;intros l; rsimpl.
rewrite mkZmon_ok;rsimpl.
simpl.
- jump_simpl.
+ rewrite Mjump_xO_tail.
reflexivity.
rewrite mkZmon_ok;simpl.
- rewrite jump_Pdouble_minus_one; rsimpl.
- jump_simpl ; reflexivity.
+ rewrite Mjump_Pdouble_minus_one; rsimpl.
Qed.
Lemma mkVmon_ok : forall M i l, Mphi l (mkVmon i M) == Mphi l M*pow_pos rmul (hd 0 l) i.
@@ -937,7 +1027,7 @@ Lemma Pmul_ok : forall P P' l, (P**P')@l == P@l * P'@l.
case (MFactor P (zmon (j -i) M)); simpl.
intros P2 Q2 H; repeat rewrite mkPinj_ok; auto.
rewrite <- (Pplus_minus _ _ (ZC2 _ _ He)).
- rewrite Pplus_comm; rewrite jump_Pplus; auto.
+ rewrite Mjump_Pplus; auto.
rewrite (morph0 CRmorph); rsimpl.
intros P2 m; rewrite (morph0 CRmorph); rsimpl.
@@ -1027,12 +1117,12 @@ Lemma Pmul_ok : forall P P' l, (P**P')@l == P@l * P'@l.
rewrite Padd_ok; rewrite PmulC_ok; rsimpl.
intros i P5 H; rewrite H.
intros HH H1; injection HH; intros; subst; rsimpl.
- rewrite Padd_ok; rewrite PmulI_ok by (intros; apply Pmul_ok). rewrite H1; rsimpl.
+ rewrite Padd_ok; rewrite PmulI_ok by (intros;apply Pmul_ok). rewrite H1; rsimpl.
intros i P5 P6 H1 H2 H3; rewrite H1; rewrite H3.
assert (P4 = Q1 ++ P3 ** PX i P5 P6).
injection H2; intros; subst;trivial.
rewrite H;rewrite Padd_ok;rewrite Pmul_ok;rsimpl.
- Qed.
+Qed.
(*
Lemma POneSubst_ok: forall P1 M1 P2 P3 l,
POneSubst P1 M1 P2 = Some P3 -> Mphi l M1 == P2@l -> P1@l == P3@l.
@@ -1082,7 +1172,7 @@ Proof.
rewrite <- PNSubst1_ok; auto.
Qed.
- Fixpoint MPcond (LM1: list (Mon * Pol)) (l: off_map R) {struct LM1} : Prop :=
+ Fixpoint MPcond (LM1: list (Mon * Pol)) (l: Env R) {struct LM1} : Prop :=
match LM1 with
cons (M1,P2) LM2 => (Mphi l M1 == P2@l) /\ (MPcond LM2 l)
| _ => True
@@ -1138,10 +1228,10 @@ Proof.
(** evaluation of polynomial expressions towards R *)
- Fixpoint PEeval (l:off_map R) (pe:PExpr) {struct pe} : R :=
+ Fixpoint PEeval (l:Env R) (pe:PExpr) {struct pe} : R :=
match pe with
| PEc c => phi c
- | PEX j => nth 0 j l
+ | PEX j => nth j l
| PEadd pe1 pe2 => (PEeval l pe1) + (PEeval l pe2)
| PEsub pe1 pe2 => (PEeval l pe1) - (PEeval l pe2)
| PEmul pe1 pe2 => (PEeval l pe1) * (PEeval l pe2)
@@ -1151,17 +1241,14 @@ Proof.
(** Correctness proofs *)
- Lemma mkX_ok : forall p l, nth 0 p l == (mk_X p) @ l.
+ Lemma mkX_ok : forall p l, nth p l == (mk_X p) @ l.
Proof.
destruct p;simpl;intros;Esimpl;trivial.
- rewrite nth_spec.
- jump_simpl.
- rewrite <- jump_tl.
- rewrite nth_jump.
+ rewrite nth_spec ; auto.
+ unfold hd.
+ rewrite <- nth_Pdouble_minus_one.
+ rewrite (nth_jump (Pdouble_minus_one p) l 1).
reflexivity.
- rewrite nth_spec.
- rewrite <- nth_jump.
- rewrite nth_Pdouble_minus_one;rrefl.
Qed.
Ltac Esimpl3 :=
@@ -1226,7 +1313,7 @@ Section POWER.
Lemma Ppow_N_ok : forall l, (forall P, subst_l P@l == P@l) ->
forall P n, (Ppow_N P n)@l == (pow_N P1 Pmul P n)@l.
- Proof. destruct n;simpl. rrefl. rewrite Ppow_pos_ok by trivial. Esimpl. Qed.
+ Proof. destruct n;simpl. rrefl. rewrite Ppow_pos_ok. trivial. Esimpl. auto. Qed.
End POWER.
@@ -1298,16 +1385,17 @@ Section POWER.
intros.
induction pe;simpl;Esimpl3.
apply mkX_ok.
- rewrite IHpe1;rewrite IHpe2;destruct pe1;destruct pe2;Esimpl3.
+ rewrite IHpe1;rewrite IHpe2;destruct pe1;destruct pe2;Esimpl3.
rewrite IHpe1;rewrite IHpe2;rrefl.
rewrite IHpe1;rewrite IHpe2. rewrite Pmul_ok. rrefl.
rewrite IHpe;rrefl.
- rewrite Ppow_N_ok by (intros; rrefl).
+ rewrite Ppow_N_ok by reflexivity.
rewrite pow_th.(rpow_pow_N). destruct n0;Esimpl3.
- induction p;simpl;try rewrite IHp;try rewrite IHpe;repeat rewrite Pms_ok;
+ induction p;simpl;try rewrite IHp;try rewrite IHpe;repeat rewrite Pms_ok;
repeat rewrite Pmul_ok;rrefl.
Qed.
+
End NORM_SUBST_REC.
diff --git a/contrib/micromega/Examples.v b/contrib/micromega/Examples.v
deleted file mode 100644
index 6bb9311a5..000000000
--- a/contrib/micromega/Examples.v
+++ /dev/null
@@ -1,117 +0,0 @@
-Require Import OrderedRing.
-Require Import RingMicromega.
-Require Import ZCoeff.
-Require Import Refl.
-Require Import ZArith.
-Require Import List.
-(*****)
-Require Import NRing.
-Require Import VarMap.
-(*****)
-(*Require Import Ring_polynom.*)
-(*****)
-
-Import OrderedRingSyntax.
-
-Section Examples.
-
-Variable R : Type.
-Variables rO rI : R.
-Variables rplus rtimes rminus: R -> R -> R.
-Variable ropp : R -> R.
-Variables req rle rlt : R -> R -> Prop.
-
-Variable sor : SOR rO rI rplus rtimes rminus ropp req rle rlt.
-
-Notation "0" := rO.
-Notation "1" := rI.
-Notation "x + y" := (rplus x y).
-Notation "x * y " := (rtimes x y).
-Notation "x - y " := (rminus x y).
-Notation "- x" := (ropp x).
-Notation "x == y" := (req x y).
-Notation "x ~= y" := (~ req x y).
-Notation "x <= y" := (rle x y).
-Notation "x < y" := (rlt x y).
-
-Definition phi : Z -> R := gen_order_phi_Z 0 1 rplus rtimes ropp.
-
-Lemma ZSORaddon :
- SORaddon 0 1 rplus rtimes rminus ropp req rle (* ring elements *)
- 0%Z 1%Z Zplus Zmult Zminus Zopp (* coefficients *)
- Zeq_bool Zle_bool
- phi (fun x => x) (pow_N 1 rtimes).
-Proof.
-constructor.
-exact (Zring_morph sor).
-exact (pow_N_th 1 rtimes sor.(SORsetoid)).
-apply (Zcneqb_morph sor).
-apply (Zcleb_morph sor).
-Qed.
-
-Definition Zeval_formula :=
- eval_formula 0 rplus rtimes rminus ropp req rle rlt phi (fun x => x) (pow_N 1 rtimes).
-Definition Z_In := S_In 0%Z Zeq_bool Zle_bool.
-Definition Z_Square := S_Square 0%Z Zeq_bool Zle_bool.
-
-(* Example: forall x y : Z, x + y = 0 -> x - y = 0 -> x < 0 -> False *)
-
-Lemma plus_minus : forall x y : R, x + y == 0 -> x - y == 0 -> x < 0 -> False.
-Proof.
-intros x y.
-Open Scope Z_scope.
-(*****)
-set (env := fun x y : R => Node (Leaf y) x (Empty _)).
-(*****)
-(*set (env := fun (x y : R) => x :: y :: nil).*)
-(*****)
-set (expr :=
- Build_Formula (PEadd (PEX Z 1) (PEX Z 2)) OpEq (PEc 0)
- :: Build_Formula (PEsub (PEX Z 1) (PEX Z 2)) OpEq (PEc 0)
- :: Build_Formula (PEX Z 1) OpLt (PEc 0) :: nil).
-set (cert :=
- S_Add (S_Mult (S_Pos 0 Zeq_bool Zle_bool 2 (refl_equal true)) (Z_In 2))
- (S_Add (S_Ideal (PEc 1) (Z_In 1)) (S_Ideal (PEc 1) (Z_In 0)))).
-change (make_impl (Zeval_formula (env x y)) expr False).
-apply (check_formulas_sound sor ZSORaddon expr cert).
-reflexivity.
-Close Scope Z_scope.
-Qed.
-
-(* Example *)
-
-Let four : R := ((1 + 1) * (1 + 1)).
-Lemma Zdiscr :
- forall a b c x : R,
- a * (x * x) + b * x + c == 0 -> 0 <= b * b - four * a * c.
-Proof.
-Open Scope Z_scope.
-(*****)
-set (env := fun (a b c x : R) => Node (Node (Leaf x) b (Empty _)) a (Leaf c)).
-(*****)
-(*set (env := fun (a b c x : R) => a :: b :: c :: x:: nil).*)
-(*****)
-set (poly1 :=
- (Build_Formula
- (PEadd
- (PEadd (PEmul (PEX Z 1) (PEmul (PEX Z 4) (PEX Z 4)))
- (PEmul (PEX Z 2) (PEX Z 4))) (PEX Z 3)) OpEq (PEc 0)) :: nil).
-set (poly2 :=
- (Build_Formula
- (PEsub (PEmul (PEX Z 2) (PEX Z 2))
- (PEmul (PEmul (PEc 4) (PEX Z 1)) (PEX Z 3))) OpGe (PEc 0)) :: nil).
-set (wit :=
- (S_Add (Z_In 0)
- (S_Add (S_Ideal (PEmul (PEc (-4)) (PEX Z 1)) (Z_In 1))
- (Z_Square
- (PEadd (PEmul (PEc 2) (PEmul (PEX Z 1) (PEX Z 4))) (PEX Z 2))))) :: nil).
-intros a b c x.
-change (make_impl (Zeval_formula (env a b c x)) poly1
- (make_conj (Zeval_formula (env a b c x)) poly2)).
-apply (check_conj_formulas_sound sor ZSORaddon poly1 poly2 wit).
-reflexivity.
-Close Scope Z_scope.
-Qed.
-
-End Examples.
-
diff --git a/contrib/micromega/LICENSE.sos b/contrib/micromega/LICENSE.sos
new file mode 100644
index 000000000..5aadfa2a6
--- /dev/null
+++ b/contrib/micromega/LICENSE.sos
@@ -0,0 +1,29 @@
+ HOL Light copyright notice, licence and disclaimer
+
+ (c) University of Cambridge 1998
+ (c) Copyright, John Harrison 1998-2006
+
+HOL Light version 2.20, hereinafter referred to as "the software", is a
+computer theorem proving system written by John Harrison. Much of the
+software was developed at the University of Cambridge Computer Laboratory,
+New Museums Site, Pembroke Street, Cambridge, CB2 3QG, England. The
+software is copyright, University of Cambridge 1998 and John Harrison
+1998-2006.
+
+Permission to use, copy, modify, and distribute the software and its
+documentation for any purpose and without fee is hereby granted. In the
+case of further distribution of the software the present text, including
+copyright notice, licence and disclaimer of warranty, must be included in
+full and unmodified form in any release. Distribution of derivative
+software obtained by modifying the software, or incorporating it into
+other software, is permitted, provided the inclusion of the software is
+acknowledged and that any changes made to the software are clearly
+documented.
+
+John Harrison and the University of Cambridge disclaim all warranties
+with regard to the software, including all implied warranties of
+merchantability and fitness. In no event shall John Harrison or the
+University of Cambridge be liable for any special, indirect,
+incidental or consequential damages or any damages whatsoever,
+including, but not limited to, those arising from computer failure or
+malfunction, work stoppage, loss of profit or loss of contracts.
diff --git a/contrib/micromega/MExtraction.v b/contrib/micromega/MExtraction.v
new file mode 100644
index 000000000..a5ac92db8
--- /dev/null
+++ b/contrib/micromega/MExtraction.v
@@ -0,0 +1,23 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+(* Used to generate micromega.ml *)
+
+Require Import ZMicromega.
+Require Import QMicromega.
+Require Import VarMap.
+Require Import RingMicromega.
+Require Import NArith.
+
+Extraction "micromega.ml" List.map simpl_cone map_cone indexes n_of_Z Nnat.N_of_nat ZTautoChecker QTautoChecker find.
diff --git a/contrib/micromega/Micromegatac.v b/contrib/micromega/Micromegatac.v
new file mode 100644
index 000000000..5459634c9
--- /dev/null
+++ b/contrib/micromega/Micromegatac.v
@@ -0,0 +1,79 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import ZMicromega.
+Require Import QMicromega.
+Require Import RMicromega.
+Require Import QArith.
+Require Export Ring_normalize.
+Require Import ZArith.
+Require Import Reals.
+Require Export RingMicromega.
+Require Import VarMap.
+Require Tauto.
+
+Ltac micromegac dom d :=
+ let tac := lazymatch dom with
+ | Z =>
+ micromegap d ;
+ intros __wit __varmap __ff ;
+ change (Tauto.eval_f (Zeval_formula (@find Z Z0 __varmap)) __ff) ;
+ apply (ZTautoChecker_sound __ff __wit); vm_compute ; reflexivity
+ | R =>
+ rmicromegap d ;
+ intros __wit __varmap __ff ;
+ change (Tauto.eval_f (Reval_formula (@find R 0%R __varmap)) __ff) ;
+ apply (RTautoChecker_sound __ff __wit); vm_compute ; reflexivity
+ | _ => fail "Unsupported domain"
+ end in tac.
+
+Tactic Notation "micromega" constr(dom) int_or_var(n) := micromegac dom n.
+Tactic Notation "micromega" constr(dom) := micromegac dom ltac:-1.
+
+Ltac zfarkas := omicronp ;
+ intros __wit __varmap __ff ;
+ change (Tauto.eval_f (Zeval_formula (@find Z Z0 __varmap)) __ff) ;
+ apply (ZTautoChecker_sound __ff __wit); vm_compute ; reflexivity.
+
+Ltac omicron dom :=
+ let tac := lazymatch dom with
+ | Z =>
+ zomicronp ;
+ intros __wit __varmap __ff ;
+ change (Tauto.eval_f (Zeval_formula (@find Z Z0 __varmap)) __ff) ;
+ apply (ZTautoChecker_sound __ff __wit); vm_compute ; reflexivity
+ | Q =>
+ qomicronp ;
+ intros __wit __varmap __ff ;
+ change (Tauto.eval_f (Qeval_formula (@find Q 0%Q __varmap)) __ff) ;
+ apply (QTautoChecker_sound __ff __wit); vm_compute ; reflexivity
+ | R =>
+ romicronp ;
+ intros __wit __varmap __ff ;
+ change (Tauto.eval_f (Reval_formula (@find R 0%R __varmap)) __ff) ;
+ apply (RTautoChecker_sound __ff __wit); vm_compute ; reflexivity
+ | _ => fail "Unsupported domain"
+ end in tac.
+
+Ltac sos dom :=
+ let tac := lazymatch dom with
+ | Z =>
+ sosp ;
+ intros __wit __varmap __ff ;
+ change (Tauto.eval_f (Zeval_formula (@find Z Z0 __varmap)) __ff) ;
+ apply (ZTautoChecker_sound __ff __wit); vm_compute ; reflexivity
+ | _ => fail "Unsupported domain"
+ end in tac.
+
+
diff --git a/contrib/micromega/OrderedRing.v b/contrib/micromega/OrderedRing.v
index c6dd5ccf0..149b77316 100644
--- a/contrib/micromega/OrderedRing.v
+++ b/contrib/micromega/OrderedRing.v
@@ -1,6 +1,18 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* Evgeny Makarov, INRIA, 2007 *)
+(************************************************************************)
+
Require Import Setoid.
Require Import Ring.
+(** Generic properties of ordered rings on a setoid equality *)
+
Set Implicit Arguments.
Module Import OrderedRingSyntax.
@@ -29,7 +41,7 @@ Notation "x ~= y" := (~ req x y).
Notation "x <= y" := (rle x y).
Notation "x < y" := (rlt x y).
-Record SOR : Prop := mk_SOR_theory {
+Record SOR : Type := mk_SOR_theory {
SORsetoid : Setoid_Theory R req;
SORplus_wd : forall x1 x2, x1 == x2 -> forall y1 y2, y1 == y2 -> x1 + y1 == x2 + y2;
SORtimes_wd : forall x1 x2, x1 == x2 -> forall y1 y2, y1 == y2 -> x1 * y1 == x2 * y2;
@@ -71,12 +83,14 @@ Notation "x ~= y" := (~ req x y).
Notation "x <= y" := (rle x y).
Notation "x < y" := (rlt x y).
+
Add Relation R req
- reflexivity proved by sor.(SORsetoid).(@Equivalence_Reflexive _ _)
- symmetry proved by sor.(SORsetoid).(@Equivalence_Symmetric _ _)
- transitivity proved by sor.(SORsetoid).(@Equivalence_Transitive _ _)
+ reflexivity proved by sor.(SORsetoid).(@Equivalence_Reflexive _ _ )
+ symmetry proved by sor.(SORsetoid).(@Equivalence_Symmetric _ _ )
+ transitivity proved by sor.(SORsetoid).(@Equivalence_Transitive _ _ )
as sor_setoid.
+
Add Morphism rplus with signature req ==> req ==> req as rplus_morph.
Proof.
exact sor.(SORplus_wd).
@@ -148,7 +162,8 @@ Qed.
Theorem Rminus_eq_0 : forall n m : R, n - m == 0 <-> n == m.
Proof.
intros n m.
-split; intro H. setoid_replace n with ((n - m) + m) by ring. rewrite H. now rewrite Rplus_0_l.
+split; intro H. setoid_replace n with ((n - m) + m) by ring. rewrite H.
+now rewrite Rplus_0_l.
rewrite H; ring.
Qed.
diff --git a/contrib/micromega/QMicromega.v b/contrib/micromega/QMicromega.v
new file mode 100644
index 000000000..9e95f6c49
--- /dev/null
+++ b/contrib/micromega/QMicromega.v
@@ -0,0 +1,259 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import OrderedRing.
+Require Import RingMicromega.
+Require Import Refl.
+Require Import QArith.
+Require Import Qring.
+
+(* Qsrt has been removed from the library ? *)
+Definition Qsrt : ring_theory 0 1 Qplus Qmult Qminus Qopp Qeq.
+Proof.
+ constructor.
+ exact Qplus_0_l.
+ exact Qplus_comm.
+ exact Qplus_assoc.
+ exact Qmult_1_l.
+ exact Qmult_comm.
+ exact Qmult_assoc.
+ exact Qmult_plus_distr_l.
+ reflexivity.
+ exact Qplus_opp_r.
+Qed.
+
+
+Add Ring Qring : Qsrt.
+
+Lemma Qmult_neutral : forall x , 0 * x == 0.
+Proof.
+ intros.
+ compute.
+ reflexivity.
+Qed.
+
+(* Is there any qarith database ? *)
+
+Lemma Qsor : SOR 0 1 Qplus Qmult Qminus Qopp Qeq Qle Qlt.
+Proof.
+ constructor; intros ; subst ; try (intuition (subst; auto with qarith)).
+ apply Q_Setoid.
+ rewrite H ; rewrite H0 ; reflexivity.
+ rewrite H ; rewrite H0 ; reflexivity.
+ rewrite H ; auto ; reflexivity.
+ rewrite <- H ; rewrite <- H0 ; auto.
+ rewrite H ; rewrite H0 ; auto.
+ rewrite <- H ; rewrite <- H0 ; auto.
+ rewrite H ; rewrite H0 ; auto.
+ apply Qsrt.
+ apply Qle_refl.
+ apply Qle_antisym ; auto.
+ eapply Qle_trans ; eauto.
+ apply Qlt_le_weak ; auto.
+ apply (Qlt_not_eq n m H H0) ; auto.
+ destruct (Qle_lt_or_eq _ _ H0) ; auto.
+ tauto.
+ destruct(Q_dec n m) as [[H1 |H1] | H1 ] ; tauto.
+ apply (Qplus_le_compat p p n m (Qle_refl p) H).
+ generalize (Qmult_lt_compat_r 0 n m H0 H).
+ rewrite Qmult_neutral.
+ auto.
+ compute in H.
+ discriminate.
+Qed.
+
+Definition Qeq_bool (p q : Q) : bool := Zeq_bool (Qnum p * ' Qden q)%Z (Qnum q * ' Qden p)%Z.
+
+Definition Qle_bool (x y : Q) : bool := Zle_bool (Qnum x * ' Qden y)%Z (Qnum y * ' Qden x)%Z.
+
+Require ZMicromega.
+
+Lemma Qeq_bool_ok : forall x y, Qeq_bool x y = true -> x == y.
+Proof.
+ intros.
+ unfold Qeq_bool in H.
+ unfold Qeq.
+ apply (Zeqb_ok _ _ H).
+Qed.
+
+
+Lemma Qeq_bool_neq : forall x y, Qeq_bool x y = false -> ~ x == y.
+Proof.
+ unfold Qeq_bool,Qeq.
+ red ; intros ; subst.
+ rewrite H0 in H.
+ apply (ZMicromega.Zeq_bool_neq _ _ H).
+ reflexivity.
+Qed.
+
+Lemma Qle_bool_imp_le : forall x y : Q, Qle_bool x y = true -> x <= y.
+Proof.
+ unfold Qle_bool, Qle.
+ intros.
+ apply Zle_bool_imp_le ; auto.
+Qed.
+
+
+
+
+Lemma QSORaddon :
+ SORaddon 0 1 Qplus Qmult Qminus Qopp Qeq Qle (* ring elements *)
+ 0 1 Qplus Qmult Qminus Qopp (* coefficients *)
+ Qeq_bool Qle_bool
+ (fun x => x) (fun x => x) (pow_N 1 Qmult).
+Proof.
+ constructor.
+ constructor ; intros ; try reflexivity.
+ apply Qeq_bool_ok ; auto.
+ constructor.
+ reflexivity.
+ intros x y.
+ apply Qeq_bool_neq ; auto.
+ apply Qle_bool_imp_le.
+Qed.
+
+
+(*Definition Zeval_expr := eval_pexpr 0 Zplus Zmult Zminus Zopp (fun x => x) (fun x => Z_of_N x) (Zpower).*)
+Require Import EnvRing.
+
+Fixpoint Qeval_expr (env: PolEnv Q) (e: PExpr Q) : Q :=
+ match e with
+ | PEc c => c
+ | PEX j => env j
+ | PEadd pe1 pe2 => (Qeval_expr env pe1) + (Qeval_expr env pe2)
+ | PEsub pe1 pe2 => (Qeval_expr env pe1) - (Qeval_expr env pe2)
+ | PEmul pe1 pe2 => (Qeval_expr env pe1) * (Qeval_expr env pe2)
+ | PEopp pe1 => - (Qeval_expr env pe1)
+ | PEpow pe1 n => Qpower (Qeval_expr env pe1) (Z_of_N n)
+ end.
+
+Lemma Qeval_expr_simpl : forall env e,
+ Qeval_expr env e =
+ match e with
+ | PEc c => c
+ | PEX j => env j
+ | PEadd pe1 pe2 => (Qeval_expr env pe1) + (Qeval_expr env pe2)
+ | PEsub pe1 pe2 => (Qeval_expr env pe1) - (Qeval_expr env pe2)
+ | PEmul pe1 pe2 => (Qeval_expr env pe1) * (Qeval_expr env pe2)
+ | PEopp pe1 => - (Qeval_expr env pe1)
+ | PEpow pe1 n => Qpower (Qeval_expr env pe1) (Z_of_N n)
+ end.
+Proof.
+ destruct e ; reflexivity.
+Qed.
+
+Definition Qeval_expr' := eval_pexpr Qplus Qmult Qminus Qopp (fun x => x) (fun x => x) (pow_N 1 Qmult).
+
+Lemma QNpower : forall r n, r ^ Z_of_N n = pow_N 1 Qmult r n.
+Proof.
+ destruct n ; reflexivity.
+Qed.
+
+
+Lemma Qeval_expr_compat : forall env e, Qeval_expr env e = Qeval_expr' env e.
+Proof.
+ induction e ; simpl ; subst ; try congruence.
+ rewrite IHe.
+ apply QNpower.
+Qed.
+
+Definition Qeval_op2 (o : Op2) : Q -> Q -> Prop :=
+match o with
+| OpEq => Qeq
+| OpNEq => fun x y => ~ x == y
+| OpLe => Qle
+| OpGe => Qge
+| OpLt => Qlt
+| OpGt => Qgt
+end.
+
+Definition Qeval_formula (e:PolEnv Q) (ff : Formula Q) :=
+ let (lhs,o,rhs) := ff in Qeval_op2 o (Qeval_expr e lhs) (Qeval_expr e rhs).
+
+Definition Qeval_formula' :=
+ eval_formula Qplus Qmult Qminus Qopp Qeq Qle Qlt (fun x => x) (fun x => x) (pow_N 1 Qmult).
+
+Lemma Qeval_formula_compat : forall env f, Qeval_formula env f <-> Qeval_formula' env f.
+Proof.
+ intros.
+ unfold Qeval_formula.
+ destruct f.
+ repeat rewrite Qeval_expr_compat.
+ unfold Qeval_formula'.
+ unfold Qeval_expr'.
+ split ; destruct Fop ; simpl; auto.
+Qed.
+
+
+
+Definition Qeval_nformula :=
+ eval_nformula 0 Qplus Qmult Qminus Qopp Qeq Qle Qlt (fun x => x) (fun x => x) (pow_N 1 Qmult).
+
+Definition Qeval_op1 (o : Op1) : Q -> Prop :=
+match o with
+| Equal => fun x : Q => x == 0
+| NonEqual => fun x : Q => ~ x == 0
+| Strict => fun x : Q => 0 < x
+| NonStrict => fun x : Q => 0 <= x
+end.
+
+Lemma Qeval_nformula_simpl : forall env f, Qeval_nformula env f = (let (p, op) := f in Qeval_op1 op (Qeval_expr env p)).
+Proof.
+ intros.
+ destruct f.
+ rewrite Qeval_expr_compat.
+ reflexivity.
+Qed.
+
+Lemma Qeval_nformula_dec : forall env d, (Qeval_nformula env d) \/ ~ (Qeval_nformula env d).
+Proof.
+ exact (fun env d =>eval_nformula_dec Qsor (fun x => x) (fun x => x) (pow_N 1 Qmult) env d).
+Qed.
+
+Definition QWitness := ConeMember Q.
+
+Definition QWeakChecker := check_normalised_formulas 0 1 Qplus Qmult Qminus Qopp Qeq_bool Qle_bool.
+
+Require Import List.
+
+Lemma QWeakChecker_sound : forall (l : list (NFormula Q)) (cm : QWitness),
+ QWeakChecker l cm = true ->
+ forall env, make_impl (Qeval_nformula env) l False.
+Proof.
+ intros l cm H.
+ intro.
+ unfold Qeval_nformula.
+ apply (checker_nf_sound Qsor QSORaddon l cm).
+ unfold QWeakChecker in H.
+ exact H.
+Qed.
+
+Require Import Tauto.
+
+Definition QTautoChecker (f : BFormula (Formula Q)) (w: list QWitness) : bool :=
+ @tauto_checker (Formula Q) (NFormula Q) (@cnf_normalise Q) (@cnf_negate Q) QWitness QWeakChecker f w.
+
+Lemma QTautoChecker_sound : forall f w, QTautoChecker f w = true -> forall env, eval_f (Qeval_formula env) f.
+Proof.
+ intros f w.
+ unfold QTautoChecker.
+ apply (tauto_checker_sound Qeval_formula Qeval_nformula).
+ apply Qeval_nformula_dec.
+ intros. rewrite Qeval_formula_compat. unfold Qeval_formula'. now apply (cnf_normalise_correct Qsor).
+ intros. rewrite Qeval_formula_compat. unfold Qeval_formula'. now apply (cnf_negate_correct Qsor).
+ intros t w0.
+ apply QWeakChecker_sound.
+Qed.
+
+
diff --git a/contrib/micromega/RMicromega.v b/contrib/micromega/RMicromega.v
new file mode 100644
index 000000000..a662744bc
--- /dev/null
+++ b/contrib/micromega/RMicromega.v
@@ -0,0 +1,148 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import OrderedRing.
+Require Import RingMicromega.
+Require Import Refl.
+Require Import Reals.
+Require Setoid.
+
+Definition Rsrt : ring_theory R0 R1 Rplus Rmult Rminus Ropp (@eq R).
+Proof.
+ constructor.
+ exact Rplus_0_l.
+ exact Rplus_comm.
+ intros. rewrite Rplus_assoc. auto.
+ exact Rmult_1_l.
+ exact Rmult_comm.
+ intros ; rewrite Rmult_assoc ; auto.
+ intros. rewrite Rmult_comm. rewrite Rmult_plus_distr_l.
+ rewrite (Rmult_comm z). rewrite (Rmult_comm z). auto.
+ reflexivity.
+ exact Rplus_opp_r.
+Qed.
+
+Add Ring Rring : Rsrt.
+Open Scope R_scope.
+
+Lemma Rmult_neutral : forall x:R , 0 * x = 0.
+Proof.
+ intro ; ring.
+Qed.
+
+
+Lemma Rsor : SOR R0 R1 Rplus Rmult Rminus Ropp (@eq R) Rle Rlt.
+Proof.
+ constructor; intros ; subst ; try (intuition (subst; try ring ; auto with real)).
+ constructor.
+ constructor.
+ unfold RelationClasses.Symmetric. auto.
+ unfold RelationClasses.Transitive. intros. subst. reflexivity.
+ apply Rsrt.
+ eapply Rle_trans ; eauto.
+ apply (Rlt_irrefl m) ; auto.
+ apply Rnot_le_lt. auto with real.
+ destruct (total_order_T n m) as [ [H1 | H1] | H1] ; auto.
+ intros.
+ rewrite <- (Rmult_neutral m).
+ apply (Rmult_lt_compat_r) ; auto.
+Qed.
+
+Require ZMicromega.
+
+(* R with coeffs in Z *)
+
+Lemma RZSORaddon :
+ SORaddon R0 R1 Rplus Rmult Rminus Ropp (@eq R) Rle (* ring elements *)
+ 0%Z 1%Z Zplus Zmult Zminus Zopp (* coefficients *)
+ Zeq_bool Zle_bool
+ IZR Nnat.nat_of_N pow.
+Proof.
+ constructor.
+ constructor ; intros ; try reflexivity.
+ apply plus_IZR.
+ symmetry. apply Z_R_minus.
+ apply mult_IZR.
+ apply Ropp_Ropp_IZR.
+ apply IZR_eq.
+ apply Zeqb_ok ; auto.
+ apply R_power_theory.
+ intros x y.
+ intro.
+ apply IZR_neq.
+ apply ZMicromega.Zeq_bool_neq ; auto.
+ intros. apply IZR_le. apply Zle_bool_imp_le. auto.
+Qed.
+
+
+Require Import EnvRing.
+
+Definition INZ (n:N) : R :=
+ match n with
+ | N0 => IZR 0%Z
+ | Npos p => IZR (Zpos p)
+ end.
+
+Definition Reval_expr := eval_pexpr Rplus Rmult Rminus Ropp IZR Nnat.nat_of_N pow.
+
+
+Definition Reval_formula :=
+ eval_formula Rplus Rmult Rminus Ropp (@eq R) Rle Rlt IZR Nnat.nat_of_N pow.
+
+
+Definition Reval_nformula :=
+ eval_nformula 0 Rplus Rmult Rminus Ropp (@eq R) Rle Rlt IZR Nnat.nat_of_N pow.
+
+
+Lemma Reval_nformula_dec : forall env d, (Reval_nformula env d) \/ ~ (Reval_nformula env d).
+Proof.
+ exact (fun env d =>eval_nformula_dec Rsor IZR Nnat.nat_of_N pow env d).
+Qed.
+
+Definition RWitness := ConeMember Z.
+
+Definition RWeakChecker := check_normalised_formulas 0%Z 1%Z Zplus Zmult Zminus Zopp Zeq_bool Zle_bool.
+
+Require Import List.
+
+Lemma RWeakChecker_sound : forall (l : list (NFormula Z)) (cm : RWitness),
+ RWeakChecker l cm = true ->
+ forall env, make_impl (Reval_nformula env) l False.
+Proof.
+ intros l cm H.
+ intro.
+ unfold Reval_nformula.
+ apply (checker_nf_sound Rsor RZSORaddon l cm).
+ unfold RWeakChecker in H.
+ exact H.
+Qed.
+
+Require Import Tauto.
+
+Definition RTautoChecker (f : BFormula (Formula Z)) (w: list RWitness) : bool :=
+ @tauto_checker (Formula Z) (NFormula Z) (@cnf_normalise Z) (@cnf_negate Z) RWitness RWeakChecker f w.
+
+Lemma RTautoChecker_sound : forall f w, RTautoChecker f w = true -> forall env, eval_f (Reval_formula env) f.
+Proof.
+ intros f w.
+ unfold RTautoChecker.
+ apply (tauto_checker_sound Reval_formula Reval_nformula).
+ apply Reval_nformula_dec.
+ intros. unfold Reval_formula. now apply (cnf_normalise_correct Rsor).
+ intros. unfold Reval_formula. now apply (cnf_negate_correct Rsor).
+ intros t w0.
+ apply RWeakChecker_sound.
+Qed.
+
+
diff --git a/contrib/micromega/Refl.v b/contrib/micromega/Refl.v
index 8dced223b..801d8b212 100644
--- a/contrib/micromega/Refl.v
+++ b/contrib/micromega/Refl.v
@@ -1,11 +1,19 @@
-(********************************************************************)
-(* *)
-(* Micromega: A reflexive tactics using the Positivstellensatz *)
-(* *)
-(* Frédéric Besson (Irisa/Inria) 2006 *)
-(* *)
-(********************************************************************)
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
Require Import List.
+Require Setoid.
Set Implicit Arguments.
@@ -38,6 +46,7 @@ Proof.
intros; destruct l; simpl; tauto.
Qed.
+
Lemma make_conj_impl : forall (A : Type) (eval : A -> Prop) (l : list A) (g : Prop),
(make_conj eval l -> g) <-> make_impl eval l g.
Proof.
@@ -72,3 +81,49 @@ Proof.
apply IHl; auto.
Qed.
+
+
+Lemma make_conj_app : forall A eval l1 l2, @make_conj A eval (l1 ++ l2) <-> @make_conj A eval l1 /\ @make_conj A eval l2.
+Proof.
+ induction l1.
+ simpl.
+ tauto.
+ intros.
+ change ((a::l1) ++ l2) with (a :: (l1 ++ l2)).
+ rewrite make_conj_cons.
+ rewrite IHl1.
+ rewrite make_conj_cons.
+ tauto.
+Qed.
+
+Lemma not_make_conj_cons : forall (A:Type) (t:A) a eval (no_middle_eval : (eval t) \/ ~ (eval t)),
+ ~ make_conj eval (t ::a) -> ~ (eval t) \/ (~ make_conj eval a).
+Proof.
+ intros.
+ simpl in H.
+ destruct a.
+ tauto.
+ tauto.
+Qed.
+
+Lemma not_make_conj_app : forall (A:Type) (t:list A) a eval
+ (no_middle_eval : forall d, eval d \/ ~ eval d) ,
+ ~ make_conj eval (t ++ a) -> (~ make_conj eval t) \/ (~ make_conj eval a).
+Proof.
+ induction t.
+ simpl.
+ tauto.
+ intros.
+ simpl ((a::t)++a0)in H.
+ destruct (@not_make_conj_cons _ _ _ _ (no_middle_eval a) H).
+ left ; red ; intros.
+ apply H0.
+ rewrite make_conj_cons in H1.
+ tauto.
+ destruct (IHt _ _ no_middle_eval H0).
+ left ; red ; intros.
+ apply H1.
+ rewrite make_conj_cons in H2.
+ tauto.
+ right ; auto.
+Qed.
diff --git a/contrib/micromega/RingMicromega.v b/contrib/micromega/RingMicromega.v
index 5aca6e697..6885b82cd 100644
--- a/contrib/micromega/RingMicromega.v
+++ b/contrib/micromega/RingMicromega.v
@@ -1,17 +1,25 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* Evgeny Makarov, INRIA, 2007 *)
+(************************************************************************)
+
Require Import NArith.
Require Import Relation_Definitions.
Require Import Setoid.
(*****)
-Require Import NRing.
-(*****)
-(*Require Import Ring_polynom.*)
+Require Import Env.
+Require Import EnvRing.
(*****)
Require Import List.
Require Import Bool.
Require Import OrderedRing.
Require Import Refl.
-Require Import CheckerMaker.
-Require VarMap.
+
Set Implicit Arguments.
@@ -71,9 +79,9 @@ Record SORaddon := mk_SOR_addon {
Variable addon : SORaddon.
Add Relation R req
- reflexivity proved by sor.(SORsetoid).(@Equivalence_Reflexive _ _)
- symmetry proved by sor.(SORsetoid).(@Equivalence_Symmetric _ _)
- transitivity proved by sor.(SORsetoid).(@Equivalence_Transitive _ _)
+ reflexivity proved by sor.(SORsetoid).(@Equivalence_Reflexive _ _ )
+ symmetry proved by sor.(SORsetoid).(@Equivalence_Symmetric _ _ )
+ transitivity proved by sor.(SORsetoid).(@Equivalence_Transitive _ _ )
as micomega_sor_setoid.
Add Morphism rplus with signature req ==> req ==> req as rplus_morph.
@@ -132,26 +140,26 @@ Qed.
(* Begin Micromega *)
Definition PExprC := PExpr C. (* arbitrary expressions built from +, *, - *)
-Definition PolC := Pol C. (* polynomials in generalized Horner form, defined in Ring_polynom or NRing *)
+Definition PolC := Pol C. (* polynomials in generalized Horner form, defined in Ring_polynom or EnvRing *)
(*****)
-Definition Env := VarMap.t R. (* For interpreting PExprC *)
-Definition PolEnv := VarMap.off_map R. (* For interpreting PolC *)
+(*Definition Env := Env R. (* For interpreting PExprC *)*)
+Definition PolEnv := Env R. (* For interpreting PolC *)
(*****)
(*Definition Env := list R.
Definition PolEnv := list R.*)
(*****)
-(* What benefit do we get, in the case of NRing, from defining eval_pexpr
+(* What benefit do we get, in the case of EnvRing, from defining eval_pexpr
explicitely below and not through PEeval, as the following lemma says? The
function eval_pexpr seems to be a straightforward special case of PEeval
when the environment (i.e., the second last argument of PEeval) of type
off_map (which is (option positive * t)) is (None, env). *)
(*****)
-Fixpoint eval_pexpr (l : Env) (pe : PExprC) {struct pe} : R :=
+Fixpoint eval_pexpr (l : PolEnv) (pe : PExprC) {struct pe} : R :=
match pe with
| PEc c => phi c
-| PEX j => VarMap.find 0 j l
+| PEX j => l j
| PEadd pe1 pe2 => (eval_pexpr l pe1) + (eval_pexpr l pe2)
| PEsub pe1 pe2 => (eval_pexpr l pe1) - (eval_pexpr l pe2)
| PEmul pe1 pe2 => (eval_pexpr l pe1) * (eval_pexpr l pe2)
@@ -159,9 +167,27 @@ match pe with
| PEpow pe1 n => rpow (eval_pexpr l pe1) (pow_phi n)
end.
-Lemma eval_pexpr_PEeval : forall (env : Env) (pe : PExprC),
+
+Lemma eval_pexpr_simpl : forall (l : PolEnv) (pe : PExprC),
+ eval_pexpr l pe =
+ match pe with
+ | PEc c => phi c
+ | PEX j => l j
+ | PEadd pe1 pe2 => (eval_pexpr l pe1) + (eval_pexpr l pe2)
+ | PEsub pe1 pe2 => (eval_pexpr l pe1) - (eval_pexpr l pe2)
+ | PEmul pe1 pe2 => (eval_pexpr l pe1) * (eval_pexpr l pe2)
+ | PEopp pe1 => - (eval_pexpr l pe1)
+ | PEpow pe1 n => rpow (eval_pexpr l pe1) (pow_phi n)
+ end.
+Proof.
+ intros ; destruct pe ; reflexivity.
+Qed.
+
+
+
+Lemma eval_pexpr_PEeval : forall (env : PolEnv) (pe : PExprC),
eval_pexpr env pe =
- PEeval 0 rplus rtimes rminus ropp phi pow_phi rpow (None, env) pe.
+ PEeval rplus rtimes rminus ropp phi pow_phi rpow env pe.
Proof.
induction pe; simpl; intros.
reflexivity.
@@ -177,36 +203,6 @@ Qed.
PEeval 0 rplus rtimes rminus ropp phi pow_phi rpow.*)
(*****)
-Inductive Op2 : Set := (* binary relations *)
-| OpEq
-| OpNEq
-| OpLe
-| OpGe
-| OpLt
-| OpGt.
-
-Definition eval_op2 (o : Op2) : R -> R -> Prop :=
-match o with
-| OpEq => req
-| OpNEq => fun x y : R => x ~= y
-| OpLe => rle
-| OpGe => fun x y : R => y <= x
-| OpLt => fun x y : R => x < y
-| OpGt => fun x y : R => y < x
-end.
-
-Record Formula : Type := {
- Flhs : PExprC;
- Fop : Op2;
- Frhs : PExprC
-}.
-
-Definition eval_formula (env : Env) (f : Formula) : Prop :=
- let (lhs, op, rhs) := f in
- (eval_op2 op) (eval_pexpr env lhs) (eval_pexpr env rhs).
-
-(* We normalize Formulas by moving terms to one side *)
-
Inductive Op1 : Set := (* relations with 0 *)
| Equal (* == 0 *)
| NonEqual (* ~= 0 *)
@@ -223,59 +219,9 @@ match o with
| NonStrict => fun x : R => 0 <= x
end.
-Definition eval_nformula (env : Env) (f : NFormula) : Prop :=
+Definition eval_nformula (env : PolEnv) (f : NFormula) : Prop :=
let (p, op) := f in eval_op1 op (eval_pexpr env p).
-Definition normalise (f : Formula) : NFormula :=
-let (lhs, op, rhs) := f in
- match op with
- | OpEq => (PEsub lhs rhs, Equal)
- | OpNEq => (PEsub lhs rhs, NonEqual)
- | OpLe => (PEsub rhs lhs, NonStrict)
- | OpGe => (PEsub lhs rhs, NonStrict)
- | OpGt => (PEsub lhs rhs, Strict)
- | OpLt => (PEsub rhs lhs, Strict)
- end.
-
-Definition negate (f : Formula) : NFormula :=
-let (lhs, op, rhs) := f in
- match op with
- | OpEq => (PEsub rhs lhs, NonEqual)
- | OpNEq => (PEsub rhs lhs, Equal)
- | OpLe => (PEsub lhs rhs, Strict) (* e <= e' == ~ e > e' *)
- | OpGe => (PEsub rhs lhs, Strict)
- | OpGt => (PEsub rhs lhs, NonStrict)
- | OpLt => (PEsub lhs rhs, NonStrict)
-end.
-
-Theorem normalise_sound :
- forall (env : Env) (f : Formula),
- eval_formula env f -> eval_nformula env (normalise f).
-Proof.
-intros env f H; destruct f as [lhs op rhs]; simpl in *.
-destruct op; simpl in *.
-now apply <- (Rminus_eq_0 sor).
-intros H1. apply -> (Rminus_eq_0 sor) in H1. now apply H.
-now apply -> (Rle_le_minus sor).
-now apply -> (Rle_le_minus sor).
-now apply -> (Rlt_lt_minus sor).
-now apply -> (Rlt_lt_minus sor).
-Qed.
-
-Theorem negate_correct :
- forall (env : Env) (f : Formula),
- eval_formula env f <-> ~ (eval_nformula env (negate f)).
-Proof.
-intros env f; destruct f as [lhs op rhs]; simpl.
-destruct op; simpl.
-symmetry. rewrite (Rminus_eq_0 sor).
-split; intro H; [symmetry; now apply -> (Req_dne sor) | symmetry in H; now apply <- (Req_dne sor)].
-rewrite (Rminus_eq_0 sor). split; intro; now apply (Rneq_symm sor).
-rewrite <- (Rlt_lt_minus sor). now rewrite <- (Rle_ngt sor).
-rewrite <- (Rlt_lt_minus sor). now rewrite <- (Rle_ngt sor).
-rewrite <- (Rle_le_minus sor). now rewrite <- (Rlt_nge sor).
-rewrite <- (Rle_le_minus sor). now rewrite <- (Rlt_nge sor).
-Qed.
Definition OpMult (o o' : Op1) : Op1 :=
match o with
@@ -365,6 +311,12 @@ Inductive Monoid (l : list NFormula) : PExprC -> Prop :=
| M_In : forall p : PExprC, In (p, NonEqual) l -> Monoid l p
| M_Mult : forall (e1 e2 : PExprC), Monoid l e1 -> Monoid l e2 -> Monoid l (PEmul e1 e2).
+(* Do we really need to rely on the intermediate definition of monoid ?
+ InC why the restriction NonEqual ?
+ Could not we consider the IsIdeal as a IsMult ?
+ The same for IsSquare ?
+*)
+
Inductive Cone (l : list (NFormula)) : PExprC -> Op1 -> Prop :=
| InC : forall p op, In (p, op) l -> op <> NonEqual -> Cone l p op
| IsIdeal : forall p, Cone l p Equal -> forall p', Cone l (PEmul p p') Equal
@@ -378,7 +330,7 @@ Inductive Cone (l : list (NFormula)) : PExprC -> Op1 -> Prop :=
(* As promised, if all hypotheses are true in some environment, then every
member of the monoid is nonzero in this environment *)
-Lemma monoid_nonzero : forall (l : list NFormula) (env : Env),
+Lemma monoid_nonzero : forall (l : list NFormula) (env : PolEnv),
(forall f : NFormula, In f l -> eval_nformula env f) ->
forall p : PExprC, Monoid l p -> eval_pexpr env p ~= 0.
Proof.
@@ -392,7 +344,7 @@ Qed.
member of the cone is true as well *)
Lemma cone_true :
- forall (l : list NFormula) (env : Env),
+ forall (l : list NFormula) (env : PolEnv),
(forall (f : NFormula), In f l -> eval_nformula env f) ->
forall (p : PExprC) (op : Op1), Cone l p op ->
op <> NonEqual /\ eval_nformula env (p, op).
@@ -423,7 +375,7 @@ Inductive ConeMember : Type :=
| S_Monoid : MonoidMember -> ConeMember
| S_Mult : ConeMember -> ConeMember -> ConeMember
| S_Add : ConeMember -> ConeMember -> ConeMember
-| S_Pos : forall c : C, cltb cO c = true -> ConeMember (* the proof of cltb 0 c = true should be (refl_equal true) *)
+| S_Pos : C -> ConeMember
| S_Z : ConeMember.
Definition nformula_times (f f' : NFormula) : NFormula :=
@@ -477,7 +429,7 @@ match cm with
| S_Monoid m => let p := eval_monoid l m in (PEmul p p, Strict)
| S_Mult p q => nformula_times (eval_cone l p) (eval_cone l q)
| S_Add p q => nformula_plus (eval_cone l p) (eval_cone l q)
-| S_Pos c _ => (PEc c, Strict)
+| S_Pos c => if cltb cO c then (PEc c, Strict) else (PEc cO, Equal)
| S_Z => (PEc cO, Equal)
end.
@@ -494,7 +446,8 @@ apply IsSquare.
apply IsMonoid. apply eval_monoid_in_monoid.
destruct (eval_cone l cm1). destruct (eval_cone l cm2). unfold nformula_times. now apply IsMult.
destruct (eval_cone l cm1). destruct (eval_cone l cm2). unfold nformula_plus. now apply IsAdd.
-now apply IsPos. apply IsZ.
+case_eq (cO [<] c) ; intros ; [apply IsPos ; auto| apply IsZ].
+apply IsZ.
Qed.
(* (inconsistent_cone_member l p) means (p, op) is in the cone for some op
@@ -507,7 +460,7 @@ verified if we have a certificate. *)
Definition inconsistent_cone_member (l : list NFormula) (p : PExprC) :=
exists op : Op1, Cone l p op /\
- forall env : Env, ~ eval_op1 op (eval_pexpr env p).
+ forall env : PolEnv, ~ eval_op1 op (eval_pexpr env p).
(* If some element of a cone is inconsistent, then the base of the cone
is also inconsistent *)
@@ -540,7 +493,7 @@ let Rops_wd := mk_reqe rplus rtimes ropp req
sor.(SORplus_wd)
sor.(SORtimes_wd)
sor.(SORopp_wd) in
- norm_aux_spec sor.(SORsetoid) Rops_wd (Rth_ARth sor.(SORsetoid) Rops_wd sor.(SORrt))
+ norm_aux_spec sor.(SORsetoid) Rops_wd (Rth_ARth (SORsetoid sor) Rops_wd sor.(SORrt))
addon.(SORrm) addon.(SORpower).
(*****)
(*Definition normalise_pexpr_correct :=
@@ -593,7 +546,7 @@ Definition check_normalised_formulas : list NFormula -> ConeMember -> bool :=
Lemma checker_nf_sound :
forall (l : list NFormula) (cm : ConeMember),
check_normalised_formulas l cm = true ->
- forall env : Env, make_impl (eval_nformula env) l False.
+ forall env : PolEnv, make_impl (eval_nformula env) l False.
Proof.
intros l cm H env.
unfold check_normalised_formulas in H.
@@ -603,29 +556,224 @@ pose proof (eval_cone_in_cone l cm) as H2. now rewrite H1 in H2.
apply check_inconsistent_sound. now rewrite <- H1.
Qed.
-Definition check_formulas :=
- CheckerMaker.check_formulas normalise check_normalised_formulas.
+(** Normalisation of formulae **)
-Theorem check_formulas_sound :
- forall (l : list Formula) (w : ConeMember),
- check_formulas l w = true ->
- forall env : Env, make_impl (eval_formula env) l False.
+Inductive Op2 : Set := (* binary relations *)
+| OpEq
+| OpNEq
+| OpLe
+| OpGe
+| OpLt
+| OpGt.
+
+Definition eval_op2 (o : Op2) : R -> R -> Prop :=
+match o with
+| OpEq => req
+| OpNEq => fun x y : R => x ~= y
+| OpLe => rle
+| OpGe => fun x y : R => y <= x
+| OpLt => fun x y : R => x < y
+| OpGt => fun x y : R => y < x
+end.
+
+Record Formula : Type := {
+ Flhs : PExprC;
+ Fop : Op2;
+ Frhs : PExprC
+}.
+
+Definition eval_formula (env : PolEnv) (f : Formula) : Prop :=
+ let (lhs, op, rhs) := f in
+ (eval_op2 op) (eval_pexpr env lhs) (eval_pexpr env rhs).
+
+(* We normalize Formulas by moving terms to one side *)
+
+Definition normalise (f : Formula) : NFormula :=
+let (lhs, op, rhs) := f in
+ match op with
+ | OpEq => (PEsub lhs rhs, Equal)
+ | OpNEq => (PEsub lhs rhs, NonEqual)
+ | OpLe => (PEsub rhs lhs, NonStrict)
+ | OpGe => (PEsub lhs rhs, NonStrict)
+ | OpGt => (PEsub lhs rhs, Strict)
+ | OpLt => (PEsub rhs lhs, Strict)
+ end.
+
+Definition negate (f : Formula) : NFormula :=
+let (lhs, op, rhs) := f in
+ match op with
+ | OpEq => (PEsub rhs lhs, NonEqual)
+ | OpNEq => (PEsub rhs lhs, Equal)
+ | OpLe => (PEsub lhs rhs, Strict) (* e <= e' == ~ e > e' *)
+ | OpGe => (PEsub rhs lhs, Strict)
+ | OpGt => (PEsub rhs lhs, NonStrict)
+ | OpLt => (PEsub lhs rhs, NonStrict)
+end.
+
+Theorem normalise_sound :
+ forall (env : PolEnv) (f : Formula),
+ eval_formula env f -> eval_nformula env (normalise f).
+Proof.
+intros env f H; destruct f as [lhs op rhs]; simpl in *.
+destruct op; simpl in *.
+now apply <- (Rminus_eq_0 sor).
+intros H1. apply -> (Rminus_eq_0 sor) in H1. now apply H.
+now apply -> (Rle_le_minus sor).
+now apply -> (Rle_le_minus sor).
+now apply -> (Rlt_lt_minus sor).
+now apply -> (Rlt_lt_minus sor).
+Qed.
+
+Theorem negate_correct :
+ forall (env : PolEnv) (f : Formula),
+ eval_formula env f <-> ~ (eval_nformula env (negate f)).
+Proof.
+intros env f; destruct f as [lhs op rhs]; simpl.
+destruct op; simpl.
+symmetry. rewrite (Rminus_eq_0 sor).
+split; intro H; [symmetry; now apply -> (Req_dne sor) | symmetry in H; now apply <- (Req_dne sor)].
+rewrite (Rminus_eq_0 sor). split; intro; now apply (Rneq_symm sor).
+rewrite <- (Rlt_lt_minus sor). now rewrite <- (Rle_ngt sor).
+rewrite <- (Rlt_lt_minus sor). now rewrite <- (Rle_ngt sor).
+rewrite <- (Rle_le_minus sor). now rewrite <- (Rlt_nge sor).
+rewrite <- (Rle_le_minus sor). now rewrite <- (Rlt_nge sor).
+Qed.
+
+(** Another normalistion - this is used for cnf conversion **)
+
+Definition xnormalise (t:Formula) : list (NFormula) :=
+ let (lhs,o,rhs) := t in
+ match o with
+ | OpEq =>
+ (PEsub lhs rhs, Strict)::(PEsub rhs lhs , Strict)::nil
+ | OpNEq => (PEsub lhs rhs,Equal) :: nil
+ | OpGt => (PEsub rhs lhs,NonStrict) :: nil
+ | OpLt => (PEsub lhs rhs,NonStrict) :: nil
+ | OpGe => (PEsub rhs lhs , Strict) :: nil
+ | OpLe => (PEsub lhs rhs ,Strict) :: nil
+ end.
+
+Require Import Tauto.
+
+Definition cnf_normalise (t:Formula) : cnf (NFormula) :=
+ List.map (fun x => x::nil) (xnormalise t).
+
+
+Add Ring SORRing : sor.(SORrt).
+
+Lemma cnf_normalise_correct : forall env t, eval_cnf (eval_nformula env) (cnf_normalise t) -> eval_formula env t.
Proof.
-exact (CheckerMaker.check_formulas_sound eval_formula eval_nformula normalise
- normalise_sound check_normalised_formulas checker_nf_sound).
+ unfold cnf_normalise, xnormalise ; simpl ; intros env t.
+ unfold eval_cnf.
+ destruct t as [lhs o rhs]; case_eq o ; simpl;
+ generalize (eval_pexpr env lhs);
+ generalize (eval_pexpr env rhs) ; intros z1 z2 ; intros.
+ (**)
+ apply sor.(SORle_antisymm).
+ rewrite (Rle_ngt sor). rewrite (Rlt_lt_minus sor). tauto.
+ rewrite (Rle_ngt sor). rewrite (Rlt_lt_minus sor). tauto.
+ now rewrite <- (Rminus_eq_0 sor).
+ rewrite (Rle_ngt sor). rewrite (Rlt_lt_minus sor). auto.
+ rewrite (Rle_ngt sor). rewrite (Rlt_lt_minus sor). auto.
+ rewrite (Rlt_nge sor). rewrite (Rle_le_minus sor). auto.
+ rewrite (Rlt_nge sor). rewrite (Rle_le_minus sor). auto.
+Qed.
+
+Definition xnegate (t:Formula) : list (NFormula) :=
+ let (lhs,o,rhs) := t in
+ match o with
+ | OpEq => (PEsub lhs rhs,Equal) :: nil
+ | OpNEq => (PEsub lhs rhs ,Strict)::(PEsub rhs lhs,Strict)::nil
+ | OpGt => (PEsub lhs rhs,Strict) :: nil
+ | OpLt => (PEsub rhs lhs,Strict) :: nil
+ | OpGe => (PEsub lhs rhs,NonStrict) :: nil
+ | OpLe => (PEsub rhs lhs,NonStrict) :: nil
+ end.
+
+Definition cnf_negate (t:Formula) : cnf (NFormula) :=
+ List.map (fun x => x::nil) (xnegate t).
+
+Lemma cnf_negate_correct : forall env t, eval_cnf (eval_nformula env) (cnf_negate t) -> ~ eval_formula env t.
+Proof.
+ unfold cnf_negate, xnegate ; simpl ; intros env t.
+ unfold eval_cnf.
+ destruct t as [lhs o rhs]; case_eq o ; simpl ;
+ generalize (eval_pexpr env lhs);
+ generalize (eval_pexpr env rhs) ; intros z1 z2 ; intros ;
+ intuition.
+ (**)
+ apply H0.
+ rewrite H1 ; ring.
+ (**)
+ apply H1.
+ apply sor.(SORle_antisymm).
+ rewrite (Rle_ngt sor). rewrite (Rlt_lt_minus sor). tauto.
+ rewrite (Rle_ngt sor). rewrite (Rlt_lt_minus sor). tauto.
+ (**)
+ apply H0. now rewrite (Rle_le_minus sor) in H1.
+ apply H0. now rewrite (Rle_le_minus sor) in H1.
+ apply H0. now rewrite (Rlt_lt_minus sor) in H1.
+ apply H0. now rewrite (Rlt_lt_minus sor) in H1.
Qed.
-Definition check_conj_formulas :=
- CheckerMaker.check_conj_formulas normalise negate check_normalised_formulas.
-Theorem check_conj_formulas_sound :
- forall (l1 : list Formula) (l2 : list Formula) (ws : list ConeMember),
- check_conj_formulas l1 ws l2 = true ->
- forall env : Env, make_impl (eval_formula env) l1 (make_conj (eval_formula env) l2).
+Lemma eval_nformula_dec : forall env d, (eval_nformula env d) \/ ~ (eval_nformula env d).
Proof.
-exact (check_conj_formulas_sound eval_formula eval_nformula normalise negate
- normalise_sound negate_correct check_normalised_formulas checker_nf_sound).
+ intros.
+ destruct d ; simpl.
+ generalize (eval_pexpr env p); intros.
+ destruct o ; simpl.
+ apply (Req_em sor r 0).
+ destruct (Req_em sor r 0) ; tauto.
+ rewrite <- (Rle_ngt sor r 0). generalize (Rle_gt_cases sor r 0). tauto.
+ rewrite <- (Rlt_nge sor r 0). generalize (Rle_gt_cases sor 0 r). tauto.
Qed.
+(** Some syntactic simplifications of expressions and cone elements *)
+
+
+Fixpoint simpl_expr (e:PExprC) : PExprC :=
+ match e with
+ | PEmul y z => let y' := simpl_expr y in let z' := simpl_expr z in
+ match y' , z' with
+ | PEc c , z' => if ceqb c cI then z' else PEmul y' z'
+ | _ , _ => PEmul y' z'
+ end
+ | PEadd x y => PEadd (simpl_expr x) (simpl_expr y)
+ | _ => e
+ end.
+
+
+Definition simpl_cone (e:ConeMember) : ConeMember :=
+ match e with
+ | S_Square t => match simpl_expr t with
+ | PEc c => if ceqb cO c then S_Z else S_Pos (ctimes c c)
+ | x => S_Square x
+ end
+ | S_Mult t1 t2 =>
+ match t1 , t2 with
+ | S_Z , x => S_Z
+ | x , S_Z => S_Z
+ | S_Pos c , S_Pos c' => S_Pos (ctimes c c')
+ | S_Pos p1 , S_Mult (S_Pos p2) x => S_Mult (S_Pos (ctimes p1 p2)) x
+ | S_Pos p1 , S_Mult x (S_Pos p2) => S_Mult (S_Pos (ctimes p1 p2)) x
+ | S_Mult (S_Pos p2) x , S_Pos p1 => S_Mult (S_Pos (ctimes p1 p2)) x
+ | S_Mult x (S_Pos p2) , S_Pos p1 => S_Mult (S_Pos (ctimes p1 p2)) x
+ | S_Pos x , S_Add y z => S_Add (S_Mult (S_Pos x) y) (S_Mult (S_Pos x) z)
+ | S_Pos c , _ => if ceqb cI c then t2 else S_Mult t1 t2
+ | _ , S_Pos c => if ceqb cI c then t1 else S_Mult t1 t2
+ | _ , _ => e
+ end
+ | S_Add t1 t2 =>
+ match t1 , t2 with
+ | S_Z , x => x
+ | x , S_Z => x
+ | x , y => S_Add x y
+ end
+ | _ => e
+ end.
+
+
+
End Micromega.
diff --git a/contrib/micromega/Tauto.v b/contrib/micromega/Tauto.v
new file mode 100644
index 000000000..ef48efa6d
--- /dev/null
+++ b/contrib/micromega/Tauto.v
@@ -0,0 +1,324 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import List.
+Require Import Refl.
+Require Import Bool.
+
+Set Implicit Arguments.
+
+
+ Inductive BFormula (A:Type) : Type :=
+ | TT : BFormula A
+ | FF : BFormula A
+ | X : Prop -> BFormula A
+ | A : A -> BFormula A
+ | Cj : BFormula A -> BFormula A -> BFormula A
+ | D : BFormula A-> BFormula A -> BFormula A
+ | N : BFormula A -> BFormula A
+ | I : BFormula A-> BFormula A-> BFormula A.
+
+ Fixpoint eval_f (A:Type) (ev:A -> Prop ) (f:BFormula A) {struct f}: Prop :=
+ match f with
+ | TT => True
+ | FF => False
+ | A a => ev a
+ | X p => p
+ | Cj e1 e2 => (eval_f ev e1) /\ (eval_f ev e2)
+ | D e1 e2 => (eval_f ev e1) \/ (eval_f ev e2)
+ | N e => ~ (eval_f ev e)
+ | I f1 f2 => (eval_f ev f1) -> (eval_f ev f2)
+ end.
+
+
+ Lemma map_simpl : forall A B f l, @map A B f l = match l with
+ | nil => nil
+ | a :: l=> (f a) :: (@map A B f l)
+ end.
+ Proof.
+ destruct l ; reflexivity.
+ Qed.
+
+
+
+ Section S.
+
+ Variable Env : Type.
+ Variable Term : Type.
+ Variable eval : Env -> Term -> Prop.
+ Variable Term' : Type.
+ Variable eval' : Env -> Term' -> Prop.
+
+
+
+ Variable no_middle_eval' : forall env d, (eval' env d) \/ ~ (eval' env d).
+
+
+ Definition clause := list Term'.
+ Definition cnf := list clause.
+
+ Variable normalise : Term -> cnf.
+ Variable negate : Term -> cnf.
+
+
+ Definition tt : cnf := @nil clause.
+ Definition ff : cnf := cons (@nil Term') nil.
+
+
+ Definition or_clause_cnf (t:clause) (f:cnf) : cnf :=
+ List.map (fun x => (t++x)) f.
+
+ Fixpoint or_cnf (f : cnf) (f' : cnf) {struct f}: cnf :=
+ match f with
+ | nil => tt
+ | e :: rst => (or_cnf rst f') ++ (or_clause_cnf e f')
+ end.
+
+
+ Definition and_cnf (f1 : cnf) (f2 : cnf) : cnf :=
+ f1 ++ f2.
+
+ Fixpoint xcnf (pol : bool) (f : BFormula Term) {struct f}: cnf :=
+ match f with
+ | TT => if pol then tt else ff
+ | FF => if pol then ff else tt
+ | X p => if pol then ff else ff (* This is not complete - cannot negate any proposition *)
+ | A x => if pol then normalise x else negate x
+ | N e => xcnf (negb pol) e
+ | Cj e1 e2 =>
+ (if pol then and_cnf else or_cnf) (xcnf pol e1) (xcnf pol e2)
+ | D e1 e2 => (if pol then or_cnf else and_cnf) (xcnf pol e1) (xcnf pol e2)
+ | I e1 e2 => (if pol then or_cnf else and_cnf) (xcnf (negb pol) e1) (xcnf pol e2)
+ end.
+
+ Definition eval_cnf (env : Term' -> Prop) (f:cnf) := make_conj (fun cl => ~ make_conj env cl) f.
+
+
+ Lemma eval_cnf_app : forall env x y, eval_cnf (eval' env) (x++y) -> eval_cnf (eval' env) x /\ eval_cnf (eval' env) y.
+ Proof.
+ unfold eval_cnf.
+ intros.
+ rewrite make_conj_app in H ; auto.
+ Qed.
+
+
+ Lemma or_clause_correct : forall env t f, eval_cnf (eval' env) (or_clause_cnf t f) -> (~ make_conj (eval' env) t) \/ (eval_cnf (eval' env) f).
+ Proof.
+ unfold eval_cnf.
+ unfold or_clause_cnf.
+ induction f.
+ simpl.
+ intros ; right;auto.
+ (**)
+ rewrite map_simpl.
+ intros.
+ rewrite make_conj_cons in H.
+ destruct H as [HH1 HH2].
+ generalize (IHf HH2) ; clear IHf ; intro.
+ destruct H.
+ left ; auto.
+ rewrite make_conj_cons.
+ destruct (not_make_conj_app _ _ _ (no_middle_eval' env) HH1).
+ tauto.
+ tauto.
+ Qed.
+
+ Lemma eval_cnf_cons : forall env a f, (~ make_conj (eval' env) a) -> eval_cnf (eval' env) f -> eval_cnf (eval' env) (a::f).
+ Proof.
+ intros.
+ unfold eval_cnf in *.
+ rewrite make_conj_cons ; eauto.
+ Qed.
+
+ Lemma or_cnf_correct : forall env f f', eval_cnf (eval' env) (or_cnf f f') -> (eval_cnf (eval' env) f) \/ (eval_cnf (eval' env) f').
+ Proof.
+ induction f.
+ unfold eval_cnf.
+ simpl.
+ tauto.
+ (**)
+ intros.
+ simpl in H.
+ destruct (eval_cnf_app _ _ _ H).
+ clear H.
+ destruct (IHf _ H0).
+ destruct (or_clause_correct _ _ _ H1).
+ left.
+ apply eval_cnf_cons ; auto.
+ right ; auto.
+ right ; auto.
+ Qed.
+
+ Variable normalise_correct : forall env t, eval_cnf (eval' env) (normalise t) -> eval env t.
+
+ Variable negate_correct : forall env t, eval_cnf (eval' env) (negate t) -> ~ eval env t.
+
+
+ Lemma xcnf_correct : forall f pol env, eval_cnf (eval' env) (xcnf pol f) -> eval_f (eval env) (if pol then f else N f).
+ Proof.
+ induction f.
+ (* TT *)
+ unfold eval_cnf.
+ simpl.
+ destruct pol ; simpl ; auto.
+ (* FF *)
+ unfold eval_cnf.
+ destruct pol; simpl ; auto.
+ (* P *)
+ simpl.
+ destruct pol ; intros ;simpl.
+ unfold eval_cnf in H.
+ (* Here I have to drop the proposition *)
+ simpl in H.
+ tauto.
+ (* Here, I could store P in the clause *)
+ unfold eval_cnf in H;simpl in H.
+ tauto.
+ (* A *)
+ simpl.
+ destruct pol ; simpl.
+ intros.
+ apply normalise_correct ; auto.
+ (* A 2 *)
+ intros.
+ apply negate_correct ; auto.
+ auto.
+ (* Cj *)
+ destruct pol ; simpl.
+ (* pol = true *)
+ intros.
+ unfold and_cnf in H.
+ destruct (eval_cnf_app _ _ _ H).
+ clear H.
+ split.
+ apply (IHf1 _ _ H0).
+ apply (IHf2 _ _ H1).
+ (* pol = false *)
+ intros.
+ destruct (or_cnf_correct _ _ _ H).
+ generalize (IHf1 false env H0).
+ simpl.
+ tauto.
+ generalize (IHf2 false env H0).
+ simpl.
+ tauto.
+ (* D *)
+ simpl.
+ destruct pol.
+ (* pol = true *)
+ intros.
+ destruct (or_cnf_correct _ _ _ H).
+ generalize (IHf1 _ env H0).
+ simpl.
+ tauto.
+ generalize (IHf2 _ env H0).
+ simpl.
+ tauto.
+ (* pol = true *)
+ unfold and_cnf.
+ intros.
+ destruct (eval_cnf_app _ _ _ H).
+ clear H.
+ simpl.
+ generalize (IHf1 _ _ H0).
+ generalize (IHf2 _ _ H1).
+ simpl.
+ tauto.
+ (**)
+ simpl.
+ destruct pol ; simpl.
+ intros.
+ apply (IHf false) ; auto.
+ intros.
+ generalize (IHf _ _ H).
+ tauto.
+ (* I *)
+ simpl; intros.
+ destruct pol.
+ simpl.
+ intro.
+ destruct (or_cnf_correct _ _ _ H).
+ generalize (IHf1 _ _ H1).
+ simpl in *.
+ tauto.
+ generalize (IHf2 _ _ H1).
+ auto.
+ (* pol = false *)
+ unfold and_cnf in H.
+ simpl in H.
+ destruct (eval_cnf_app _ _ _ H).
+ generalize (IHf1 _ _ H0).
+ generalize (IHf2 _ _ H1).
+ simpl.
+ tauto.
+ Qed.
+
+
+ Variable Witness : Type.
+ Variable checker : list Term' -> Witness -> bool.
+
+ Variable checker_sound : forall t w, checker t w = true -> forall env, make_impl (eval' env) t False.
+
+ Fixpoint cnf_checker (f : cnf) (l : list Witness) {struct f}: bool :=
+ match f with
+ | nil => true
+ | e::f => match l with
+ | nil => false
+ | c::l => match checker e c with
+ | true => cnf_checker f l
+ | _ => false
+ end
+ end
+ end.
+
+ Lemma cnf_checker_sound : forall t w, cnf_checker t w = true -> forall env, eval_cnf (eval' env) t.
+ Proof.
+ unfold eval_cnf.
+ induction t.
+ (* bc *)
+ simpl.
+ auto.
+ (* ic *)
+ simpl.
+ destruct w.
+ intros ; discriminate.
+ case_eq (checker a w) ; intros ; try discriminate.
+ generalize (@checker_sound _ _ H env).
+ generalize (IHt _ H0 env) ; intros.
+ destruct t.
+ red ; intro.
+ rewrite <- make_conj_impl in H2.
+ tauto.
+ rewrite <- make_conj_impl in H2.
+ tauto.
+ Qed.
+
+
+ Definition tauto_checker (f:BFormula Term) (w:list Witness) : bool :=
+ cnf_checker (xcnf true f) w.
+
+ Lemma tauto_checker_sound : forall t w, tauto_checker t w = true -> forall env, eval_f (eval env) t.
+ Proof.
+ unfold tauto_checker.
+ intros.
+ change (eval_f (eval env) t) with (eval_f (eval env) (if true then t else TT Term)).
+ apply (xcnf_correct t true).
+ eapply cnf_checker_sound ; eauto.
+ Qed.
+
+
+
+
+End S.
+
diff --git a/contrib/micromega/VarMap.v b/contrib/micromega/VarMap.v
index 327f6d2d4..240c0fb7c 100644
--- a/contrib/micromega/VarMap.v
+++ b/contrib/micromega/VarMap.v
@@ -1,14 +1,20 @@
-(********************************************************************)
-(* *)
-(* Micromega:A reflexive tactics using the Positivstellensatz *)
-(* *)
-(* Frédéric Besson (Irisa/Inria) 2006 *)
-(* *)
-(********************************************************************)
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
Require Import ZArith.
Require Import Coq.Arith.Max.
Require Import List.
-(*Require Import BinList.*)
Set Implicit Arguments.
(* I have addded a Leaf constructor to the varmap data structure (/contrib/ring/Quote.v)
@@ -26,19 +32,19 @@ Section MakeVarMap.
| Leaf : A -> t
| Node : t -> A -> t -> t .
- Fixpoint find (p:positive) (vm : t ) {struct vm} : A :=
+ Fixpoint find (vm : t ) (p:positive) {struct vm} : A :=
match vm with
| Empty => default
| Leaf i => i
| Node l e r => match p with
| xH => e
- | xO p => find p l
- | xI p => find p r
+ | xO p => find l p
+ | xI p => find r p
end
end.
- (* an off_map (a map with offset) offers the same functionalites as /contrib/setoid_ring/BinList.v - it is used in NRing.v *)
-
+ (* an off_map (a map with offset) offers the same functionalites as /contrib/setoid_ring/BinList.v - it is used in EnvRing.v *)
+(*
Definition off_map := (option positive *t )%type.
@@ -58,8 +64,10 @@ Section MakeVarMap.
end%positive in
find idx m.
+
Definition hd (l:off_map) := nth xH l.
+
Definition tail (l:off_map ) := jump xH l.
@@ -244,7 +252,7 @@ Section MakeVarMap.
reflexivity.
Qed.
-
+*)
End MakeVarMap.
diff --git a/contrib/micromega/ZCoeff.v b/contrib/micromega/ZCoeff.v
index 791e00a90..ced67e39d 100644
--- a/contrib/micromega/ZCoeff.v
+++ b/contrib/micromega/ZCoeff.v
@@ -1,3 +1,13 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* Evgeny Makarov, INRIA, 2007 *)
+(************************************************************************)
+
Require Import OrderedRing.
Require Import RingMicromega.
Require Import ZArith.
@@ -29,6 +39,25 @@ Notation "x ~= y" := (~ req x y).
Notation "x <= y" := (rle x y).
Notation "x < y" := (rlt x y).
+Lemma req_refl : forall x, req x x.
+Proof.
+ destruct sor.(SORsetoid).
+ apply Equivalence_Reflexive.
+Qed.
+
+Lemma req_sym : forall x y, req x y -> req y x.
+Proof.
+ destruct sor.(SORsetoid).
+ apply Equivalence_Symmetric.
+Qed.
+
+Lemma req_trans : forall x y z, req x y -> req y z -> req x z.
+Proof.
+ destruct sor.(SORsetoid).
+ apply Equivalence_Transitive.
+Qed.
+
+
Add Relation R req
reflexivity proved by sor.(SORsetoid).(@Equivalence_Reflexive _ _)
symmetry proved by sor.(SORsetoid).(@Equivalence_Symmetric _ _)
diff --git a/contrib/micromega/ZMicromega.v b/contrib/micromega/ZMicromega.v
new file mode 100644
index 000000000..94c83f73d
--- /dev/null
+++ b/contrib/micromega/ZMicromega.v
@@ -0,0 +1,714 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import OrderedRing.
+Require Import RingMicromega.
+Require Import ZCoeff.
+Require Import Refl.
+Require Import ZArith.
+Require Import List.
+Require Import Bool.
+
+Ltac flatten_bool :=
+ repeat match goal with
+ [ id : (_ && _)%bool = true |- _ ] => destruct (andb_prop _ _ id); clear id
+ | [ id : (_ || _)%bool = true |- _ ] => destruct (orb_prop _ _ id); clear id
+ end.
+
+Require Import EnvRing.
+
+Open Scope Z_scope.
+
+Lemma Zsor : SOR 0 1 Zplus Zmult Zminus Zopp (@eq Z) Zle Zlt.
+Proof.
+ constructor ; intros ; subst ; try (intuition (auto with zarith)).
+ apply Zsth.
+ apply Zth.
+ destruct (Ztrichotomy n m) ; intuition (auto with zarith).
+ apply Zmult_lt_0_compat ; auto.
+Qed.
+
+Lemma Zeq_bool_neq : forall x y, Zeq_bool x y = false -> x <> y.
+Proof.
+ red ; intros.
+ subst.
+ unfold Zeq_bool in H.
+ rewrite Zcompare_refl in H.
+ discriminate.
+Qed.
+
+Lemma ZSORaddon :
+ SORaddon 0 1 Zplus Zmult Zminus Zopp (@eq Z) Zle (* ring elements *)
+ 0%Z 1%Z Zplus Zmult Zminus Zopp (* coefficients *)
+ Zeq_bool Zle_bool
+ (fun x => x) (fun x => x) (pow_N 1 Zmult).
+Proof.
+ constructor.
+ constructor ; intros ; try reflexivity.
+ apply Zeqb_ok ; auto.
+ constructor.
+ reflexivity.
+ intros x y.
+ apply Zeq_bool_neq ; auto.
+ apply Zle_bool_imp_le.
+Qed.
+
+
+(*Definition Zeval_expr := eval_pexpr 0 Zplus Zmult Zminus Zopp (fun x => x) (fun x => Z_of_N x) (Zpower).*)
+
+Fixpoint Zeval_expr (env: PolEnv Z) (e: PExpr Z) : Z :=
+ match e with
+ | PEc c => c
+ | PEX j => env j
+ | PEadd pe1 pe2 => (Zeval_expr env pe1) + (Zeval_expr env pe2)
+ | PEsub pe1 pe2 => (Zeval_expr env pe1) - (Zeval_expr env pe2)
+ | PEmul pe1 pe2 => (Zeval_expr env pe1) * (Zeval_expr env pe2)
+ | PEopp pe1 => - (Zeval_expr env pe1)
+ | PEpow pe1 n => Zpower (Zeval_expr env pe1) (Z_of_N n)
+ end.
+
+Lemma Zeval_expr_simpl : forall env e,
+ Zeval_expr env e =
+ match e with
+ | PEc c => c
+ | PEX j => env j
+ | PEadd pe1 pe2 => (Zeval_expr env pe1) + (Zeval_expr env pe2)
+ | PEsub pe1 pe2 => (Zeval_expr env pe1) - (Zeval_expr env pe2)
+ | PEmul pe1 pe2 => (Zeval_expr env pe1) * (Zeval_expr env pe2)
+ | PEopp pe1 => - (Zeval_expr env pe1)
+ | PEpow pe1 n => Zpower (Zeval_expr env pe1) (Z_of_N n)
+ end.
+Proof.
+ destruct e ; reflexivity.
+Qed.
+
+
+Definition Zeval_expr' := eval_pexpr Zplus Zmult Zminus Zopp (fun x => x) (fun x => x) (pow_N 1 Zmult).
+
+Lemma ZNpower : forall r n, r ^ Z_of_N n = pow_N 1 Zmult r n.
+Proof.
+ destruct n.
+ reflexivity.
+ simpl.
+ unfold Zpower_pos.
+ replace (pow_pos Zmult r p) with (1 * (pow_pos Zmult r p)) by ring.
+ generalize 1.
+ induction p; simpl ; intros ; repeat rewrite IHp ; ring.
+Qed.
+
+
+
+Lemma Zeval_expr_compat : forall env e, Zeval_expr env e = Zeval_expr' env e.
+Proof.
+ induction e ; simpl ; subst ; try congruence.
+ rewrite IHe.
+ apply ZNpower.
+Qed.
+
+Definition Zeval_op2 (o : Op2) : Z -> Z -> Prop :=
+match o with
+| OpEq => @eq Z
+| OpNEq => fun x y => ~ x = y
+| OpLe => Zle
+| OpGe => Zge
+| OpLt => Zlt
+| OpGt => Zgt
+end.
+
+Definition Zeval_formula (e: PolEnv Z) (ff : Formula Z) :=
+ let (lhs,o,rhs) := ff in Zeval_op2 o (Zeval_expr e lhs) (Zeval_expr e rhs).
+
+Definition Zeval_formula' :=
+ eval_formula Zplus Zmult Zminus Zopp (@eq Z) Zle Zlt (fun x => x) (fun x => x) (pow_N 1 Zmult).
+
+Lemma Zeval_formula_compat : forall env f, Zeval_formula env f <-> Zeval_formula' env f.
+Proof.
+ intros.
+ unfold Zeval_formula.
+ destruct f.
+ repeat rewrite Zeval_expr_compat.
+ unfold Zeval_formula'.
+ unfold Zeval_expr'.
+ split ; destruct Fop ; simpl; auto with zarith.
+Qed.
+
+
+
+Definition Zeval_nformula :=
+ eval_nformula 0 Zplus Zmult Zminus Zopp (@eq Z) Zle Zlt (fun x => x) (fun x => x) (pow_N 1 Zmult).
+
+Definition Zeval_op1 (o : Op1) : Z -> Prop :=
+match o with
+| Equal => fun x : Z => x = 0
+| NonEqual => fun x : Z => x <> 0
+| Strict => fun x : Z => 0 < x
+| NonStrict => fun x : Z => 0 <= x
+end.
+
+Lemma Zeval_nformula_simpl : forall env f, Zeval_nformula env f = (let (p, op) := f in Zeval_op1 op (Zeval_expr env p)).
+Proof.
+ intros.
+ destruct f.
+ rewrite Zeval_expr_compat.
+ reflexivity.
+Qed.
+
+Lemma Zeval_nformula_dec : forall env d, (Zeval_nformula env d) \/ ~ (Zeval_nformula env d).
+Proof.
+ exact (fun env d =>eval_nformula_dec Zsor (fun x => x) (fun x => x) (pow_N 1%Z Zmult) env d).
+Qed.
+
+Definition ZWitness := ConeMember Z.
+
+Definition ZWeakChecker := check_normalised_formulas 0 1 Zplus Zmult Zminus Zopp Zeq_bool Zle_bool.
+
+Lemma ZWeakChecker_sound : forall (l : list (NFormula Z)) (cm : ZWitness),
+ ZWeakChecker l cm = true ->
+ forall env, make_impl (Zeval_nformula env) l False.
+Proof.
+ intros l cm H.
+ intro.
+ unfold Zeval_nformula.
+ apply (checker_nf_sound Zsor ZSORaddon l cm).
+ unfold ZWeakChecker in H.
+ exact H.
+Qed.
+
+Definition xnormalise (t:Formula Z) : list (NFormula Z) :=
+ let (lhs,o,rhs) := t in
+ match o with
+ | OpEq =>
+ ((PEsub lhs (PEadd rhs (PEc 1))),NonStrict)::((PEsub rhs (PEadd lhs (PEc 1))),NonStrict)::nil
+ | OpNEq => (PEsub lhs rhs,Equal) :: nil
+ | OpGt => (PEsub rhs lhs,NonStrict) :: nil
+ | OpLt => (PEsub lhs rhs,NonStrict) :: nil
+ | OpGe => (PEsub rhs (PEadd lhs (PEc 1)),NonStrict) :: nil
+ | OpLe => (PEsub lhs (PEadd rhs (PEc 1)),NonStrict) :: nil
+ end.
+
+Require Import Tauto.
+
+Definition normalise (t:Formula Z) : cnf (NFormula Z) :=
+ List.map (fun x => x::nil) (xnormalise t).
+
+
+Lemma normalise_correct : forall env t, eval_cnf (Zeval_nformula env) (normalise t) <-> Zeval_formula env t.
+Proof.
+ unfold normalise, xnormalise ; simpl ; intros env t.
+ rewrite Zeval_formula_compat.
+ unfold eval_cnf.
+ destruct t as [lhs o rhs]; case_eq o ; simpl;
+ generalize ( eval_pexpr Zplus Zmult Zminus Zopp (fun x : Z => x)
+ (fun x : BinNat.N => x) (pow_N 1 Zmult) env lhs);
+ generalize (eval_pexpr Zplus Zmult Zminus Zopp (fun x : Z => x)
+ (fun x : BinNat.N => x) (pow_N 1 Zmult) env rhs) ; intros z1 z2 ; intros ; subst;
+ intuition (auto with zarith).
+Qed.
+
+Definition xnegate (t:RingMicromega.Formula Z) : list (NFormula Z) :=
+ let (lhs,o,rhs) := t in
+ match o with
+ | OpEq => (PEsub lhs rhs,Equal) :: nil
+ | OpNEq => ((PEsub lhs (PEadd rhs (PEc 1))),NonStrict)::((PEsub rhs (PEadd lhs (PEc 1))),NonStrict)::nil
+ | OpGt => (PEsub lhs (PEadd rhs (PEc 1)),NonStrict) :: nil
+ | OpLt => (PEsub rhs (PEadd lhs (PEc 1)),NonStrict) :: nil
+ | OpGe => (PEsub lhs rhs,NonStrict) :: nil
+ | OpLe => (PEsub rhs lhs,NonStrict) :: nil
+ end.
+
+Definition negate (t:RingMicromega.Formula Z) : cnf (NFormula Z) :=
+ List.map (fun x => x::nil) (xnegate t).
+
+Lemma negate_correct : forall env t, eval_cnf (Zeval_nformula env) (negate t) <-> ~ Zeval_formula env t.
+Proof.
+ unfold negate, xnegate ; simpl ; intros env t.
+ rewrite Zeval_formula_compat.
+ unfold eval_cnf.
+ destruct t as [lhs o rhs]; case_eq o ; simpl ;
+ generalize ( eval_pexpr Zplus Zmult Zminus Zopp (fun x : Z => x)
+ (fun x : BinNat.N => x) (pow_N 1 Zmult) env lhs);
+ generalize (eval_pexpr Zplus Zmult Zminus Zopp (fun x : Z => x)
+ (fun x : BinNat.N => x) (pow_N 1 Zmult) env rhs) ; intros z1 z2 ; intros ;
+ intuition (auto with zarith).
+Qed.
+
+
+Definition ZweakTautoChecker (w: list ZWitness) (f : BFormula (Formula Z)) : bool :=
+ @tauto_checker (Formula Z) (NFormula Z) normalise negate ZWitness ZWeakChecker f w.
+
+(* To get a complete checker, the proof format has to be enriched *)
+
+Require Import Zdiv.
+Open Scope Z_scope.
+
+Definition ceiling (a b:Z) : Z :=
+ let (q,r) := Zdiv_eucl a b in
+ match r with
+ | Z0 => q
+ | _ => q + 1
+ end.
+
+Lemma narrow_interval_lower_bound : forall a b x, a > 0 -> a * x >= b -> x >= ceiling b a.
+Proof.
+ unfold ceiling.
+ intros.
+ generalize (Z_div_mod b a H).
+ destruct (Zdiv_eucl b a).
+ intros.
+ destruct H1.
+ destruct H2.
+ subst.
+ destruct (Ztrichotomy z0 0) as [ HH1 | [HH2 | HH3]]; destruct z0 ; try auto with zarith ; try discriminate.
+ assert (HH :x >= z \/ x < z) by (destruct (Ztrichotomy x z) ; auto with zarith).
+ destruct HH ;auto.
+ generalize (Zmult_lt_compat_l _ _ _ H3 H1).
+ auto with zarith.
+ clear H2.
+ assert (HH :x >= z +1 \/ x <= z) by (destruct (Ztrichotomy x z) ; intuition (auto with zarith)).
+ destruct HH ;auto.
+ assert (0 < a) by auto with zarith.
+ generalize (Zmult_lt_0_le_compat_r _ _ _ H2 H1).
+ intros.
+ rewrite Zmult_comm in H4.
+ rewrite (Zmult_comm z) in H4.
+ auto with zarith.
+Qed.
+
+Lemma narrow_interval_upper_bound : forall a b x, a > 0 -> a * x <= b -> x <= Zdiv b a.
+Proof.
+ unfold Zdiv.
+ intros.
+ generalize (Z_div_mod b a H).
+ destruct (Zdiv_eucl b a).
+ intros.
+ destruct H1.
+ destruct H2.
+ subst.
+ assert (HH :x <= z \/ z <= x -1) by (destruct (Ztrichotomy x z) ; intuition (auto with zarith)).
+ destruct HH ;auto.
+ assert (0 < a) by auto with zarith.
+ generalize (Zmult_lt_0_le_compat_r _ _ _ H4 H1).
+ intros.
+ ring_simplify in H5.
+ rewrite Zmult_comm in H5.
+ auto with zarith.
+Qed.
+
+
+(* In this case, a certificate is made of a pair of inequations, in 1 variable,
+ that do not have an integer solution.
+ => modify the fourier elimination
+ *)
+Require Import QArith.
+
+
+Inductive ProofTerm : Type :=
+| RatProof : ZWitness -> ProofTerm
+| CutProof : PExprC Z -> Q -> ZWitness -> ProofTerm -> ProofTerm
+| EnumProof : Q -> PExprC Z -> Q -> ZWitness -> ZWitness -> list ProofTerm -> ProofTerm.
+
+(* n/d <= x -> d*x - n >= 0 *)
+
+Definition makeLb (v:PExpr Z) (q:Q) : NFormula Z :=
+ let (n,d) := q in (PEsub (PEmul (PEc (Zpos d)) v) (PEc n),NonStrict).
+
+(* x <= n/d -> d * x <= d *)
+Definition makeUb (v:PExpr Z) (q:Q) : NFormula Z :=
+ let (n,d) := q in
+ (PEsub (PEc n) (PEmul (PEc (Zpos d)) v), NonStrict).
+
+Definition qceiling (q:Q) : Z :=
+ let (n,d) := q in ceiling n (Zpos d).
+
+Definition qfloor (q:Q) : Z :=
+ let (n,d) := q in Zdiv n (Zpos d).
+
+Definition makeLbCut (v:PExprC Z) (q:Q) : NFormula Z :=
+ (PEsub v (PEc (qceiling q)), NonStrict).
+
+Definition neg_nformula (f : NFormula Z) :=
+ let (e,o) := f in
+ (PEopp (PEadd e (PEc 1%Z)), o).
+
+Lemma neg_nformula_sound : forall env f, snd f = NonStrict ->( ~ (Zeval_nformula env (neg_nformula f)) <-> Zeval_nformula env f).
+Proof.
+ unfold neg_nformula.
+ destruct f.
+ simpl.
+ intros ; subst ; simpl in *.
+ split; auto with zarith.
+Qed.
+
+
+Definition cutChecker (l:list (NFormula Z)) (e: PExpr Z) (lb:Q) (pf : ZWitness) : option (NFormula Z) :=
+ let (lb,lc) := (makeLb e lb,makeLbCut e lb) in
+ if ZWeakChecker (neg_nformula lb::l) pf then Some lc else None.
+
+
+Fixpoint ZChecker (l:list (NFormula Z)) (pf : ProofTerm) {struct pf} : bool :=
+ match pf with
+ | RatProof pf => ZWeakChecker l pf
+ | CutProof e q pf rst =>
+ match cutChecker l e q pf with
+ | None => false
+ | Some c => ZChecker (c::l) rst
+ end
+ | EnumProof lb e ub pf1 pf2 rst =>
+ match cutChecker l e lb pf1 , cutChecker l (PEopp e) (Qopp ub) pf2 with
+ | None , _ | _ , None => false
+ | Some _ , Some _ => let (lb',ub') := (qceiling lb, Zopp (qceiling (- ub))) in
+ (fix label (pfs:list ProofTerm) :=
+ fun lb ub =>
+ match pfs with
+ | nil => if Z_gt_dec lb ub then true else false
+ | pf::rsr => andb (ZChecker ((PEsub e (PEc lb), Equal) :: l) pf) (label rsr (Zplus lb 1%Z) ub)
+ end)
+ rst lb' ub'
+ end
+ end.
+
+
+Lemma ZChecker_simpl : forall (pf : ProofTerm) (l:list (NFormula Z)),
+ ZChecker l pf =
+ match pf with
+ | RatProof pf => ZWeakChecker l pf
+ | CutProof e q pf rst =>
+ match cutChecker l e q pf with
+ | None => false
+ | Some c => ZChecker (c::l) rst
+ end
+ | EnumProof lb e ub pf1 pf2 rst =>
+ match cutChecker l e lb pf1 , cutChecker l (PEopp e) (Qopp ub) pf2 with
+ | None , _ | _ , None => false
+ | Some _ , Some _ => let (lb',ub') := (qceiling lb, Zopp (qceiling (- ub))) in
+ (fix label (pfs:list ProofTerm) :=
+ fun lb ub =>
+ match pfs with
+ | nil => if Z_gt_dec lb ub then true else false
+ | pf::rsr => andb (ZChecker ((PEsub e (PEc lb), Equal) :: l) pf) (label rsr (Zplus lb 1%Z) ub)
+ end)
+ rst lb' ub'
+ end
+ end.
+Proof.
+ destruct pf ; reflexivity.
+Qed.
+
+(*
+Fixpoint depth (n:nat) : ProofTerm -> option nat :=
+ match n with
+ | O => fun pf => None
+ | S n =>
+ fun pf =>
+ match pf with
+ | RatProof _ => Some O
+ | CutProof _ _ _ p => option_map S (depth n p)
+ | EnumProof _ _ _ _ _ l =>
+ let f := fun pf x =>
+ match x , depth n pf with
+ | None , _ | _ , None => None
+ | Some n1 , Some n2 => Some (Max.max n1 n2)
+ end in
+ List.fold_right f (Some O) l
+ end
+ end.
+*)
+Fixpoint bdepth (pf : ProofTerm) : nat :=
+ match pf with
+ | RatProof _ => O
+ | CutProof _ _ _ p => S (bdepth p)
+ | EnumProof _ _ _ _ _ l => S (List.fold_right (fun pf x => Max.max (bdepth pf) x) O l)
+ end.
+
+Require Import Wf_nat.
+
+Lemma in_bdepth : forall l a b p c c0 y, In y l -> ltof ProofTerm bdepth y (EnumProof a b p c c0 l).
+Proof.
+ induction l.
+ simpl.
+ tauto.
+ simpl.
+ intros.
+ destruct H.
+ subst.
+ unfold ltof.
+ simpl.
+ generalize ( (fold_right
+ (fun (pf : ProofTerm) (x : nat) => Max.max (bdepth pf) x) 0%nat l)).
+ intros.
+ generalize (bdepth y) ; intros.
+ generalize (Max.max_l n0 n) (Max.max_r n0 n).
+ omega.
+ generalize (IHl a0 b p c c0 y H).
+ unfold ltof.
+ simpl.
+ generalize ( (fold_right (fun (pf : ProofTerm) (x : nat) => Max.max (bdepth pf) x) 0%nat
+ l)).
+ intros.
+ generalize (Max.max_l (bdepth a) n) (Max.max_r (bdepth a) n).
+ omega.
+Qed.
+
+Lemma lb_lbcut : forall env e q, Zeval_nformula env (makeLb e q) -> Zeval_nformula env (makeLbCut e q).
+Proof.
+ unfold makeLb, makeLbCut.
+ destruct q.
+ rewrite Zeval_nformula_simpl.
+ rewrite Zeval_nformula_simpl.
+ unfold Zeval_op1.
+ rewrite Zeval_expr_simpl.
+ rewrite Zeval_expr_simpl.
+ rewrite Zeval_expr_simpl.
+ intro.
+ rewrite Zeval_expr_simpl.
+ revert H.
+ generalize (Zeval_expr env e).
+ rewrite Zeval_expr_simpl.
+ rewrite Zeval_expr_simpl.
+ unfold qceiling.
+ intros.
+ assert ( z >= ceiling Qnum (' Qden))%Z.
+ apply narrow_interval_lower_bound.
+ compute.
+ reflexivity.
+ destruct z ; auto with zarith.
+ auto with zarith.
+Qed.
+
+Lemma cutChecker_sound : forall e lb pf l res, cutChecker l e lb pf = Some res ->
+ forall env, make_impl (Zeval_nformula env) l (Zeval_nformula env res).
+Proof.
+ unfold cutChecker.
+ intros.
+ revert H.
+ case_eq (ZWeakChecker (neg_nformula (makeLb e lb) :: l) pf); intros ; [idtac | discriminate].
+ generalize (ZWeakChecker_sound _ _ H env).
+ intros.
+ inversion H0 ; subst ; clear H0.
+ apply -> make_conj_impl.
+ simpl in H1.
+ rewrite <- make_conj_impl in H1.
+ intros.
+ apply -> neg_nformula_sound ; auto.
+ red ; intros.
+ apply H1 ; auto.
+ clear H H1 H0.
+ generalize (lb_lbcut env e lb).
+ intros.
+ destruct (Zeval_nformula_dec env ((neg_nformula (makeLb e lb)))).
+ auto.
+ rewrite -> neg_nformula_sound in H0.
+ assert (HH := H H0).
+ rewrite <- neg_nformula_sound in HH.
+ tauto.
+ reflexivity.
+ unfold makeLb.
+ destruct lb.
+ reflexivity.
+Qed.
+
+
+Lemma cutChecker_sound_bound : forall e lb pf l res, cutChecker l e lb pf = Some res ->
+ forall env, make_conj (Zeval_nformula env) l -> (Zeval_expr env e >= qceiling lb)%Z.
+Proof.
+ intros.
+ generalize (cutChecker_sound _ _ _ _ _ H env).
+ intros.
+ rewrite <- (make_conj_impl) in H1.
+ generalize (H1 H0).
+ unfold cutChecker in H.
+ destruct (ZWeakChecker (neg_nformula (makeLb e lb) :: l) pf).
+ unfold makeLbCut in H.
+ inversion H ; subst.
+ clear H.
+ simpl.
+ rewrite Zeval_expr_compat.
+ unfold Zeval_expr'.
+ auto with zarith.
+ discriminate.
+Qed.
+
+
+Lemma ZChecker_sound : forall w l, ZChecker l w = true -> forall env, make_impl (Zeval_nformula env) l False.
+Proof.
+ induction w using (well_founded_ind (well_founded_ltof _ bdepth)).
+ destruct w.
+ (* RatProof *)
+ simpl.
+ intros.
+ eapply ZWeakChecker_sound.
+ apply H0.
+ (* CutProof *)
+ simpl.
+ intro.
+ case_eq (cutChecker l p q z) ; intros.
+ generalize (cutChecker_sound _ _ _ _ _ H0 env).
+ intro.
+ assert (make_impl (Zeval_nformula env) (n::l) False).
+ eapply (H w) ; auto.
+ unfold ltof.
+ simpl.
+ auto with arith.
+ simpl in H3.
+ rewrite <- make_conj_impl in H2.
+ rewrite <- make_conj_impl in H3.
+ rewrite <- make_conj_impl.
+ tauto.
+ discriminate.
+ (* EnumProof *)
+ intro.
+ rewrite ZChecker_simpl.
+ case_eq (cutChecker l0 p q z).
+ rename q into llb.
+ case_eq (cutChecker l0 (PEopp p) (- q0) z0).
+ intros.
+ rename q0 into uub.
+ (* get the bounds of the enum *)
+ rewrite <- make_conj_impl.
+ intro.
+ assert (qceiling llb <= Zeval_expr env p <= - qceiling ( - uub))%Z.
+ generalize (cutChecker_sound_bound _ _ _ _ _ H0 env H3).
+ generalize (cutChecker_sound_bound _ _ _ _ _ H1 env H3).
+ intros.
+ rewrite Zeval_expr_simpl in H5.
+ auto with zarith.
+ clear H0 H1.
+ revert H2 H3 H4.
+ generalize (qceiling llb) (- qceiling (- uub))%Z.
+ set (FF := (fix label (pfs : list ProofTerm) (lb ub : Z) {struct pfs} : bool :=
+ match pfs with
+ | nil => if Z_gt_dec lb ub then true else false
+ | pf :: rsr =>
+ (ZChecker ((PEsub p (PEc lb), Equal) :: l0) pf &&
+ label rsr (lb + 1)%Z ub)%bool
+ end)).
+ intros z1 z2.
+ intros.
+ assert (forall x, z1 <= x <= z2 -> exists pr,
+ (In pr l /\
+ ZChecker ((PEsub p (PEc x),Equal) :: l0) pr = true))%Z.
+ clear H.
+ revert H2.
+ clear H4.
+ revert z1 z2.
+ induction l;simpl ;intros.
+ destruct (Z_gt_dec z1 z2).
+ intros.
+ apply False_ind ; omega.
+ discriminate.
+ intros.
+ simpl in H2.
+ flatten_bool.
+ assert (HH:(x = z1 \/ z1 +1 <=x)%Z) by omega.
+ destruct HH.
+ subst.
+ exists a ; auto.
+ assert (z1 + 1 <= x <= z2)%Z by omega.
+ destruct (IHl _ _ H1 _ H4).
+ destruct H5.
+ exists x0 ; split;auto.
+ (*/asser *)
+ destruct (H0 _ H4) as [pr [Hin Hcheker]].
+ assert (make_impl (Zeval_nformula env) ((PEsub p (PEc (Zeval_expr env p)),Equal) :: l0) False).
+ apply (H pr);auto.
+ apply in_bdepth ; auto.
+ rewrite <- make_conj_impl in H1.
+ apply H1.
+ rewrite make_conj_cons.
+ split ;auto.
+ rewrite Zeval_nformula_simpl;
+ unfold Zeval_op1;
+ rewrite Zeval_expr_simpl.
+ generalize (Zeval_expr env p).
+ intros.
+ rewrite Zeval_expr_simpl.
+ auto with zarith.
+ intros ; discriminate.
+ intros ; discriminate.
+Qed.
+
+Definition ZTautoChecker (f : BFormula (Formula Z)) (w: list ProofTerm): bool :=
+ @tauto_checker (Formula Z) (NFormula Z) normalise negate ProofTerm ZChecker f w.
+
+Lemma ZTautoChecker_sound : forall f w, ZTautoChecker f w = true -> forall env, eval_f (Zeval_formula env) f.
+Proof.
+ intros f w.
+ unfold ZTautoChecker.
+ apply (tauto_checker_sound Zeval_formula Zeval_nformula).
+ apply Zeval_nformula_dec.
+ intros env t.
+ rewrite normalise_correct ; auto.
+ intros env t.
+ rewrite negate_correct ; auto.
+ intros t w0.
+ apply ZChecker_sound.
+Qed.
+
+
+Open Scope Z_scope.
+
+
+Fixpoint map_cone (f: nat -> nat) (e:ZWitness) : ZWitness :=
+ match e with
+ | S_In n => S_In _ (f n)
+ | S_Ideal e cm => S_Ideal e (map_cone f cm)
+ | S_Square _ => e
+ | S_Monoid l => S_Monoid _ (List.map f l)
+ | S_Mult cm1 cm2 => S_Mult (map_cone f cm1) (map_cone f cm2)
+ | S_Add cm1 cm2 => S_Add (map_cone f cm1) (map_cone f cm2)
+ | _ => e
+ end.
+
+Fixpoint indexes (e:ZWitness) : list nat :=
+ match e with
+ | S_In n => n::nil
+ | S_Ideal e cm => indexes cm
+ | S_Square e => nil
+ | S_Monoid l => l
+ | S_Mult cm1 cm2 => (indexes cm1)++ (indexes cm2)
+ | S_Add cm1 cm2 => (indexes cm1)++ (indexes cm2)
+ | _ => nil
+ end.
+
+(** To ease bindings from ml code **)
+(*Definition varmap := Quote.varmap.*)
+Definition make_impl := Refl.make_impl.
+Definition make_conj := Refl.make_conj.
+
+Require VarMap.
+
+(*Definition varmap_type := VarMap.t Z. *)
+Definition env := PolEnv Z.
+Definition node := @VarMap.Node Z.
+Definition empty := @VarMap.Empty Z.
+Definition leaf := @VarMap.Leaf Z.
+
+Definition coneMember := ZWitness.
+
+Definition eval := Zeval_formula.
+
+Definition prod_pos_nat := prod positive nat.
+
+Require Import Int.
+
+
+Definition n_of_Z (z:Z) : BinNat.N :=
+ match z with
+ | Z0 => N0
+ | Zpos p => Npos p
+ | Zneg p => N0
+ end.
+
+
+
diff --git a/contrib/micromega/certificate.ml b/contrib/micromega/certificate.ml
new file mode 100644
index 000000000..88e882e61
--- /dev/null
+++ b/contrib/micromega/certificate.ml
@@ -0,0 +1,618 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+(* We take as input a list of polynomials [p1...pn] and return an unfeasibility
+ certificate polynomial. *)
+
+(*open Micromega.Polynomial*)
+open Big_int
+open Num
+
+module Mc = Micromega
+module Ml2C = Mutils.CamlToCoq
+module C2Ml = Mutils.CoqToCaml
+
+let (<+>) = add_num
+let (<->) = minus_num
+let (<*>) = mult_num
+
+type var = Mc.positive
+
+module Monomial :
+sig
+ type t
+ val const : t
+ val var : var -> t
+ val find : var -> t -> int
+ val mult : var -> t -> t
+ val prod : t -> t -> t
+ val compare : t -> t -> int
+ val pp : out_channel -> t -> unit
+ val fold : (var -> int -> 'a -> 'a) -> t -> 'a -> 'a
+end
+ =
+struct
+ (* A monomial is represented by a multiset of variables *)
+ module Map = Map.Make(struct type t = var let compare = Pervasives.compare end)
+ open Map
+
+ type t = int Map.t
+
+ (* The monomial that corresponds to a constant *)
+ let const = Map.empty
+
+ (* The monomial 'x' *)
+ let var x = Map.add x 1 Map.empty
+
+ (* Get the degre of a variable in a monomial *)
+ let find x m = try find x m with Not_found -> 0
+
+ (* Multiply a monomial by a variable *)
+ let mult x m = add x ( (find x m) + 1) m
+
+ (* Product of monomials *)
+ let prod m1 m2 = Map.fold (fun k d m -> add k ((find k m) + d) m) m1 m2
+
+ (* Total ordering of monomials *)
+ let compare m1 m2 = Map.compare Pervasives.compare m1 m2
+
+ let pp o m = Map.iter (fun k v ->
+ if v = 1 then Printf.fprintf o "x%i." (C2Ml.index k)
+ else Printf.fprintf o "x%i^%i." (C2Ml.index k) v) m
+
+ let fold = fold
+
+end
+
+
+module Poly :
+ (* A polynomial is a map of monomials *)
+ (*
+ This is probably a naive implementation
+ (expected to be fast enough - Coq is probably the bottleneck)
+ *The new ring contribution is using a sparse Horner representation.
+ *)
+sig
+ type t
+ val get : Monomial.t -> t -> num
+ val variable : var -> t
+ val add : Monomial.t -> num -> t -> t
+ val constant : num -> t
+ val mult : Monomial.t -> num -> t -> t
+ val product : t -> t -> t
+ val addition : t -> t -> t
+ val uminus : t -> t
+ val fold : (Monomial.t -> num -> 'a -> 'a) -> t -> 'a -> 'a
+ val pp : out_channel -> t -> unit
+ val compare : t -> t -> int
+end =
+struct
+ (*normalisation bug : 0*x ... *)
+ module P = Map.Make(Monomial)
+ open P
+
+ type t = num P.t
+
+ let pp o p = P.iter (fun k v ->
+ if compare_num v (Int 0) <> 0
+ then
+ if Monomial.compare Monomial.const k = 0
+ then Printf.fprintf o "%s " (string_of_num v)
+ else Printf.fprintf o "%s*%a " (string_of_num v) Monomial.pp k) p
+
+ (* Get the coefficient of monomial mn *)
+ let get : Monomial.t -> t -> num =
+ fun mn p -> try find mn p with Not_found -> (Int 0)
+
+
+ (* The polynomial 1.x *)
+ let variable : var -> t =
+ fun x -> add (Monomial.var x) (Int 1) empty
+
+ (*The constant polynomial *)
+ let constant : num -> t =
+ fun c -> add (Monomial.const) c empty
+
+ (* The addition of a monomial *)
+
+ let add : Monomial.t -> num -> t -> t =
+ fun mn v p ->
+ let vl = (get mn p) <+> v in
+ add mn vl p
+
+
+ (** Design choice: empty is not a polynomial
+ I do not remember why ....
+ **)
+
+ (* The product by a monomial *)
+ let mult : Monomial.t -> num -> t -> t =
+ fun mn v p ->
+ fold (fun mn' v' res -> P.add (Monomial.prod mn mn') (v<*>v') res) p empty
+
+
+ let addition : t -> t -> t =
+ fun p1 p2 -> fold (fun mn v p -> add mn v p) p1 p2
+
+
+ let product : t -> t -> t =
+ fun p1 p2 ->
+ fold (fun mn v res -> addition (mult mn v p2) res ) p1 empty
+
+
+ let uminus : t -> t =
+ fun p -> map (fun v -> minus_num v) p
+
+ let fold = P.fold
+
+ let compare = compare compare_num
+end
+
+open Mutils
+type 'a number_spec = {
+ bigint_to_number : big_int -> 'a;
+ number_to_num : 'a -> num;
+ zero : 'a;
+ unit : 'a;
+ mult : 'a -> 'a -> 'a;
+ eqb : 'a -> 'a -> Mc.bool
+}
+
+let z_spec = {
+ bigint_to_number = Ml2C.bigint ;
+ number_to_num = (fun x -> Big_int (C2Ml.z_big_int x));
+ zero = Mc.Z0;
+ unit = Mc.Zpos Mc.XH;
+ mult = Mc.zmult;
+ eqb = Mc.zeq_bool
+}
+
+
+let q_spec = {
+ bigint_to_number = (fun x -> {Mc.qnum = Ml2C.bigint x; Mc.qden = Mc.XH});
+ number_to_num = C2Ml.q_to_num;
+ zero = {Mc.qnum = Mc.Z0;Mc.qden = Mc.XH};
+ unit = {Mc.qnum = (Mc.Zpos Mc.XH) ; Mc.qden = Mc.XH};
+ mult = Mc.qmult;
+ eqb = Mc.qeq_bool
+}
+
+let r_spec = z_spec
+
+
+
+
+let dev_form n_spec p =
+ let rec dev_form p =
+ match p with
+ | Mc.PEc z -> Poly.constant (n_spec.number_to_num z)
+ | Mc.PEX v -> Poly.variable v
+ | Mc.PEmul(p1,p2) ->
+ let p1 = dev_form p1 in
+ let p2 = dev_form p2 in
+ Poly.product p1 p2
+ | Mc.PEadd(p1,p2) -> Poly.addition (dev_form p1) (dev_form p2)
+ | Mc.PEopp p -> Poly.uminus (dev_form p)
+ | Mc.PEsub(p1,p2) -> Poly.addition (dev_form p1) (Poly.uminus (dev_form p2))
+ | Mc.PEpow(p,n) ->
+ let p = dev_form p in
+ let n = C2Ml.n n in
+ let rec pow n =
+ if n = 0
+ then Poly.constant (n_spec.number_to_num n_spec.unit)
+ else Poly.product p (pow (n-1)) in
+ pow n in
+ dev_form p
+
+
+let monomial_to_polynomial mn =
+ Monomial.fold
+ (fun v i acc ->
+ let mn = if i = 1 then Mc.PEX v else Mc.PEpow (Mc.PEX v ,Ml2C.n i) in
+ if acc = Mc.PEc (Mc.Zpos Mc.XH)
+ then mn
+ else Mc.PEmul(mn,acc))
+ mn
+ (Mc.PEc (Mc.Zpos Mc.XH))
+
+let list_to_polynomial vars l =
+ assert (List.for_all (fun x -> ceiling_num x =/ x) l);
+ let var x = monomial_to_polynomial (List.nth vars x) in
+ let rec xtopoly p i = function
+ | [] -> p
+ | c::l -> if c =/ (Int 0) then xtopoly p (i+1) l
+ else let c = Mc.PEc (Ml2C.bigint (numerator c)) in
+ let mn =
+ if c = Mc.PEc (Mc.Zpos Mc.XH)
+ then var i
+ else Mc.PEmul (c,var i) in
+ let p' = if p = Mc.PEc Mc.Z0 then mn else
+ Mc.PEadd (mn, p) in
+ xtopoly p' (i+1) l in
+
+ xtopoly (Mc.PEc Mc.Z0) 0 l
+
+let rec fixpoint f x =
+ let y' = f x in
+ if y' = x then y'
+ else fixpoint f y'
+
+
+
+
+
+
+
+
+let rec_simpl_cone n_spec e =
+ let simpl_cone =
+ Mc.simpl_cone n_spec.zero n_spec.unit n_spec.mult n_spec.eqb in
+
+ let rec rec_simpl_cone = function
+ | Mc.S_Mult(t1, t2) ->
+ simpl_cone (Mc.S_Mult (rec_simpl_cone t1, rec_simpl_cone t2))
+ | Mc.S_Add(t1,t2) ->
+ simpl_cone (Mc.S_Add (rec_simpl_cone t1, rec_simpl_cone t2))
+ | x -> simpl_cone x in
+ rec_simpl_cone e
+
+
+let simplify_cone n_spec c = fixpoint (rec_simpl_cone n_spec) c
+
+type cone_prod =
+ Const of cone
+ | Ideal of cone *cone
+ | Mult of cone * cone
+ | Other of cone
+and cone = Mc.zWitness
+
+
+
+let factorise_linear_cone c =
+
+ let rec cone_list c l =
+ match c with
+ | Mc.S_Add (x,r) -> cone_list r (x::l)
+ | _ -> c :: l in
+
+ let factorise c1 c2 =
+ match c1 , c2 with
+ | Mc.S_Ideal(x,y) , Mc.S_Ideal(x',y') ->
+ if x = x' then Some (Mc.S_Ideal(x, Mc.S_Add(y,y'))) else None
+ | Mc.S_Mult(x,y) , Mc.S_Mult(x',y') ->
+ if x = x' then Some (Mc.S_Mult(x, Mc.S_Add(y,y'))) else None
+ | _ -> None in
+
+ let rec rebuild_cone l pending =
+ match l with
+ | [] -> (match pending with
+ | None -> Mc.S_Z
+ | Some p -> p
+ )
+ | e::l ->
+ (match pending with
+ | None -> rebuild_cone l (Some e)
+ | Some p -> (match factorise p e with
+ | None -> Mc.S_Add(p, rebuild_cone l (Some e))
+ | Some f -> rebuild_cone l (Some f) )
+ ) in
+
+ (rebuild_cone (List.sort Pervasives.compare (cone_list c [])) None)
+
+
+
+(* The binding with Fourier might be a bit obsolete
+ -- how does it handle equalities ? *)
+
+(* Certificates are elements of the cone such that P = 0 *)
+
+(* To begin with, we search for certificates of the form:
+ a1.p1 + ... an.pn + b1.q1 +... + bn.qn + c = 0
+ where pi >= 0 qi > 0
+ ai >= 0
+ bi >= 0
+ Sum bi + c >= 1
+ This is a linear problem: each monomial is considered as a variable.
+ Hence, we can use fourier.
+
+ The variable c is at index 0
+*)
+
+open Mfourier
+ (*module Fourier = Fourier(Vector.VList)(SysSet(Vector.VList))*)
+ (*module Fourier = Fourier(Vector.VSparse)(SysSetAlt(Vector.VSparse))*)
+module Fourier = Mfourier.Fourier(Vector.VSparse)(*(SysSetAlt(Vector.VMap))*)
+
+module Vect = Fourier.Vect
+open Fourier.Cstr
+
+(* fold_left followed by a rev ! *)
+
+let constrain_monomial mn l =
+ let coeffs = List.fold_left (fun acc p -> (Poly.get mn p)::acc) [] l in
+ if mn = Monomial.const
+ then
+ { coeffs = Vect.from_list ((Big_int unit_big_int):: (List.rev coeffs)) ;
+ op = Eq ;
+ cst = Big_int zero_big_int }
+ else
+ { coeffs = Vect.from_list ((Big_int zero_big_int):: (List.rev coeffs)) ;
+ op = Eq ;
+ cst = Big_int zero_big_int }
+
+
+let positivity l =
+ let rec xpositivity i l =
+ match l with
+ | [] -> []
+ | (_,Mc.Equal)::l -> xpositivity (i+1) l
+ | (_,_)::l ->
+ {coeffs = Vect.update (i+1) (fun _ -> Int 1) Vect.null ;
+ op = Ge ;
+ cst = Int 0 } :: (xpositivity (i+1) l)
+ in
+ xpositivity 0 l
+
+
+let string_of_op = function
+ | Mc.Strict -> "> 0"
+ | Mc.NonStrict -> ">= 0"
+ | Mc.Equal -> "= 0"
+ | Mc.NonEqual -> "<> 0"
+
+
+
+(* If the certificate includes at least one strict inequality,
+ the obtained polynomial can also be 0 *)
+let build_linear_system l =
+
+ (* Gather the monomials: HINT add up of the polynomials *)
+ let l' = List.map fst l in
+ let monomials =
+ List.fold_left (fun acc p -> Poly.addition p acc) (Poly.constant (Int 0)) l'
+ in (* For each monomial, compute a constraint *)
+ let s0 =
+ Poly.fold (fun mn _ res -> (constrain_monomial mn l')::res) monomials [] in
+ (* I need at least something strictly positive *)
+ let strict = {
+ coeffs = Vect.from_list ((Big_int unit_big_int)::
+ (List.map (fun (x,y) ->
+ match y with Mc.Strict ->
+ Big_int unit_big_int
+ | _ -> Big_int zero_big_int) l));
+ op = Ge ; cst = Big_int unit_big_int } in
+ (* Add the positivity constraint *)
+ {coeffs = Vect.from_list ([Big_int unit_big_int]) ;
+ op = Ge ;
+ cst = Big_int zero_big_int}::(strict::(positivity l)@s0)
+
+
+let big_int_to_z = Ml2C.bigint
+
+(* For Q, this is a pity that the certificate has been scaled
+ -- at a lower layer, certificates are using nums... *)
+let make_certificate n_spec cert li =
+ let bint_to_cst = n_spec.bigint_to_number in
+ match cert with
+ | [] -> None
+ | e::cert' ->
+ let cst = match compare_big_int e zero_big_int with
+ | 0 -> Mc.S_Z
+ | 1 -> Mc.S_Pos (bint_to_cst e)
+ | _ -> failwith "positivity error"
+ in
+ let rec scalar_product cert l =
+ match cert with
+ | [] -> Mc.S_Z
+ | c::cert -> match l with
+ | [] -> failwith "make_certificate(1)"
+ | i::l ->
+ let r = scalar_product cert l in
+ match compare_big_int c zero_big_int with
+ | -1 -> Mc.S_Add (
+ Mc.S_Ideal (Mc.PEc ( bint_to_cst c), Mc.S_In (Ml2C.nat i)),
+ r)
+ | 0 -> r
+ | _ -> Mc.S_Add (
+ Mc.S_Mult (Mc.S_Pos (bint_to_cst c), Mc.S_In (Ml2C.nat i)),
+ r) in
+
+ Some ((factorise_linear_cone
+ (simplify_cone n_spec (Mc.S_Add (cst, scalar_product cert' li)))))
+
+
+exception Found of Monomial.t
+
+let raw_certificate l =
+ let sys = build_linear_system l in
+ try
+ match Fourier.find_point sys with
+ | None -> None
+ | Some cert -> Some (rats_to_ints (Vect.to_list cert))
+ (* should not use rats_to_ints *)
+ with x ->
+ if debug
+ then (Printf.printf "raw certificate %s" (Printexc.to_string x);
+ flush stdout) ;
+ None
+
+
+let simple_linear_prover to_constant l =
+ let (lc,li) = List.split l in
+ match raw_certificate lc with
+ | None -> None (* No certificate *)
+ | Some cert -> make_certificate to_constant cert li
+
+
+
+let linear_prover n_spec l =
+ let li = List.combine l (interval 0 (List.length l -1)) in
+ let (l1,l') = List.partition
+ (fun (x,_) -> if snd' x = Mc.NonEqual then true else false) li in
+ let l' = List.map
+ (fun (c,i) -> let (Mc.Pair(x,y)) = c in
+ match y with
+ Mc.NonEqual -> failwith "cannot happen"
+ | y -> ((dev_form n_spec x, y),i)) l' in
+
+ simple_linear_prover n_spec l'
+
+
+let linear_prover n_spec l =
+ try linear_prover n_spec l with
+ x -> (print_string (Printexc.to_string x); None)
+
+(* zprover.... *)
+
+(* I need to gather the set of variables --->
+ Then go for fold
+ Once I have an interval, I need a certificate : 2 other fourier elims.
+ (I could probably get the certificate directly
+ as it is done in the fourier contrib.)
+*)
+
+let make_linear_system l =
+ let l' = List.map fst l in
+ let monomials = List.fold_left (fun acc p -> Poly.addition p acc)
+ (Poly.constant (Int 0)) l' in
+ let monomials = Poly.fold
+ (fun mn _ l -> if mn = Monomial.const then l else mn::l) monomials [] in
+ (List.map (fun (c,op) ->
+ {coeffs = Vect.from_list (List.map (fun mn -> (Poly.get mn c)) monomials) ;
+ op = op ;
+ cst = minus_num ( (Poly.get Monomial.const c))}) l
+ ,monomials)
+
+
+open Interval
+let pplus x y = Mc.PEadd(x,y)
+let pmult x y = Mc.PEmul(x,y)
+let pconst x = Mc.PEc x
+let popp x = Mc.PEopp x
+
+let debug = false
+
+(* keep track of enumerated vectors *)
+let rec mem p x l =
+ match l with [] -> false | e::l -> if p x e then true else mem p x l
+
+let rec remove_assoc p x l =
+ match l with [] -> [] | e::l -> if p x (fst e) then
+ remove_assoc p x l else e::(remove_assoc p x l)
+
+let eq x y = Vect.compare x y = 0
+
+(* Beurk... this code is a shame *)
+
+let rec zlinear_prover sys = xzlinear_prover [] sys
+
+and xzlinear_prover enum l : (Mc.proofTerm option) =
+ match linear_prover z_spec l with
+ | Some prf -> Some (Mc.RatProof prf)
+ | None ->
+ let ll = List.fold_right (fun (Mc.Pair(e,k)) r -> match k with
+ Mc.NonEqual -> r
+ | k -> (dev_form z_spec e ,
+ match k with
+ | Mc.Strict | Mc.NonStrict -> Ge
+ (* Loss of precision -- weakness of fourier*)
+ | Mc.Equal -> Eq
+ | Mc.NonEqual -> failwith "Cannot happen") :: r) l [] in
+
+ let (sys,var) = make_linear_system ll in
+ let res =
+ match Fourier.find_Q_interval sys with
+ | Some(i,x,j) -> if i =/ j
+ then Some(i,Vect.set x (Int 1) Vect.null,i) else None
+ | None -> None in
+ let res = match res with
+ | None ->
+ begin
+ let candidates = List.fold_right
+ (fun cstr acc ->
+ let gcd = Big_int (Vect.gcd cstr.coeffs) in
+ let vect = Vect.mul (Int 1 // gcd) cstr.coeffs in
+ if mem eq vect enum then acc
+ else ((vect,Fourier.optimise vect sys)::acc)) sys [] in
+ let candidates = List.fold_left (fun l (x,i) ->
+ match i with
+ None -> (x,Empty)::l
+ | Some i -> (x,i)::l) [] (candidates) in
+ match List.fold_left (fun (x1,i1) (x2,i2) ->
+ if smaller_itv i1 i2
+ then (x1,i1) else (x2,i2)) (Vect.null,Itv(None,None)) candidates
+ with
+ | (i,Empty) -> None
+ | (x,Itv(Some i, Some j)) -> Some(i,x,j)
+ | (x,Point n) -> Some(n,x,n)
+ | x -> match Fourier.find_Q_interval sys with
+ | None -> None
+ | Some(i,x,j) ->
+ if i =/ j
+ then Some(i,Vect.set x (Int 1) Vect.null,i)
+ else None
+ end
+ | _ -> res in
+
+ match res with
+ | Some (lb,e,ub) ->
+ let (lbn,lbd) =
+ (Ml2C.bigint (sub_big_int (numerator lb) unit_big_int),
+ Ml2C.bigint (denominator lb)) in
+ let (ubn,ubd) =
+ (Ml2C.bigint (add_big_int unit_big_int (numerator ub)) ,
+ Ml2C.bigint (denominator ub)) in
+ let expr = list_to_polynomial var (Vect.to_list e) in
+ (match
+ (*x <= ub -> x > ub *)
+ linear_prover z_spec
+ (Mc.Pair(pplus (pmult (pconst ubd) expr) (popp (pconst ubn)),
+ Mc.NonStrict) :: l),
+ (* lb <= x -> lb > x *)
+ linear_prover z_spec
+ (Mc.Pair( pplus (popp (pmult (pconst lbd) expr)) (pconst lbn) ,
+ Mc.NonStrict)::l)
+ with
+ | Some cub , Some clb ->
+ (match zlinear_enum (e::enum) expr
+ (ceiling_num lb) (floor_num ub) l
+ with
+ | None -> None
+ | Some prf ->
+ Some (Mc.EnumProof(Ml2C.q lb,expr,Ml2C.q ub,clb,cub,prf)))
+ | _ -> None
+ )
+ | _ -> None
+and xzlinear_enum enum expr clb cub l =
+ if clb >/ cub
+ then Some Mc.Nil
+ else
+ let pexpr = pplus (popp (pconst (Ml2C.bigint (numerator clb)))) expr in
+ let sys' = (Mc.Pair(pexpr, Mc.Equal))::l in
+ match xzlinear_prover enum sys' with
+ | None -> if debug then print_string "zlp?"; None
+ | Some prf -> if debug then print_string "zlp!";
+ match zlinear_enum enum expr (clb +/ (Int 1)) cub l with
+ | None -> None
+ | Some prfl -> Some (Mc.Cons(prf,prfl))
+
+and zlinear_enum enum expr clb cub l =
+ let res = xzlinear_enum enum expr clb cub l in
+ if debug then Printf.printf "zlinear_enum %s %s -> %s\n"
+ (string_of_num clb)
+ (string_of_num cub)
+ (match res with
+ | None -> "None"
+ | Some r -> "Some") ; res
+
diff --git a/contrib/micromega/coq_micromega.ml b/contrib/micromega/coq_micromega.ml
new file mode 100644
index 000000000..9fcc69173
--- /dev/null
+++ b/contrib/micromega/coq_micromega.ml
@@ -0,0 +1,1289 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+open Mutils
+let debug = false
+
+let time str f x =
+ let t0 = (Unix.times()).Unix.tms_utime in
+ let res = f x in
+ let t1 = (Unix.times()).Unix.tms_utime in
+ (*if debug then*) (Printf.printf "time %s %f\n" str (t1 -. t0) ;
+ flush stdout);
+ res
+
+type ('a,'b) formula =
+ | TT
+ | FF
+ | X of 'b
+ | A of 'a * Names.name
+ | C of ('a,'b) formula * ('a,'b) formula * Names.name
+ | D of ('a,'b) formula * ('a,'b) formula * Names.name
+ | N of ('a,'b) formula * Names.name
+ | I of ('a,'b) formula * ('a,'b) formula * Names.name
+
+let none = Names.Anonymous
+
+let tag_formula t f =
+ match f with
+ | A(x,_) -> A(x,t)
+ | C(x,y,_) -> C(x,y,t)
+ | D(x,y,_) -> D(x,y,t)
+ | N(x,_) -> N(x,t)
+ | I(x,y,_) -> I(x,y,t)
+ | _ -> f
+
+let tt = []
+let ff = [ [] ]
+
+
+type ('constant,'contr) sentence =
+ ('constant Micromega.formula, 'contr) formula
+
+let cnf negate normalise f =
+ let negate a =
+ CoqToCaml.list (fun cl -> CoqToCaml.list (fun x -> x) cl) (negate a) in
+
+ let normalise a =
+ CoqToCaml.list (fun cl -> CoqToCaml.list (fun x -> x) cl) (normalise a) in
+
+ let and_cnf x y = x @ y in
+ let or_clause_cnf t f = List.map (fun x -> t@x ) f in
+
+ let rec or_cnf f f' =
+ match f with
+ | [] -> tt
+ | e :: rst -> (or_cnf rst f') @ (or_clause_cnf e f') in
+
+ let rec xcnf (pol : bool) f =
+ match f with
+ | TT -> if pol then tt else ff (* ?? *)
+ | FF -> if pol then ff else tt (* ?? *)
+ | X p -> if pol then ff else ff (* ?? *)
+ | A(x,t) -> if pol then normalise x else negate x
+ | N(e,t) -> xcnf (not pol) e
+ | C(e1,e2,t) ->
+ (if pol then and_cnf else or_cnf) (xcnf pol e1) (xcnf pol e2)
+ | D(e1,e2,t) ->
+ (if pol then or_cnf else and_cnf) (xcnf pol e1) (xcnf pol e2)
+ | I(e1,e2,t) ->
+ (if pol then or_cnf else and_cnf) (xcnf (not pol) e1) (xcnf pol e2) in
+
+ xcnf true f
+
+
+
+module M =
+struct
+ open Coqlib
+ open Term
+ (* let constant = gen_constant_in_modules "Omicron" coq_modules*)
+
+
+ let logic_dir = ["Coq";"Logic";"Decidable"]
+ let coq_modules =
+ init_modules @
+ [logic_dir] @ arith_modules @ zarith_base_modules @
+ [ ["Coq";"Lists";"List"];
+ ["ZMicromega"];
+ ["Tauto"];
+ ["RingMicromega"];
+ ["EnvRing"];
+ ["Coq"; "micromega"; "ZMicromega"];
+ ["Coq" ; "micromega" ; "Tauto"];
+ ["Coq" ; "micromega" ; "RingMicromega"];
+ ["Coq" ; "micromega" ; "EnvRing"];
+ ["Coq";"QArith"; "QArith_base"];
+ ["Coq";"Reals" ; "Rdefinitions"];
+ ["LRing_normalise"]]
+
+ let constant = gen_constant_in_modules "ZMicromega" coq_modules
+
+ let coq_and = lazy (constant "and")
+ let coq_or = lazy (constant "or")
+ let coq_not = lazy (constant "not")
+ let coq_iff = lazy (constant "iff")
+ let coq_True = lazy (constant "True")
+ let coq_False = lazy (constant "False")
+
+ let coq_cons = lazy (constant "cons")
+ let coq_nil = lazy (constant "nil")
+ let coq_list = lazy (constant "list")
+
+ let coq_O = lazy (constant "O")
+ let coq_S = lazy (constant "S")
+ let coq_nat = lazy (constant "nat")
+
+ let coq_NO = lazy
+ (gen_constant_in_modules "N" [ ["Coq";"NArith";"BinNat" ]] "N0")
+ let coq_Npos = lazy
+ (gen_constant_in_modules "N" [ ["Coq";"NArith"; "BinNat"]] "Npos")
+ (* let coq_n = lazy (constant "N")*)
+
+ let coq_pair = lazy (constant "pair")
+ let coq_None = lazy (constant "None")
+ let coq_option = lazy (constant "option")
+ let coq_positive = lazy (constant "positive")
+ let coq_xH = lazy (constant "xH")
+ let coq_xO = lazy (constant "xO")
+ let coq_xI = lazy (constant "xI")
+
+ let coq_N0 = lazy (constant "N0")
+ let coq_N0 = lazy (constant "Npos")
+
+
+ let coq_Z = lazy (constant "Z")
+ let coq_Q = lazy (constant "Q")
+ let coq_R = lazy (constant "R")
+
+ let coq_ZERO = lazy (constant "Z0")
+ let coq_POS = lazy (constant "Zpos")
+ let coq_NEG = lazy (constant "Zneg")
+
+ let coq_QWitness = lazy
+ (gen_constant_in_modules "QMicromega"
+ [["Coq"; "micromega"; "QMicromega"]] "QWitness")
+ let coq_ZWitness = lazy
+ (gen_constant_in_modules "QMicromega"
+ [["Coq"; "micromega"; "ZMicromega"]] "ZWitness")
+
+
+ let coq_Build_Witness = lazy (constant "Build_Witness")
+
+
+ let coq_Qmake = lazy (constant "Qmake")
+
+ let coq_proofTerm = lazy (constant "ProofTerm")
+ let coq_ratProof = lazy (constant "RatProof")
+ let coq_cutProof = lazy (constant "CutProof")
+ let coq_enumProof = lazy (constant "EnumProof")
+
+ let coq_Zgt = lazy (constant "Zgt")
+ let coq_Zge = lazy (constant "Zge")
+ let coq_Zle = lazy (constant "Zle")
+ let coq_Zlt = lazy (constant "Zlt")
+ let coq_Eq = lazy (constant "eq")
+
+ let coq_Zplus = lazy (constant "Zplus")
+ let coq_Zminus = lazy (constant "Zminus")
+ let coq_Zopp = lazy (constant "Zopp")
+ let coq_Zmult = lazy (constant "Zmult")
+ let coq_N_of_Z = lazy
+ (gen_constant_in_modules "ZArithRing"
+ [["Coq";"setoid_ring";"ZArithRing"]] "N_of_Z")
+
+
+ let coq_PEX = lazy (constant "PEX" )
+ let coq_PEc = lazy (constant"PEc")
+ let coq_PEadd = lazy (constant "PEadd")
+ let coq_PEopp = lazy (constant "PEopp")
+ let coq_PEmul = lazy (constant "PEmul")
+ let coq_PEsub = lazy (constant "PEsub")
+ let coq_PEpow = lazy (constant "PEpow")
+
+
+ let coq_OpEq = lazy (constant "OpEq")
+ let coq_OpNEq = lazy (constant "OpNEq")
+ let coq_OpLe = lazy (constant "OpLe")
+ let coq_OpLt = lazy (constant "OpLt")
+ let coq_OpGe = lazy (constant "OpGe")
+ let coq_OpGt = lazy (constant "OpGt")
+
+
+ let coq_S_In = lazy (constant "S_In")
+ let coq_S_Square = lazy (constant "S_Square")
+ let coq_S_Monoid = lazy (constant "S_Monoid")
+ let coq_S_Ideal = lazy (constant "S_Ideal")
+ let coq_S_Mult = lazy (constant "S_Mult")
+ let coq_S_Add = lazy (constant "S_Add")
+ let coq_S_Pos = lazy (constant "S_Pos")
+ let coq_S_Z = lazy (constant "S_Z")
+ let coq_coneMember = lazy (constant "coneMember")
+
+
+ let coq_make_impl = lazy
+ (gen_constant_in_modules "Zmicromega" [["Refl"]] "make_impl")
+ let coq_make_conj = lazy
+ (gen_constant_in_modules "Zmicromega" [["Refl"]] "make_conj")
+
+ let coq_Build = lazy
+ (gen_constant_in_modules "RingMicromega"
+ [["Coq" ; "micromega" ; "RingMicromega"] ; ["RingMicromega"] ]
+ "Build_Formula")
+ let coq_Cstr = lazy
+ (gen_constant_in_modules "RingMicromega"
+ [["Coq" ; "micromega" ; "RingMicromega"] ; ["RingMicromega"] ] "Formula")
+
+ type parse_error =
+ | Ukn
+ | BadStr of string
+ | BadNum of int
+ | BadTerm of Term.constr
+ | Msg of string
+ | Goal of (Term.constr list ) * Term.constr * parse_error
+
+ let string_of_error = function
+ | Ukn -> "ukn"
+ | BadStr s -> s
+ | BadNum i -> string_of_int i
+ | BadTerm _ -> "BadTerm"
+ | Msg s -> s
+ | Goal _ -> "Goal"
+
+
+ exception ParseError
+
+
+
+
+ let get_left_construct term =
+ match Term.kind_of_term term with
+ | Term.Construct(_,i) -> (i,[| |])
+ | Term.App(l,rst) ->
+ (match Term.kind_of_term l with
+ | Term.Construct(_,i) -> (i,rst)
+ | _ -> raise ParseError
+ )
+ | _ -> raise ParseError
+
+ module Mc = Micromega
+
+ let rec parse_nat term =
+ let (i,c) = get_left_construct term in
+ match i with
+ | 1 -> Mc.O
+ | 2 -> Mc.S (parse_nat (c.(0)))
+ | i -> raise ParseError
+
+
+ let pp_nat o n = Printf.fprintf o "%i" (CoqToCaml.nat n)
+
+
+ let rec dump_nat x =
+ match x with
+ | Mc.O -> Lazy.force coq_O
+ | Mc.S p -> Term.mkApp(Lazy.force coq_S,[| dump_nat p |])
+
+
+ let rec parse_positive term =
+ let (i,c) = get_left_construct term in
+ match i with
+ | 1 -> Mc.XI (parse_positive c.(0))
+ | 2 -> Mc.XO (parse_positive c.(0))
+ | 3 -> Mc.XH
+ | i -> raise ParseError
+
+
+ let rec dump_positive x =
+ match x with
+ | Mc.XH -> Lazy.force coq_xH
+ | Mc.XO p -> Term.mkApp(Lazy.force coq_xO,[| dump_positive p |])
+ | Mc.XI p -> Term.mkApp(Lazy.force coq_xI,[| dump_positive p |])
+
+ let pp_positive o x = Printf.fprintf o "%i" (CoqToCaml.positive x)
+
+
+ let rec dump_n x =
+ match x with
+ | Mc.N0 -> Lazy.force coq_N0
+ | Mc.Npos p -> Term.mkApp(Lazy.force coq_Npos,[| dump_positive p|])
+
+ let rec dump_index x =
+ match x with
+ | Mc.XH -> Lazy.force coq_xH
+ | Mc.XO p -> Term.mkApp(Lazy.force coq_xO,[| dump_index p |])
+ | Mc.XI p -> Term.mkApp(Lazy.force coq_xI,[| dump_index p |])
+
+
+ let pp_index o x = Printf.fprintf o "%i" (CoqToCaml.index x)
+
+ let rec dump_n x =
+ match x with
+ | Mc.N0 -> Lazy.force coq_NO
+ | Mc.Npos p -> Term.mkApp(Lazy.force coq_Npos,[| dump_positive p |])
+
+ let rec pp_n o x = output_string o (string_of_int (CoqToCaml.n x))
+
+ let dump_pair t1 t2 dump_t1 dump_t2 (Mc.Pair (x,y)) =
+ Term.mkApp(Lazy.force coq_pair,[| t1 ; t2 ; dump_t1 x ; dump_t2 y|])
+
+
+ let rec parse_z term =
+ let (i,c) = get_left_construct term in
+ match i with
+ | 1 -> Mc.Z0
+ | 2 -> Mc.Zpos (parse_positive c.(0))
+ | 3 -> Mc.Zneg (parse_positive c.(0))
+ | i -> raise ParseError
+
+ let dump_z x =
+ match x with
+ | Mc.Z0 ->Lazy.force coq_ZERO
+ | Mc.Zpos p -> Term.mkApp(Lazy.force coq_POS,[| dump_positive p|])
+ | Mc.Zneg p -> Term.mkApp(Lazy.force coq_NEG,[| dump_positive p|])
+
+ let pp_z o x = Printf.fprintf o "%i" (CoqToCaml.z x)
+
+let dump_num bd1 =
+ Term.mkApp(Lazy.force coq_Qmake,
+ [|dump_z (CamlToCoq.bigint (numerator bd1)) ;
+ dump_positive (CamlToCoq.positive_big_int (denominator bd1)) |])
+
+
+let dump_q q =
+ Term.mkApp(Lazy.force coq_Qmake,
+ [| dump_z q.Micromega.qnum ; dump_positive q.Micromega.qden|])
+
+let parse_q term =
+ match Term.kind_of_term term with
+ | Term.App(c, args) ->
+ (
+ match Term.kind_of_term c with
+ Term.Construct((n,j),i) ->
+ if Names.string_of_kn n = "Coq.QArith.QArith_base#<>#Q"
+ then {Mc.qnum = parse_z args.(0) ; Mc.qden = parse_positive args.(1) }
+ else raise ParseError
+ | _ -> raise ParseError
+ )
+ | _ -> raise ParseError
+
+ let rec parse_list parse_elt term =
+ let (i,c) = get_left_construct term in
+ match i with
+ | 1 -> Mc.Nil
+ | 2 -> Mc.Cons(parse_elt c.(1), parse_list parse_elt c.(2))
+ | i -> raise ParseError
+
+
+ let rec dump_list typ dump_elt l =
+ match l with
+ | Mc.Nil -> Term.mkApp(Lazy.force coq_nil,[| typ |])
+ | Mc.Cons(e,l) -> Term.mkApp(Lazy.force coq_cons,
+ [| typ; dump_elt e;dump_list typ dump_elt l|])
+
+ let rec dump_ml_list typ dump_elt l =
+ match l with
+ | [] -> Term.mkApp(Lazy.force coq_nil,[| typ |])
+ | e::l -> Term.mkApp(Lazy.force coq_cons,
+ [| typ; dump_elt e;dump_ml_list typ dump_elt l|])
+
+
+
+ let pp_list op cl elt o l =
+ let rec _pp o l =
+ match l with
+ | Mc.Nil -> ()
+ | Mc.Cons(e,Mc.Nil) -> Printf.fprintf o "%a" elt e
+ | Mc.Cons(e,l) -> Printf.fprintf o "%a ,%a" elt e _pp l in
+ Printf.fprintf o "%s%a%s" op _pp l cl
+
+
+
+ let pp_var = pp_positive
+ let dump_var = dump_positive
+
+ let rec pp_expr o e =
+ match e with
+ | Mc.PEX n -> Printf.fprintf o "V %a" pp_var n
+ | Mc.PEc z -> pp_z o z
+ | Mc.PEadd(e1,e2) -> Printf.fprintf o "(%a)+(%a)" pp_expr e1 pp_expr e2
+ | Mc.PEmul(e1,e2) -> Printf.fprintf o "%a*(%a)" pp_expr e1 pp_expr e2
+ | Mc.PEopp e -> Printf.fprintf o "-(%a)" pp_expr e
+ | Mc.PEsub(e1,e2) -> Printf.fprintf o "(%a)-(%a)" pp_expr e1 pp_expr e2
+ | Mc.PEpow(e,n) -> Printf.fprintf o "(%a)^(%a)" pp_expr e pp_n n
+
+
+ let dump_expr typ dump_z e =
+ let rec dump_expr e =
+ match e with
+ | Mc.PEX n -> mkApp(Lazy.force coq_PEX,[| typ; dump_var n |])
+ | Mc.PEc z -> mkApp(Lazy.force coq_PEc,[| typ ; dump_z z |])
+ | Mc.PEadd(e1,e2) -> mkApp(Lazy.force coq_PEadd,
+ [| typ; dump_expr e1;dump_expr e2|])
+ | Mc.PEsub(e1,e2) -> mkApp(Lazy.force coq_PEsub,
+ [| typ; dump_expr e1;dump_expr e2|])
+ | Mc.PEopp e -> mkApp(Lazy.force coq_PEopp,
+ [| typ; dump_expr e|])
+ | Mc.PEmul(e1,e2) -> mkApp(Lazy.force coq_PEmul,
+ [| typ; dump_expr e1;dump_expr e2|])
+ | Mc.PEpow(e,n) -> mkApp(Lazy.force coq_PEpow,
+ [| typ; dump_expr e; dump_n n|])
+ in
+ dump_expr e
+
+ let rec dump_monoid l = dump_list (Lazy.force coq_nat) dump_nat l
+
+ let rec dump_cone typ dump_z e =
+ let z = Lazy.force typ in
+ let rec dump_cone e =
+ match e with
+ | Mc.S_In n -> mkApp(Lazy.force coq_S_In,[| z; dump_nat n |])
+ | Mc.S_Ideal(e,c) -> mkApp(Lazy.force coq_S_Ideal,
+ [| z; dump_expr z dump_z e ; dump_cone c |])
+ | Mc.S_Square e -> mkApp(Lazy.force coq_S_Square,
+ [| z;dump_expr z dump_z e|])
+ | Mc.S_Monoid l -> mkApp (Lazy.force coq_S_Monoid,
+ [|z; dump_monoid l|])
+ | Mc.S_Add(e1,e2) -> mkApp(Lazy.force coq_S_Add,
+ [| z; dump_cone e1; dump_cone e2|])
+ | Mc.S_Mult(e1,e2) -> mkApp(Lazy.force coq_S_Mult,
+ [| z; dump_cone e1; dump_cone e2|])
+ | Mc.S_Pos p -> mkApp(Lazy.force coq_S_Pos,[| z; dump_z p|])
+ | Mc.S_Z -> mkApp( Lazy.force coq_S_Z,[| z|]) in
+ dump_cone e
+
+
+ let pp_cone pp_z o e =
+ let rec pp_cone o e =
+ match e with
+ | Mc.S_In n ->
+ Printf.fprintf o "(S_In %a)%%nat" pp_nat n
+ | Mc.S_Ideal(e,c) ->
+ Printf.fprintf o "(S_Ideal %a %a)" pp_expr e pp_cone c
+ | Mc.S_Square e ->
+ Printf.fprintf o "(S_Square %a)" pp_expr e
+ | Mc.S_Monoid l ->
+ Printf.fprintf o "(S_Monoid %a)" (pp_list "[" "]" pp_nat) l
+ | Mc.S_Add(e1,e2) ->
+ Printf.fprintf o "(S_Add %a %a)" pp_cone e1 pp_cone e2
+ | Mc.S_Mult(e1,e2) ->
+ Printf.fprintf o "(S_Mult %a %a)" pp_cone e1 pp_cone e2
+ | Mc.S_Pos p ->
+ Printf.fprintf o "(S_Pos %a)%%positive" pp_z p
+ | Mc.S_Z ->
+ Printf.fprintf o "S_Z" in
+ pp_cone o e
+
+
+
+
+ let rec parse_op term =
+ let (i,c) = get_left_construct term in
+ match i with
+ | 1 -> Mc.OpEq
+ | 2 -> Mc.OpLe
+ | 3 -> Mc.OpGe
+ | 4 -> Mc.OpGt
+ | 5 -> Mc.OpLt
+ | i -> raise ParseError
+
+
+ let rec dump_op = function
+ | Mc.OpEq-> Lazy.force coq_OpEq
+ | Mc.OpNEq-> Lazy.force coq_OpNEq
+ | Mc.OpLe -> Lazy.force coq_OpLe
+ | Mc.OpGe -> Lazy.force coq_OpGe
+ | Mc.OpGt-> Lazy.force coq_OpGt
+ | Mc.OpLt-> Lazy.force coq_OpLt
+
+
+
+ let pp_op o e=
+ match e with
+ | Mc.OpEq-> Printf.fprintf o "="
+ | Mc.OpNEq-> Printf.fprintf o "<>"
+ | Mc.OpLe -> Printf.fprintf o "=<"
+ | Mc.OpGe -> Printf.fprintf o ">="
+ | Mc.OpGt-> Printf.fprintf o ">"
+ | Mc.OpLt-> Printf.fprintf o "<"
+
+
+
+
+ let pp_cstr o {Mc.flhs = l ; Mc.fop = op ; Mc.frhs = r } =
+ Printf.fprintf o"(%a %a %a)" pp_expr l pp_op op pp_expr r
+
+ let dump_cstr typ dump_constant {Mc.flhs = e1 ; Mc.fop = o ; Mc.frhs = e2} =
+ Term.mkApp(Lazy.force coq_Build,
+ [| typ; dump_expr typ dump_constant e1 ;
+ dump_op o ;
+ dump_expr typ dump_constant e2|])
+
+
+
+ let parse_zop (op,args) =
+ match kind_of_term op with
+ | Const x ->
+ (match Names.string_of_con x with
+ | "Coq.ZArith.BinInt#<>#Zgt" -> (Mc.OpGt, args.(0), args.(1))
+ | "Coq.ZArith.BinInt#<>#Zge" -> (Mc.OpGe, args.(0), args.(1))
+ | "Coq.ZArith.BinInt#<>#Zlt" -> (Mc.OpLt, args.(0), args.(1))
+ | "Coq.ZArith.BinInt#<>#Zle" -> (Mc.OpLe, args.(0), args.(1))
+ (*| "Coq.Init.Logic#<>#not" -> Mc.OpNEq (* for backward compat *)*)
+ | s -> raise ParseError
+ )
+ | Ind(n,0) ->
+ (match Names.string_of_kn n with
+ | "Coq.Init.Logic#<>#eq" ->
+ if args.(0) <> Lazy.force coq_Z
+ then raise ParseError
+ else (Mc.OpEq, args.(1), args.(2))
+ | _ -> raise ParseError)
+ | _ -> failwith "parse_zop"
+
+
+ let parse_rop (op,args) =
+ try
+ match kind_of_term op with
+ | Const x ->
+ (match Names.string_of_con x with
+ | "Coq.Reals.Rdefinitions#<>#Rgt" -> (Mc.OpGt, args.(0), args.(1))
+ | "Coq.Reals.Rdefinitions#<>#Rge" -> (Mc.OpGe, args.(0), args.(1))
+ | "Coq.Reals.Rdefinitions#<>#Rlt" -> (Mc.OpLt, args.(0), args.(1))
+ | "Coq.Reals.Rdefinitions#<>#Rle" -> (Mc.OpLe, args.(0), args.(1))
+ (*| "Coq.Init.Logic#<>#not"-> Mc.OpNEq (* for backward compat *)*)
+ | s -> raise ParseError
+ )
+ | Ind(n,0) ->
+ (match Names.string_of_kn n with
+ | "Coq.Init.Logic#<>#eq" ->
+ (* if args.(0) <> Lazy.force coq_R
+ then raise ParseError
+ else*) (Mc.OpEq, args.(1), args.(2))
+ | _ -> raise ParseError)
+ | _ -> failwith "parse_rop"
+ with x ->
+ (Pp.pp (Pp.str "parse_rop failure ") ;
+ Pp.pp (Printer.prterm op) ; Pp.pp_flush ())
+ ; raise x
+
+
+ let parse_qop (op,args) =
+ (
+ (match kind_of_term op with
+ | Const x ->
+ (match Names.string_of_con x with
+ | "Coq.QArith.QArith_base#<>#Qgt" -> Mc.OpGt
+ | "Coq.QArith.QArith_base#<>#Qge" -> Mc.OpGe
+ | "Coq.QArith.QArith_base#<>#Qlt" -> Mc.OpLt
+ | "Coq.QArith.QArith_base#<>#Qle" -> Mc.OpLe
+ | "Coq.QArith.QArith_base#<>#Qeq" -> Mc.OpEq
+ | s -> raise ParseError
+ )
+ | _ -> failwith "parse_zop") , args.(0) , args.(1))
+
+
+ module Env =
+ struct
+ type t = constr list
+
+ let compute_rank_add env v =
+ let rec _add env n v =
+ match env with
+ | [] -> ([v],n)
+ | e::l ->
+ if eq_constr e v
+ then (env,n)
+ else
+ let (env,n) = _add l ( n+1) v in
+ (e::env,n) in
+ let (env, n) = _add env 1 v in
+ (env, CamlToCoq.idx n)
+
+
+ let empty = []
+
+ let elements env = env
+
+ end
+
+
+ let is_constant t = (* This is an approx *)
+ match kind_of_term t with
+ | Construct(i,_) -> true
+ | _ -> false
+
+
+ type 'a op =
+ | Binop of ('a Mc.pExpr -> 'a Mc.pExpr -> 'a Mc.pExpr)
+ | Opp
+ | Power
+ | Ukn of string
+
+
+ let parse_expr parse_constant parse_exp ops_spec env term =
+ if debug
+ then (Pp.pp (Pp.str "parse_expr: ");
+ Pp.pp_flush ();Pp.pp (Printer.prterm term); Pp.pp_flush ());
+
+ let constant_or_variable env term =
+ try
+ ( Mc.PEc (parse_constant term) , env)
+ with ParseError ->
+ let (env,n) = Env.compute_rank_add env term in
+ (Mc.PEX n , env) in
+
+ let rec parse_expr env term =
+ let combine env op (t1,t2) =
+ let (expr1,env) = parse_expr env t1 in
+ let (expr2,env) = parse_expr env t2 in
+ (op expr1 expr2,env) in
+ match kind_of_term term with
+ | App(t,args) ->
+ (
+ match kind_of_term t with
+ | Const c ->
+ ( match ops_spec (Names.string_of_con c) with
+ | Binop f -> combine env f (args.(0),args.(1))
+ | Opp -> let (expr,env) = parse_expr env args.(0) in
+ (Mc.PEopp expr, env)
+ | Power ->
+ let (expr,env) = parse_expr env args.(0) in
+ let exp = (parse_exp args.(1)) in
+ (Mc.PEpow(expr, exp) , env)
+ | Ukn s ->
+ if debug
+ then (Printf.printf "unknown op: %s\n" s; flush stdout;);
+ let (env,n) = Env.compute_rank_add env term in (Mc.PEX n, env)
+ )
+ | _ -> constant_or_variable env term
+ )
+ | _ -> constant_or_variable env term in
+ parse_expr env term
+
+
+let zop_spec = function
+ | "Coq.ZArith.BinInt#<>#Zplus" -> Binop (fun x y -> Mc.PEadd(x,y))
+ | "Coq.ZArith.BinInt#<>#Zminus" -> Binop (fun x y -> Mc.PEsub(x,y))
+ | "Coq.ZArith.BinInt#<>#Zmult" -> Binop (fun x y -> Mc.PEmul (x,y))
+ | "Coq.ZArith.BinInt#<>#Zopp" -> Opp
+ | "Coq.ZArith.Zpow_def#<>#Zpower" -> Power
+ | s -> Ukn s
+
+let qop_spec = function
+ | "Coq.QArith.QArith_base#<>#Qplus" -> Binop (fun x y -> Mc.PEadd(x,y))
+ | "Coq.QArith.QArith_base#<>#Qminus" -> Binop (fun x y -> Mc.PEsub(x,y))
+ | "Coq.QArith.QArith_base#<>#Qmult" -> Binop (fun x y -> Mc.PEmul (x,y))
+ | "Coq.QArith.QArith_base#<>#Qopp" -> Opp
+ | "Coq.QArith.QArith_base#<>#Qpower" -> Power
+ | s -> Ukn s
+
+let rop_spec = function
+ | "Coq.Reals.Rdefinitions#<>#Rplus" -> Binop (fun x y -> Mc.PEadd(x,y))
+ | "Coq.Reals.Rdefinitions#<>#Rminus" -> Binop (fun x y -> Mc.PEsub(x,y))
+ | "Coq.Reals.Rdefinitions#<>#Rmult" -> Binop (fun x y -> Mc.PEmul (x,y))
+ | "Coq.Reals.Rdefinitions#<>#Ropp" -> Opp
+ | "Coq.Reals.Rpow_def#<>#pow" -> Power
+ | s -> Ukn s
+
+
+
+
+
+let zconstant = parse_z
+let qconstant = parse_q
+
+
+let rconstant term =
+ if debug
+ then (Pp.pp_flush ();
+ Pp.pp (Pp.str "rconstant: ");
+ Pp.pp (Printer.prterm term); Pp.pp_flush ());
+ match Term.kind_of_term term with
+ | Const x ->
+ (match Names.string_of_con x with
+ | "Coq.Reals.Rdefinitions#<>#R0" -> Mc.Z0
+ | "Coq.Reals.Rdefinitions#<>#R1" -> Mc.Zpos Mc.XH
+ | _ -> raise ParseError
+ )
+ | _ -> raise ParseError
+
+
+let parse_zexpr =
+ parse_expr zconstant (fun x -> Mc.n_of_Z (parse_z x)) zop_spec
+let parse_qexpr =
+ parse_expr qconstant (fun x -> Mc.n_of_Z (parse_z x)) qop_spec
+let parse_rexpr =
+ parse_expr rconstant (fun x -> Mc.n_of_nat (parse_nat x)) rop_spec
+
+
+ let parse_arith parse_op parse_expr env cstr =
+ if debug
+ then (Pp.pp_flush ();
+ Pp.pp (Pp.str "parse_arith: ");
+ Pp.pp (Printer.prterm cstr);
+ Pp.pp_flush ());
+ match kind_of_term cstr with
+ | App(op,args) ->
+ let (op,lhs,rhs) = parse_op (op,args) in
+ let (e1,env) = parse_expr env lhs in
+ let (e2,env) = parse_expr env rhs in
+ ({Mc.flhs = e1; Mc.fop = op;Mc.frhs = e2},env)
+ | _ -> failwith "error : parse_arith(2)"
+
+ let parse_zarith = parse_arith parse_zop parse_zexpr
+
+ let parse_qarith = parse_arith parse_qop parse_qexpr
+
+ let parse_rarith = parse_arith parse_rop parse_rexpr
+
+
+ (* generic parsing of arithmetic expressions *)
+
+ let rec parse_conj parse_arith env term =
+ match kind_of_term term with
+ | App(l,rst) ->
+ (match kind_of_term l with
+ | Ind (n,_) ->
+ ( match Names.string_of_kn n with
+ | "Coq.Init.Logic#<>#and" ->
+ let (e1,env) = parse_arith env rst.(0) in
+ let (e2,env) = parse_conj parse_arith env rst.(1) in
+ (Mc.Cons(e1,e2),env)
+ | _ -> (* This might be an equality *)
+ let (e,env) = parse_arith env term in
+ (Mc.Cons(e,Mc.Nil),env))
+ | _ -> (* This is an arithmetic expression *)
+ let (e,env) = parse_arith env term in
+ (Mc.Cons(e,Mc.Nil),env))
+ | _ -> failwith "parse_conj(2)"
+
+
+
+ let rec f2f = function
+ | TT -> Mc.TT
+ | FF -> Mc.FF
+ | X _ -> Mc.X
+ | A (x,_) -> Mc.A x
+ | C (a,b,_) -> Mc.Cj(f2f a,f2f b)
+ | D (a,b,_) -> Mc.D(f2f a,f2f b)
+ | N (a,_) -> Mc.N(f2f a)
+ | I(a,b,_) -> Mc.I(f2f a,f2f b)
+
+ let is_prop t =
+ match t with
+ | Names.Anonymous -> true (* Not quite right *)
+ | Names.Name x -> false
+
+ let mkC f1 f2 = C(f1,f2,none)
+ let mkD f1 f2 = D(f1,f2,none)
+ let mkIff f1 f2 = C(I(f1,f2,none),I(f2,f2,none),none)
+ let mkI f1 f2 = I(f1,f2,none)
+
+ let mkformula_binary g term f1 f2 =
+ match f1 , f2 with
+ | X _ , X _ -> X(term)
+ | _ -> g f1 f2
+
+ let parse_formula parse_atom env term =
+ let parse_atom env t = try let (at,env) = parse_atom env t in (A(at,none), env) with _ -> (X(t),env) in
+
+ let rec xparse_formula env term =
+ match kind_of_term term with
+ | App(l,rst) ->
+ (match rst with
+ | [|a;b|] when l = Lazy.force coq_and ->
+ let f,env = xparse_formula env a in
+ let g,env = xparse_formula env b in
+ mkformula_binary mkC term f g,env
+ | [|a;b|] when l = Lazy.force coq_or ->
+ let f,env = xparse_formula env a in
+ let g,env = xparse_formula env b in
+ mkformula_binary mkD term f g,env
+ | [|a|] when l = Lazy.force coq_not ->
+ let (f,env) = xparse_formula env a in (N(f,none), env)
+ | [|a;b|] when l = Lazy.force coq_iff ->
+ let f,env = xparse_formula env a in
+ let g,env = xparse_formula env b in
+ mkformula_binary mkIff term f g,env
+ | _ -> parse_atom env term)
+ | Prod(typ,a,b) when not (Termops.dependent (mkRel 1) b) ->
+ let f,env = xparse_formula env a in
+ let g,env = xparse_formula env b in
+ mkformula_binary mkI term f g,env
+ | _ when term = Lazy.force coq_True -> (TT,env)
+ | _ -> X(term),env in
+ xparse_formula env term
+
+ let coq_TT = lazy
+ (gen_constant_in_modules "ZMicromega"
+ [["Coq" ; "micromega" ; "Tauto"];["Tauto"]] "TT")
+ let coq_FF = lazy
+ (gen_constant_in_modules "ZMicromega"
+ [["Coq" ; "micromega" ; "Tauto"];["Tauto"]] "FF")
+ let coq_And = lazy
+ (gen_constant_in_modules "ZMicromega"
+ [["Coq" ; "micromega" ; "Tauto"];["Tauto"]] "Cj")
+ let coq_Or = lazy
+ (gen_constant_in_modules "ZMicromega"
+ [["Coq" ; "micromega" ; "Tauto"];["Tauto"]] "D")
+ let coq_Neg = lazy
+ (gen_constant_in_modules "ZMicromega"
+ [["Coq" ; "micromega" ; "Tauto"];["Tauto"]] "N")
+ let coq_Atom = lazy
+ (gen_constant_in_modules "ZMicromega"
+ [["Coq" ; "micromega" ; "Tauto"];["Tauto"]] "A")
+ let coq_X = lazy
+ (gen_constant_in_modules "ZMicromega"
+ [["Coq" ; "micromega" ; "Tauto"];["Tauto"]] "X")
+ let coq_Impl = lazy
+ (gen_constant_in_modules "ZMicromega"
+ [["Coq" ; "micromega" ; "Tauto"];["Tauto"]] "I")
+ let coq_Formula = lazy
+ (gen_constant_in_modules "ZMicromega"
+ [["Coq" ; "micromega" ; "Tauto"];["Tauto"]] "BFormula")
+
+ let dump_formula typ dump_atom f =
+ let rec xdump f =
+ match f with
+ | TT -> mkApp(Lazy.force coq_TT,[| typ|])
+ | FF -> mkApp(Lazy.force coq_FF,[| typ|])
+ | C(x,y,_) -> mkApp(Lazy.force coq_And,[| typ ; xdump x ; xdump y|])
+ | D(x,y,_) -> mkApp(Lazy.force coq_Or,[| typ ; xdump x ; xdump y|])
+ | I(x,y,_) -> mkApp(Lazy.force coq_Impl,[| typ ; xdump x ; xdump y|])
+ | N(x,_) -> mkApp(Lazy.force coq_Neg,[| typ ; xdump x|])
+ | A(x,_) -> mkApp(Lazy.force coq_Atom,[| typ ; dump_atom x|])
+ | X(t) -> mkApp(Lazy.force coq_X,[| typ ; t|]) in
+
+ xdump f
+
+
+ (* Backward compat *)
+
+ let rec parse_concl parse_arith env term =
+ match kind_of_term term with
+ | Prod(_,expr,rst) -> (* a -> b *)
+ let (lhs,rhs,env) = parse_concl parse_arith env rst in
+ let (e,env) = parse_arith env expr in
+ (Mc.Cons(e,lhs),rhs,env)
+ | App(_,_) ->
+ let (conj, env) = parse_conj parse_arith env term in
+ (Mc.Nil,conj,env)
+ | Ind(n,_) ->
+ (match (Names.string_of_kn n) with
+ | "Coq.Init.Logic#<>#False" -> (Mc.Nil,Mc.Nil,env)
+ | s ->
+ print_string s ; flush stdout;
+ failwith "parse_concl")
+ | _ -> failwith "parse_concl"
+
+
+ let rec parse_hyps parse_arith env goal_hyps hyps =
+ match hyps with
+ | [] -> ([],goal_hyps,env)
+ | (i,t)::l ->
+ let (li,lt,env) = parse_hyps parse_arith env goal_hyps l in
+ try
+ let (c,env) = parse_arith env t in
+ (i::li, Mc.Cons(c,lt), env)
+ with x ->
+ (*(if debug then Printf.printf "parse_arith : %s\n" x);*)
+ (li,lt,env)
+
+
+ let parse_goal parse_arith env hyps term =
+ try
+ let (lhs,rhs,env) = parse_concl parse_arith env term in
+ let (li,lt,env) = parse_hyps parse_arith env lhs hyps in
+ (li,lt,rhs,env)
+ with Failure x -> raise ParseError
+ (* backward compat *)
+
+
+ (* ! reverse the list of bindings *)
+ let set l concl =
+ let rec _set acc = function
+ | [] -> acc
+ | (e::l) ->
+ let (name,expr,typ) = e in
+ _set (Term.mkNamedLetIn
+ (Names.id_of_string name)
+ expr typ acc) l in
+ _set concl l
+
+
+end
+
+open M
+
+
+let rec sig_of_cone = function
+ | Mc.S_In n -> [CoqToCaml.nat n]
+ | Mc.S_Ideal(e,w) -> sig_of_cone w
+ | Mc.S_Mult(w1,w2) ->
+ (sig_of_cone w1)@(sig_of_cone w2)
+ | Mc.S_Add(w1,w2) -> (sig_of_cone w1)@(sig_of_cone w2)
+ | _ -> []
+
+let same_proof sg cl1 cl2 =
+ let cl1 = CoqToCaml.list (fun x -> x) cl1 in
+ let cl2 = CoqToCaml.list (fun x -> x) cl2 in
+ let rec xsame_proof sg =
+ match sg with
+ | [] -> true
+ | n::sg -> (try List.nth cl1 n = List.nth cl2 n with _ -> false)
+ && (xsame_proof sg ) in
+ xsame_proof sg
+
+
+
+
+let tags_of_clause tgs wit clause =
+ let rec xtags tgs = function
+ | Mc.S_In n -> Names.Idset.union tgs
+ (snd (List.nth clause (CoqToCaml.nat n) ))
+ | Mc.S_Ideal(e,w) -> xtags tgs w
+ | Mc.S_Mult (w1,w2) | Mc.S_Add(w1,w2) -> xtags (xtags tgs w1) w2
+ | _ -> tgs in
+ xtags tgs wit
+
+let tags_of_cnf wits cnf =
+ List.fold_left2 (fun acc w cl -> tags_of_clause acc w cl)
+ Names.Idset.empty wits cnf
+
+
+let find_witness prover polys1 =
+ let l = CoqToCaml.list (fun x -> x) polys1 in
+ try_any prover l
+
+let rec witness prover l1 l2 =
+ match l2 with
+ | Micromega.Nil -> Some (Micromega.Nil)
+ | Micromega.Cons(e,l2) ->
+ match find_witness prover (Micromega.Cons( e,l1)) with
+ | None -> None
+ | Some w ->
+ (match witness prover l1 l2 with
+ | None -> None
+ | Some l -> Some (Micromega.Cons (w,l))
+ )
+
+
+let rec apply_ids t ids =
+ match ids with
+ | [] -> t
+ | i::ids -> apply_ids (Term.mkApp(t,[| Term.mkVar i |])) ids
+
+
+let coq_Node = lazy
+ (Coqlib.gen_constant_in_modules "VarMap"
+ [["Coq" ; "micromega" ; "VarMap"];["VarMap"]] "Node")
+let coq_Leaf = lazy
+ (Coqlib.gen_constant_in_modules "VarMap"
+ [["Coq" ; "micromega" ; "VarMap"];["VarMap"]] "Leaf")
+let coq_Empty = lazy
+ (Coqlib.gen_constant_in_modules "VarMap"
+ [["Coq" ; "micromega" ;"VarMap"];["VarMap"]] "Empty")
+
+
+let btree_of_array typ a =
+ let size_of_a = Array.length a in
+ let semi_size_of_a = size_of_a lsr 1 in
+ let node = Lazy.force coq_Node
+ and leaf = Lazy.force coq_Leaf
+ and empty = Term.mkApp (Lazy.force coq_Empty, [| typ |]) in
+ let rec aux n =
+ if n > size_of_a
+ then empty
+ else if n > semi_size_of_a
+ then Term.mkApp (leaf, [| typ; a.(n-1) |])
+ else Term.mkApp (node, [| typ; aux (2*n); a.(n-1); aux (2*n+1) |])
+ in
+ aux 1
+
+let btree_of_array typ a =
+ try
+ btree_of_array typ a
+ with x ->
+ failwith (Printf.sprintf "btree of array : %s" (Printexc.to_string x))
+
+let dump_varmap typ env =
+ btree_of_array typ (Array.of_list env)
+
+
+let rec pp_varmap o vm =
+ match vm with
+ | Mc.Empty -> output_string o "[]"
+ | Mc.Leaf z -> Printf.fprintf o "[%a]" pp_z z
+ | Mc.Node(l,z,r) -> Printf.fprintf o "[%a, %a, %a]" pp_varmap l pp_z z pp_varmap r
+
+
+
+let rec dump_proof_term = function
+ | Micromega.RatProof cone ->
+ Term.mkApp(Lazy.force coq_ratProof, [|dump_cone coq_Z dump_z cone|])
+ | Micromega.CutProof(e,q,cone,prf) ->
+ Term.mkApp(Lazy.force coq_cutProof,
+ [| dump_expr (Lazy.force coq_Z) dump_z e ;
+ dump_q q ;
+ dump_cone coq_Z dump_z cone ;
+ dump_proof_term prf|])
+ | Micromega.EnumProof( q1,e1,q2,c1,c2,prfs) ->
+ Term.mkApp (Lazy.force coq_enumProof,
+ [| dump_q q1 ; dump_expr (Lazy.force coq_Z) dump_z e1 ; dump_q q2;
+ dump_cone coq_Z dump_z c1 ; dump_cone coq_Z dump_z c2 ;
+ dump_list (Lazy.force coq_proofTerm) dump_proof_term prfs |])
+
+let pp_q o q = Printf.fprintf o "%a/%a" pp_z q.Micromega.qnum pp_positive q.Micromega.qden
+
+
+let rec pp_proof_term o = function
+ | Micromega.RatProof cone -> Printf.fprintf o "R[%a]" (pp_cone pp_z) cone
+ | Micromega.CutProof(e,q,_,p) -> failwith "not implemented"
+ | Micromega.EnumProof(q1,e1,q2,c1,c2,rst) ->
+ Printf.fprintf o "EP[%a,%a,%a,%a,%a,%a]"
+ pp_q q1 pp_expr e1 pp_q q2 (pp_cone pp_z) c1 (pp_cone pp_z) c2
+ (pp_list "[" "]" pp_proof_term) rst
+
+let rec parse_hyps parse_arith env hyps =
+ match hyps with
+ | [] -> ([],env)
+ | (i,t)::l ->
+ let (lhyps,env) = parse_hyps parse_arith env l in
+ try
+ let (c,env) = parse_formula parse_arith env t in
+ ((i,c)::lhyps, env)
+ with _ -> (lhyps,env)
+ (*(if debug then Printf.printf "parse_arith : %s\n" x);*)
+
+
+exception ParseError
+
+let parse_goal parse_arith env hyps term =
+ (* try*)
+ let (f,env) = parse_formula parse_arith env term in
+ let (lhyps,env) = parse_hyps parse_arith env hyps in
+ (lhyps,f,env)
+ (* with Failure x -> raise ParseError*)
+
+
+type ('a, 'b) domain_spec = {
+ typ : Term.constr; (* Z, Q , R *)
+ coeff : Term.constr ; (* Z, Q *)
+ dump_coeff : 'a -> Term.constr ;
+ proof_typ : Term.constr ;
+ dump_proof : 'b -> Term.constr
+}
+
+let zz_domain_spec = lazy {
+ typ = Lazy.force coq_Z;
+ coeff = Lazy.force coq_Z;
+ dump_coeff = dump_z ;
+ proof_typ = Lazy.force coq_proofTerm ;
+ dump_proof = dump_proof_term
+}
+
+let qq_domain_spec = lazy {
+ typ = Lazy.force coq_Q;
+ coeff = Lazy.force coq_Q;
+ dump_coeff = dump_q ;
+ proof_typ = Lazy.force coq_QWitness ;
+ dump_proof = dump_cone coq_Q dump_q
+}
+
+let rz_domain_spec = lazy {
+ typ = Lazy.force coq_R;
+ coeff = Lazy.force coq_Z;
+ dump_coeff = dump_z;
+ proof_typ = Lazy.force coq_ZWitness ;
+ dump_proof = dump_cone coq_Z dump_z
+}
+
+
+
+
+let micromega_order_change spec cert cert_typ env ff gl =
+ let formula_typ = (Term.mkApp( Lazy.force coq_Cstr,[| spec.coeff|])) in
+
+ let ff = dump_formula formula_typ (dump_cstr spec.coeff spec.dump_coeff) ff in
+ let vm = dump_varmap ( spec.typ) env in
+ Tactics.change_in_concl None
+ (set
+ [
+ ("__ff", ff, Term.mkApp(Lazy.force coq_Formula ,[| formula_typ |]));
+ ("__varmap", vm , Term.mkApp
+ (Coqlib.gen_constant_in_modules "VarMap"
+ [["Coq" ; "micromega" ; "VarMap"];["VarMap"]] "t", [| spec.typ|]));
+ ("__wit", cert,cert_typ)
+ ]
+ (Tacmach.pf_concl gl )
+
+ )
+ gl
+
+
+let detect_duplicates cnf wit =
+ let cnf = CoqToCaml.list (fun x -> x) cnf in
+ let wit = CoqToCaml.list (fun x -> x) wit in
+
+ let rec xdup cnf wit =
+ match wit with
+ | [] -> []
+ | w :: wit ->
+ let sg = sig_of_cone w in
+ match cnf with
+ | [] -> []
+ | e::cnf ->
+ let (dups,cnf) = (List.partition (fun x -> same_proof sg e x) cnf) in
+ dups@(xdup cnf wit) in
+ xdup cnf wit
+
+let find_witness prover polys1 =
+ try_any prover polys1
+
+
+let witness_list_with_tags prover l =
+
+ let rec xwitness_list l =
+ match l with
+ | [] -> Some([])
+ | e::l ->
+ match find_witness prover (List.map fst e) with
+ | None -> None
+ | Some w ->
+ (match xwitness_list l with
+ | None -> None
+ | Some l -> Some (w::l)
+ ) in
+ xwitness_list l
+
+let witness_list_without_tags prover l =
+
+ let rec xwitness_list l =
+ match l with
+ | [] -> Some([])
+ | e::l ->
+ match find_witness prover e with
+ | None -> None
+ | Some w ->
+ (match xwitness_list l with
+ | None -> None
+ | Some l -> Some (w::l)
+ ) in
+ xwitness_list l
+
+let witness_list prover l =
+ let rec xwitness_list l =
+ match l with
+ | Micromega.Nil -> Some(Micromega.Nil)
+ | Micromega.Cons(e,l) ->
+ match find_witness prover e with
+ | None -> None
+ | Some w ->
+ (match xwitness_list l with
+ | None -> None
+ | Some l -> Some (Micromega.Cons(w,l))
+ ) in
+ xwitness_list l
+
+
+
+
+let is_singleton = function [] -> true | [e] -> true | _ -> false
+
+
+let micromega_tauto negate normalise spec prover env polys1 polys2 gl =
+ let spec = Lazy.force spec in
+ let (ff,ids) =
+ List.fold_right
+ (fun (id,f) (cc,ids) ->
+ match f with
+ X _ -> (cc,ids)
+ | _ -> (I(tag_formula (Names.Name id) f,cc,none), id::ids))
+ polys1 (polys2,[]) in
+
+ let cnf_ff = cnf negate normalise ff in
+
+ if debug then
+ (Pp.pp (Pp.str "Formula....\n") ;
+ let formula_typ = (Term.mkApp( Lazy.force coq_Cstr,[| spec.coeff|])) in
+ let ff = dump_formula formula_typ
+ (dump_cstr spec.typ spec.dump_coeff) ff in
+ Pp.pp (Printer.prterm ff) ; Pp.pp_flush ()) ;
+
+ match witness_list_without_tags prover cnf_ff with
+ | None -> Tacticals.tclFAIL 0 (Pp.str "Cannot find witness") gl
+ | Some res -> (*Printf.printf "\nList %i" (List.length res); *)
+ let (ff,res,ids) = (ff,res,List.map Term.mkVar ids) in
+ let res' = dump_ml_list (spec.proof_typ) spec.dump_proof res in
+ (Tacticals.tclTHENSEQ
+ [
+ Tactics.generalize ids;
+ micromega_order_change spec res'
+ (Term.mkApp(Lazy.force coq_list,[| spec.proof_typ|])) env ff ;
+ ]) gl
+
+
+let micromega_gen parse_arith negate normalise spec prover gl =
+ let concl = Tacmach.pf_concl gl in
+ let hyps = Tacmach.pf_hyps_types gl in
+ try
+ let (hyps,concl,env) = parse_goal parse_arith Env.empty hyps concl in
+ let env = Env.elements env in
+ micromega_tauto negate normalise spec prover env hyps concl gl
+ with
+ | Failure x -> flush stdout ; Pp.pp_flush () ;
+ Tacticals.tclFAIL 0 (Pp.str x) gl
+ | ParseError -> Tacticals.tclFAIL 0 (Pp.str "Bad logical fragment") gl
+
+
+let lift_ratproof prover l =
+ match prover l with
+ | None -> None
+ | Some c -> Some (Mc.RatProof c)
+
+
+type csdpcert = Certificate.Mc.z Certificate.Mc.coneMember option
+type micromega_polys = (Micromega.z Mc.pExpr, Mc.op1) Micromega.prod list
+type provername = string * int option
+
+let call_csdpcert provername poly =
+ let tmp_to,ch_to = Filename.open_temp_file "csdpcert" ".in" in
+ let tmp_from = Filename.temp_file "csdpcert" ".out" in
+ output_value ch_to (provername,poly : provername * micromega_polys);
+ close_out ch_to;
+ let cmdname =
+ Filename.concat Coq_config.bindir
+ ("csdpcert" ^ Coq_config.exec_extension) in
+ let c = Sys.command (cmdname ^" "^ tmp_to ^" "^ tmp_from) in
+ (try Sys.remove tmp_to with _ -> ());
+ if c <> 0 then Util.error ("Failed to call csdp certificate generator");
+ let ch_from = open_in tmp_from in
+ let cert = (input_value ch_from : csdpcert) in
+ close_in ch_from; Sys.remove tmp_from;
+ cert
+
+let omicron gl =
+ micromega_gen parse_zarith Mc.negate Mc.normalise zz_domain_spec
+ [lift_ratproof
+ (Certificate.linear_prover Certificate.z_spec), "fourier refutation" ] gl
+
+
+let qomicron gl =
+ micromega_gen parse_qarith Mc.cnf_negate Mc.cnf_normalise qq_domain_spec
+ [ Certificate.linear_prover Certificate.q_spec, "fourier refutation" ] gl
+
+let romicron gl =
+ micromega_gen parse_rarith Mc.cnf_negate Mc.cnf_normalise rz_domain_spec
+ [ Certificate.linear_prover Certificate.z_spec, "fourier refutation" ] gl
+
+
+let rmicromega i gl =
+ micromega_gen parse_rarith Mc.negate Mc.normalise rz_domain_spec
+ [ call_csdpcert ("real_nonlinear_prover", Some i), "fourier refutation" ] gl
+
+
+let micromega i gl =
+ micromega_gen parse_zarith Mc.negate Mc.normalise zz_domain_spec
+ [lift_ratproof (call_csdpcert ("real_nonlinear_prover",Some i)),
+ "fourier refutation" ] gl
+
+
+let sos gl =
+ micromega_gen parse_zarith Mc.negate Mc.normalise zz_domain_spec
+ [lift_ratproof (call_csdpcert ("pure_sos", None)), "pure sos refutation"] gl
+
+let zomicron gl =
+ micromega_gen parse_zarith Mc.negate Mc.normalise zz_domain_spec
+ [Certificate.zlinear_prover, "zprover"] gl
diff --git a/contrib/micromega/csdpcert.ml b/contrib/micromega/csdpcert.ml
new file mode 100644
index 000000000..cfaf6ae1a
--- /dev/null
+++ b/contrib/micromega/csdpcert.ml
@@ -0,0 +1,333 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+open Big_int
+open Num
+open Sos
+
+module Mc = Micromega
+module Ml2C = Mutils.CamlToCoq
+module C2Ml = Mutils.CoqToCaml
+
+let debug = false
+
+module M =
+struct
+ open Mc
+
+ let rec expr_to_term = function
+ | PEc z -> Const (Big_int (C2Ml.z_big_int z))
+ | PEX v -> Var ("x"^(string_of_int (C2Ml.index v)))
+ | PEmul(p1,p2) ->
+ let p1 = expr_to_term p1 in
+ let p2 = expr_to_term p2 in
+ let res = Mul(p1,p2) in res
+
+ | PEadd(p1,p2) -> Add(expr_to_term p1, expr_to_term p2)
+ | PEsub(p1,p2) -> Sub(expr_to_term p1, expr_to_term p2)
+ | PEpow(p,n) -> Pow(expr_to_term p , C2Ml.n n)
+ | PEopp p -> Opp (expr_to_term p)
+
+
+ let rec term_to_expr = function
+ | Const n -> PEc (Ml2C.bigint (big_int_of_num n))
+ | Zero -> PEc ( Z0)
+ | Var s -> PEX (Ml2C.index
+ (int_of_string (String.sub s 1 (String.length s - 1))))
+ | Mul(p1,p2) -> PEmul(term_to_expr p1, term_to_expr p2)
+ | Add(p1,p2) -> PEadd(term_to_expr p1, term_to_expr p2)
+ | Opp p -> PEopp (term_to_expr p)
+ | Pow(t,n) -> PEpow (term_to_expr t,Ml2C.n n)
+ | Sub(t1,t2) -> PEsub (term_to_expr t1, term_to_expr t2)
+ | _ -> failwith "term_to_expr: not implemented"
+
+ let term_to_expr e =
+ let e' = term_to_expr e in
+ if debug
+ then Printf.printf "term_to_expr : %s - %s\n"
+ (string_of_poly (poly_of_term e))
+ (string_of_poly (poly_of_term (expr_to_term e')));
+ e'
+
+end
+open M
+
+open List
+open Mutils
+
+let rec scale_term t =
+ match t with
+ | Zero -> unit_big_int , Zero
+ | Const n -> (denominator n) , Const (Big_int (numerator n))
+ | Var n -> unit_big_int , Var n
+ | Inv _ -> failwith "scale_term : not implemented"
+ | Opp t -> let s, t = scale_term t in s, Opp t
+ | Add(t1,t2) -> let s1,y1 = scale_term t1 and s2,y2 = scale_term t2 in
+ let g = gcd_big_int s1 s2 in
+ let s1' = div_big_int s1 g in
+ let s2' = div_big_int s2 g in
+ let e = mult_big_int g (mult_big_int s1' s2') in
+ if (compare_big_int e unit_big_int) = 0
+ then (unit_big_int, Add (y1,y2))
+ else e, Add (Mul(Const (Big_int s2'), y1),
+ Mul (Const (Big_int s1'), y2))
+ | Sub _ -> failwith "scale term: not implemented"
+ | Mul(y,z) -> let s1,y1 = scale_term y and s2,y2 = scale_term z in
+ mult_big_int s1 s2 , Mul (y1, y2)
+ | Pow(t,n) -> let s,t = scale_term t in
+ power_big_int_positive_int s n , Pow(t,n)
+ | _ -> failwith "scale_term : not implemented"
+
+let scale_term t =
+ let (s,t') = scale_term t in
+ s,t'
+
+
+
+
+let rec scale_certificate pos = match pos with
+ | Axiom_eq i -> unit_big_int , Axiom_eq i
+ | Axiom_le i -> unit_big_int , Axiom_le i
+ | Axiom_lt i -> unit_big_int , Axiom_lt i
+ | Monoid l -> unit_big_int , Monoid l
+ | Rational_eq n -> (denominator n) , Rational_eq (Big_int (numerator n))
+ | Rational_le n -> (denominator n) , Rational_le (Big_int (numerator n))
+ | Rational_lt n -> (denominator n) , Rational_lt (Big_int (numerator n))
+ | Square t -> let s,t' = scale_term t in
+ mult_big_int s s , Square t'
+ | Eqmul (t, y) -> let s1,y1 = scale_term t and s2,y2 = scale_certificate y in
+ mult_big_int s1 s2 , Eqmul (y1,y2)
+ | Sum (y, z) -> let s1,y1 = scale_certificate y
+ and s2,y2 = scale_certificate z in
+ let g = gcd_big_int s1 s2 in
+ let s1' = div_big_int s1 g in
+ let s2' = div_big_int s2 g in
+ mult_big_int g (mult_big_int s1' s2'),
+ Sum (Product(Rational_le (Big_int s2'), y1),
+ Product (Rational_le (Big_int s1'), y2))
+ | Product (y, z) ->
+ let s1,y1 = scale_certificate y and s2,y2 = scale_certificate z in
+ mult_big_int s1 s2 , Product (y1,y2)
+
+
+let is_eq = function Mc.Equal -> true | _ -> false
+let is_le = function Mc.NonStrict -> true | _ -> false
+let is_lt = function Mc.Strict -> true | _ -> false
+
+let get_index_of_ith_match f i l =
+ let rec get j res l =
+ match l with
+ | [] -> failwith "bad index"
+ | e::l -> if f e
+ then
+ (if j = i then res else get (j+1) (res+1) l )
+ else get j (res+1) l in
+ get 0 0 l
+
+
+let cert_of_pos eq le lt ll l pos =
+ let s,pos = (scale_certificate pos) in
+ let rec _cert_of_pos = function
+ Axiom_eq i -> let idx = get_index_of_ith_match is_eq i l in
+ Mc.S_In (Ml2C.nat idx)
+ | Axiom_le i -> let idx = get_index_of_ith_match is_le i l in
+ Mc.S_In (Ml2C.nat idx)
+ | Axiom_lt i -> let idx = get_index_of_ith_match is_lt i l in
+ Mc.S_In (Ml2C.nat idx)
+ | Monoid l -> Mc.S_Monoid (Ml2C.list Ml2C.nat l)
+ | Rational_eq n | Rational_le n | Rational_lt n ->
+ if compare_num n (Int 0) = 0 then Mc.S_Z else
+ Mc.S_Pos (Ml2C.bigint (big_int_of_num n))
+ | Square t -> Mc.S_Square (term_to_expr t)
+ | Eqmul (t, y) -> Mc.S_Ideal(term_to_expr t, _cert_of_pos y)
+ | Sum (y, z) -> Mc.S_Add (_cert_of_pos y, _cert_of_pos z)
+ | Product (y, z) -> Mc.S_Mult (_cert_of_pos y, _cert_of_pos z) in
+ s, Certificate.simplify_cone Certificate.z_spec (_cert_of_pos pos)
+
+
+let term_of_cert l pos =
+ let l = List.map fst' l in
+ let rec _cert_of_pos = function
+ | Mc.S_In i -> expr_to_term (List.nth l (C2Ml.nat i))
+ | Mc.S_Pos p -> Const (C2Ml.num p)
+ | Mc.S_Z -> Const (Int 0)
+ | Mc.S_Square t -> Mul(expr_to_term t, expr_to_term t)
+ | Mc.S_Monoid m -> List.fold_right
+ (fun x m -> Mul (expr_to_term (List.nth l (C2Ml.nat x)),m))
+ (C2Ml.list (fun x -> x) m) (Const (Int 1))
+ | Mc.S_Ideal (t, y) -> Mul(expr_to_term t, _cert_of_pos y)
+ | Mc.S_Add (y, z) -> Add (_cert_of_pos y, _cert_of_pos z)
+ | Mc.S_Mult (y, z) -> Mul (_cert_of_pos y, _cert_of_pos z) in
+ (_cert_of_pos pos)
+
+let rec canonical_sum_to_string = function s -> failwith "not implemented"
+
+let print_canonical_sum m = Format.print_string (canonical_sum_to_string m)
+
+let print_list_term l =
+ print_string "print_list_term\n";
+ List.iter (fun (Mc.Pair(e,k)) -> Printf.printf "q: %s %s ;"
+ (string_of_poly (poly_of_term (expr_to_term e)))
+ (match k with
+ Mc.Equal -> "= "
+ | Mc.Strict -> "> "
+ | Mc.NonStrict -> ">= "
+ | _ -> failwith "not_implemented")) l ;
+ print_string "\n"
+
+
+let partition_expr l =
+ let rec f i = function
+ | [] -> ([],[],[])
+ | Mc.Pair(e,k)::l ->
+ let (eq,ge,neq) = f (i+1) l in
+ match k with
+ | Mc.Equal -> ((e,i)::eq,ge,neq)
+ | Mc.NonStrict -> (eq,(e,Axiom_le i)::ge,neq)
+ | Mc.Strict -> (* e > 0 == e >= 0 /\ e <> 0 *)
+ (eq, (e,Axiom_lt i)::ge,(e,Axiom_lt i)::neq)
+ | Mc.NonEqual -> (eq,ge,(e,Axiom_eq i)::neq)
+ (* Not quite sure -- Coq interface has changed *)
+ in f 0 l
+
+
+let rec sets_of_list l =
+ match l with
+ | [] -> [[]]
+ | e::l -> let s = sets_of_list l in
+ s@(List.map (fun s0 -> e::s0) s)
+
+let cert_of_pos pos =
+ let s,pos = (scale_certificate pos) in
+ let rec _cert_of_pos = function
+ Axiom_eq i -> Mc.S_In (Ml2C.nat i)
+ | Axiom_le i -> Mc.S_In (Ml2C.nat i)
+ | Axiom_lt i -> Mc.S_In (Ml2C.nat i)
+ | Monoid l -> Mc.S_Monoid (Ml2C.list Ml2C.nat l)
+ | Rational_eq n | Rational_le n | Rational_lt n ->
+ if compare_num n (Int 0) = 0 then Mc.S_Z else
+ Mc.S_Pos (Ml2C.bigint (big_int_of_num n))
+ | Square t -> Mc.S_Square (term_to_expr t)
+ | Eqmul (t, y) -> Mc.S_Ideal(term_to_expr t, _cert_of_pos y)
+ | Sum (y, z) -> Mc.S_Add (_cert_of_pos y, _cert_of_pos z)
+ | Product (y, z) -> Mc.S_Mult (_cert_of_pos y, _cert_of_pos z) in
+ s, Certificate.simplify_cone Certificate.z_spec (_cert_of_pos pos)
+
+(* The exploration is probably not complete - for simple cases, it works... *)
+let real_nonlinear_prover d l =
+ try
+ let (eq,ge,neq) = partition_expr l in
+
+ let rec elim_const = function
+ [] -> []
+ | (x,y)::l -> let p = poly_of_term (expr_to_term x) in
+ if poly_isconst p
+ then elim_const l
+ else (p,y)::(elim_const l) in
+
+ let eq = elim_const eq in
+ let peq = List.map fst eq in
+
+ let pge = List.map
+ (fun (e,psatz) -> poly_of_term (expr_to_term e),psatz) ge in
+
+ let monoids = List.map (fun m -> (List.fold_right (fun (p,kd) y ->
+ let p = poly_of_term (expr_to_term p) in
+ match kd with
+ | Axiom_lt i -> poly_mul p y
+ | Axiom_eq i -> poly_mul (poly_pow p 2) y
+ | _ -> failwith "monoids") m (poly_const (Int 1)) , map snd m))
+ (sets_of_list neq) in
+
+ let (cert_ideal, cert_cone,monoid) = deepen_until d (fun d ->
+ list_try_find (fun m -> let (ci,cc) =
+ real_positivnullstellensatz_general false d peq pge (poly_neg (fst m) ) in
+ (ci,cc,snd m)) monoids) 0 in
+
+ let proofs_ideal = map2 (fun q i -> Eqmul(term_of_poly q,Axiom_eq i))
+ cert_ideal (List.map snd eq) in
+
+ let proofs_cone = map term_of_sos cert_cone in
+
+ let proof_ne =
+ let (neq , lt) = List.partition
+ (function Axiom_eq _ -> true | _ -> false ) monoid in
+ let sq = match
+ (List.map (function Axiom_eq i -> i | _ -> failwith "error") neq)
+ with
+ | [] -> Rational_lt (Int 1)
+ | l -> Monoid l in
+ List.fold_right (fun x y -> Product(x,y)) lt sq in
+
+ let proof = list_fold_right_elements
+ (fun s t -> Sum(s,t)) (proof_ne :: proofs_ideal @ proofs_cone) in
+
+ let s,proof' = scale_certificate proof in
+ let cert = snd (cert_of_pos proof') in
+ if debug
+ then Printf.printf "cert poly : %s\n"
+ (string_of_poly (poly_of_term (term_of_cert l cert)));
+ match Mc.zWeakChecker (Ml2C.list (fun x -> x) l) cert with
+ | Mc.True -> Some cert
+ | Mc.False -> (print_string "buggy certificate" ; flush stdout) ;None
+ with
+ | Sos.TooDeep -> None
+
+
+(* This is somewhat buggy, over Z, strict inequality vanish... *)
+let pure_sos l =
+ (* If there is no strict inequality,
+ I should nonetheless be able to try something - over Z > is equivalent to -1 >= *)
+ try
+ let l = List.combine l (interval 0 (length l -1)) in
+ let (lt,i) = try (List.find (fun (x,_) -> snd' x = Mc.Strict) l)
+ with Not_found -> List.hd l in
+ let plt = poly_neg (poly_of_term (expr_to_term (fst' lt))) in
+ let (n,polys) = sumofsquares plt in (* n * (ci * pi^2) *)
+ let pos = Product (Rational_lt n,
+ List.fold_right (fun (c,p) rst -> Sum (Product (Rational_lt c, Square
+ (term_of_poly p)), rst))
+ polys (Rational_lt (Int 0))) in
+ let proof = Sum(Axiom_lt i, pos) in
+ let s,proof' = scale_certificate proof in
+ let cert = snd (cert_of_pos proof') in
+ Some cert
+ with
+ | Not_found -> (* This is no strict inequality *) None
+ | x -> None
+
+
+type micromega_polys = (Micromega.z Mc.pExpr, Mc.op1) Micromega.prod list
+type csdp_certificate = Certificate.Mc.z Certificate.Mc.coneMember option
+type provername = string * int option
+
+let main () =
+ if Array.length Sys.argv <> 3 then
+ (Printf.printf "Usage: csdpcert inputfile outputfile\n"; exit 1);
+ let input_file = Sys.argv.(1) in
+ let output_file = Sys.argv.(2) in
+ let inch = open_in input_file in
+ let (prover,poly) = (input_value inch : provername * micromega_polys) in
+ close_in inch;
+ let cert =
+ match prover with
+ | "real_nonlinear_prover", Some d -> real_nonlinear_prover d poly
+ | "pure_sos", None -> pure_sos poly
+ | prover, _ -> (Printf.printf "unknown prover: %s\n" prover; exit 1) in
+ let outch = open_out output_file in
+ output_value outch (cert:csdp_certificate);
+ close_out outch;
+ exit 0;;
+
+let _ = main () in ()
diff --git a/contrib/micromega/g_micromega.ml4 b/contrib/micromega/g_micromega.ml4
new file mode 100644
index 000000000..3ea49dada
--- /dev/null
+++ b/contrib/micromega/g_micromega.ml4
@@ -0,0 +1,59 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+(*i camlp4deps: "parsing/grammar.cma" i*)
+
+(* $Id:$ *)
+
+open Quote
+open Ring
+open Mutils
+open Rawterm
+open Util
+
+let out_arg = function
+ | ArgVar _ -> anomaly "Unevaluated or_var variable"
+ | ArgArg x -> x
+
+TACTIC EXTEND Micromega
+| [ "micromegap" int_or_var(i) ] -> [ Coq_micromega.micromega (out_arg i) ]
+| [ "micromegap" ] -> [ Coq_micromega.micromega (-1) ]
+END
+
+TACTIC EXTEND Sos
+[ "sosp" ] -> [ Coq_micromega.sos]
+END
+
+
+TACTIC EXTEND Omicron
+[ "omicronp" ] -> [ Coq_micromega.omicron]
+END
+
+TACTIC EXTEND QOmicron
+[ "qomicronp" ] -> [ Coq_micromega.qomicron]
+END
+
+
+TACTIC EXTEND ZOmicron
+[ "zomicronp" ] -> [ Coq_micromega.zomicron]
+END
+
+TACTIC EXTEND ROmicron
+[ "romicronp" ] -> [ Coq_micromega.romicron]
+END
+
+TACTIC EXTEND RMicromega
+| [ "rmicromegap" int_or_var(i) ] -> [ Coq_micromega.rmicromega (out_arg i) ]
+| [ "rmicromegap" ] -> [ Coq_micromega.rmicromega (-1) ]
+END
diff --git a/contrib/micromega/mfourier.ml b/contrib/micromega/mfourier.ml
new file mode 100644
index 000000000..415d3a3e2
--- /dev/null
+++ b/contrib/micromega/mfourier.ml
@@ -0,0 +1,667 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+(* Yet another implementation of Fourier *)
+open Num
+
+module Cmp =
+ (* How to compare pairs, lists ... *)
+struct
+ let rec compare_lexical l =
+ match l with
+ | [] -> 0 (* Equal *)
+ | f::l ->
+ let cmp = f () in
+ if cmp = 0 then compare_lexical l else cmp
+
+ let rec compare_list cmp l1 l2 =
+ match l1 , l2 with
+ | [] , [] -> 0
+ | [] , _ -> -1
+ | _ , [] -> 1
+ | e1::l1 , e2::l2 ->
+ let c = cmp e1 e2 in
+ if c = 0 then compare_list cmp l1 l2 else c
+
+ let hash_list hash l =
+ let rec xhash res l =
+ match l with
+ | [] -> res
+ | e::l -> xhash ((hash e) lxor res) l in
+ xhash (Hashtbl.hash []) l
+
+end
+
+module Interval =
+struct
+ (** The type of intervals. **)
+ type intrvl = Empty | Point of num | Itv of num option * num option
+
+ (**
+ Different intervals can denote the same set of variables e.g.,
+ Point n && Itv (Some n, Some n)
+ Itv (Some x) (Some y) && Empty if x > y
+ see the 'belongs_to' function.
+ **)
+
+ (* The set of numerics that belong to an interval *)
+ let belongs_to n = function
+ | Empty -> false
+ | Point x -> n =/ x
+ | Itv(Some x, Some y) -> x <=/ n && n <=/ y
+ | Itv(None,Some y) -> n <=/ y
+ | Itv(Some x,None) -> x <=/ n
+ | Itv(None,None) -> true
+
+ let string_of_bound = function
+ | None -> "oo"
+ | Some n -> Printf.sprintf "Bd(%s)" (string_of_num n)
+
+ let string_of_intrvl = function
+ | Empty -> "[]"
+ | Point n -> Printf.sprintf "[%s]" (string_of_num n)
+ | Itv(bd1,bd2) ->
+ Printf.sprintf "[%s,%s]" (string_of_bound bd1) (string_of_bound bd2)
+
+ let pick_closed_to_zero = function
+ | Empty -> None
+ | Point n -> Some n
+ | Itv(None,None) -> Some (Int 0)
+ | Itv(None,Some i) ->
+ Some (if (Int 0) <=/ (floor_num i) then Int 0 else floor_num i)
+ | Itv(Some i,None) ->
+ Some (if i <=/ (Int 0) then Int 0 else ceiling_num i)
+ | Itv(Some i,Some j) ->
+ Some (
+ if i <=/ Int 0 && Int 0 <=/ j
+ then Int 0
+ else if ceiling_num i <=/ floor_num j
+ then ceiling_num i (* why not *) else i)
+
+ type status =
+ | O | Qonly | Z | Q
+
+ let interval_kind = function
+ | Empty -> O
+ | Point n -> if ceiling_num n =/ n then Z else Qonly
+ | Itv(None,None) -> Z
+ | Itv(None,Some i) -> if ceiling_num i <>/ i then Q else Z
+ | Itv(Some i,None) -> if ceiling_num i <>/ i then Q else Z
+ | Itv(Some i,Some j) ->
+ if ceiling_num i <>/ i or floor_num j <>/ j then Q else Z
+
+ let empty_z = function
+ | Empty -> true
+ | Point n -> ceiling_num n <>/ n
+ | Itv(None,None) | Itv(None,Some _) | Itv(Some _,None) -> false
+ | Itv(Some i,Some j) -> ceiling_num i >/ floor_num j
+
+
+ let normalise b1 b2 =
+ match b1 , b2 with
+ | Some i , Some j ->
+ (match compare_num i j with
+ | 1 -> Empty
+ | 0 -> Point i
+ | _ -> Itv(b1,b2)
+ )
+ | _ -> Itv(b1,b2)
+
+
+
+ let min x y =
+ match x , y with
+ | None , x | x , None -> x
+ | Some i , Some j -> Some (min_num i j)
+
+ let max x y =
+ match x , y with
+ | None , x | x , None -> x
+ | Some i , Some j -> Some (max_num i j)
+
+ let inter i1 i2 =
+ match i1,i2 with
+ | Empty , _ -> Empty
+ | _ , Empty -> Empty
+ | Point n , Point m -> if n =/ m then i1 else Empty
+ | Point n , Itv (mn,mx) | Itv (mn,mx) , Point n->
+ if (match mn with
+ | None -> true
+ | Some mn -> mn <=/ n) &&
+ (match mx with
+ | None -> true
+ | Some mx -> n <=/ mx) then Point n else Empty
+ | Itv (min1,max1) , Itv (min2,max2) ->
+ let bmin = max min1 min2
+ and bmax = min max1 max2 in
+ normalise bmin bmax
+
+ (* a.x >= b*)
+ let bound_of_constraint (a,b) =
+ match compare_num a (Int 0) with
+ | 0 ->
+ if compare_num b (Int 0) = 1
+ then Empty
+ (*actually this is a contradiction failwith "bound_of_constraint" *)
+ else Itv (None,None)
+ | 1 -> Itv (Some (div_num b a),None)
+ | -1 -> Itv (None, Some (div_num b a))
+ | x -> failwith "bound_of_constraint(2)"
+
+
+ let bounded x =
+ match x with
+ | Itv(None,_) | Itv(_,None) -> false
+ | _ -> true
+
+
+ let range = function
+ | Empty -> Some (Int 0)
+ | Point n -> Some (Int (if ceiling_num n =/ n then 1 else 0))
+ | Itv(None,_) | Itv(_,None)-> None
+ | Itv(Some i,Some j) -> Some (floor_num j -/ceiling_num i +/ (Int 1))
+
+ (* Returns the interval of smallest range *)
+ let smaller_itv i1 i2 =
+ match range i1 , range i2 with
+ | None , _ -> false
+ | _ , None -> true
+ | Some i , Some j -> i <=/ j
+
+end
+open Interval
+
+(* A set of constraints *)
+module Sys(V:Vector.S) (* : Vector.SystemS with module Vect = V*) =
+struct
+
+ module Vect = V
+
+ module Cstr = Vector.Cstr(V)
+ open Cstr
+
+
+ module CMap = Map.Make(
+ struct
+ type t = Vect.t
+ let compare = Vect.compare
+ end)
+
+ module CstrBag =
+ struct
+
+ type mut_itv = { mutable itv : intrvl}
+
+ type t = mut_itv CMap.t
+
+ exception Contradiction
+
+ let cstr_to_itv cstr =
+ let (n,l) = V.normalise cstr.coeffs in
+ if n =/ (Int 0)
+ then (Vect.null, bound_of_constraint (Int 0,cstr.cst)) (* Might be empty *)
+ else
+ match cstr.op with
+ | Eq -> let n = cstr.cst // n in (l, Point n)
+ | Ge ->
+ match compare_num n (Int 0) with
+ | 0 -> failwith "intrvl_of_constraint"
+ | 1 -> (l,Itv (Some (cstr.cst // n), None))
+ | -1 -> (l, Itv(None,Some (cstr.cst // n)))
+ | _ -> failwith "cstr_to_itv"
+
+
+ let empty = CMap.empty
+
+
+
+
+ let is_empty = CMap.is_empty
+
+ let find_vect v bag =
+ try
+ (bag,CMap.find v bag)
+ with Not_found -> let x = { itv = Itv(None,None)} in (CMap.add v x bag ,x)
+
+
+ let add (v,b) bag =
+ match b with
+ | Empty -> raise Contradiction
+ | Itv(None,None) -> bag
+ | _ ->
+ let (bag,intrl) = find_vect v bag in
+ match inter b intrl.itv with
+ | Empty -> raise Contradiction
+ | itv -> intrl.itv <- itv ; bag
+
+ exception Found of cstr
+
+ let find_equation bag =
+ try
+ CMap.fold (fun v i () ->
+ match i.itv with
+ | Point n -> let e = {coeffs = v ; op = Eq ; cst = n}
+ in raise (Found e)
+ | _ -> () ) bag () ; None
+ with Found c -> Some c
+
+
+ let fold f bag acc =
+ CMap.fold (fun v itv acc ->
+ match itv.itv with
+ | Empty | Itv(None,None) -> failwith "fold Empty"
+ | Itv(None ,Some i) ->
+ f {coeffs = V.mul (Int (-1)) v ; op = Ge ; cst = minus_num i} acc
+ | Point n -> f {coeffs = v ; op = Eq ; cst = n} acc
+ | Itv(x,y) ->
+ (match x with
+ | None -> (fun x -> x)
+ | Some i -> f {coeffs = v ; op = Ge ; cst = i})
+ (match y with
+ | None -> acc
+ | Some i ->
+ f {coeffs = V.mul (Int (-1)) v ; op = Ge ; cst = minus_num i} acc
+ ) ) bag acc
+
+
+ let remove l _ = failwith "remove:Not implemented"
+
+ module Map =
+ Map.Make(
+ struct
+ type t = int
+ let compare : int -> int -> int = Pervasives.compare
+ end)
+
+ let split f (t:t) =
+ let res =
+ fold (fun e m -> let i = f e in
+ Map.add i (add (cstr_to_itv e)
+ (try Map.find i m with
+ Not_found -> empty)) m) t Map.empty in
+ (fun i -> try Map.find i res with Not_found -> empty)
+
+ type map = (int list * int list) Map.t
+
+
+ let status (b:t) =
+ let _ , map = fold (fun c ( (idx:int),(res: map)) ->
+ ( idx + 1,
+ List.fold_left (fun (res:map) (pos,s) ->
+ let (lp,ln) = try Map.find pos res with Not_found -> ([],[]) in
+ match s with
+ | Vect.Pos -> Map.add pos (idx::lp,ln) res
+ | Vect.Neg ->
+ Map.add pos (lp, idx::ln) res) res
+ (Vect.status c.coeffs))) b (0,Map.empty) in
+ Map.fold (fun k e res -> (k,e)::res) map []
+
+
+ type it = num CMap.t
+
+ let iterator x = x
+
+ let element it = failwith "element:Not implemented"
+
+ end
+end
+
+module Fourier(Vect : Vector.S) =
+struct
+ module Vect = Vect
+ module Sys = Sys( Vect)
+ module Cstr = Sys.Cstr
+ module Bag = Sys.CstrBag
+
+ open Cstr
+ open Sys
+
+ let debug = false
+
+ let print_bag msg b =
+ print_endline msg;
+ CstrBag.fold (fun e () -> print_endline (Cstr.string_of_cstr e)) b ()
+
+ let print_bag_file file msg b =
+ let f = open_out file in
+ output_string f msg;
+ CstrBag.fold (fun e () ->
+ Printf.fprintf f "%s\n" (Cstr.string_of_cstr e)) b ()
+
+
+ (* A system with only inequations --
+ *)
+ let partition i m =
+ let splitter cstr = compare_num (Vect.get i cstr.coeffs ) (Int 0) in
+ let split = CstrBag.split splitter m in
+ (split (-1) , split 0, split 1)
+
+
+ (* op of the result is arbitrary Ge *)
+ let lin_comb n1 c1 n2 c2 =
+ { coeffs = Vect.lin_comb n1 c1.coeffs n2 c2.coeffs ;
+ op = Ge ;
+ cst = (n1 */ c1.cst) +/ (n2 */ c2.cst)}
+
+ (* BUG? : operator of the result ? *)
+
+ let combine_project i c1 c2 =
+ let p = Vect.get i c1.coeffs
+ and n = Vect.get i c2.coeffs in
+ assert (n </ Int 0 && p >/ Int 0) ;
+ let nopp = minus_num n in
+ let c =lin_comb nopp c1 p c2 in
+ let op = if c1.op = Ge || c2.op = Ge then Ge else Eq in
+ CstrBag.cstr_to_itv {coeffs = c.coeffs ; op = op ; cst= c.cst }
+
+
+ let project i m =
+ let (neg,zero,pos) = partition i m in
+ let project1 cpos acc =
+ CstrBag.fold (fun cneg res ->
+ CstrBag.add (combine_project i cpos cneg) res) neg acc in
+ (CstrBag.fold project1 pos zero)
+
+ (* Given a vector [x1 -> v1; ... ; xn -> vn]
+ and a constraint {x1 ; .... xn >= c }
+ *)
+ let evaluate_constraint i map cstr =
+ let {coeffs = _coeffs ; op = _op ; cst = _cst} = cstr in
+ let vi = Vect.get i _coeffs in
+ let v = Vect.set i (Int 0) _coeffs in
+ (vi, _cst -/ Vect.dotp map v)
+
+
+ let rec bounds m itv =
+ match m with
+ | [] -> itv
+ | e::m -> bounds m (inter itv (bound_of_constraint e))
+
+
+
+ let compare_status (i,(lp,ln)) (i',(lp',ln')) =
+ let cmp = Pervasives.compare
+ ((List.length lp) * (List.length ln))
+ ((List.length lp') * (List.length ln')) in
+ if cmp = 0
+ then Pervasives.compare i i'
+ else cmp
+
+ let cardinal m = CstrBag.fold (fun _ x -> x + 1) m 0
+
+ let lightest_projection l c m =
+ let bound = c in
+ if debug then (Printf.printf "l%i" bound; flush stdout) ;
+ let rec xlight best l =
+ match l with
+ | [] -> best
+ | i::l ->
+ let proj = (project i m) in
+ let cproj = cardinal proj in
+ (*Printf.printf " p %i " cproj; flush stdout;*)
+ match best with
+ | None ->
+ if cproj < bound
+ then Some(cproj,proj,i)
+ else xlight (Some(cproj,proj,i)) l
+ | Some (cbest,_,_) ->
+ if cproj < cbest
+ then
+ if cproj < bound then Some(cproj,proj,i)
+ else xlight (Some(cproj,proj,i)) l
+ else xlight best l in
+ match xlight None l with
+ | None -> None
+ | Some(_,p,i) -> Some (p,i)
+
+
+
+ exception Equality of cstr
+
+ let find_equality m = Bag.find_equation m
+
+
+
+ let pivot (n,v) eq ge =
+ assert (eq.op = Eq) ;
+ let res =
+ match
+ compare_num v (Int 0),
+ compare_num (Vect.get n ge.coeffs) (Int 0)
+ with
+ | 0 , _ -> failwith "Buggy"
+ | _ ,0 -> (CstrBag.cstr_to_itv ge)
+ | 1 , -1 -> combine_project n eq ge
+ | -1 , 1 -> combine_project n ge eq
+ | 1 , 1 ->
+ combine_project n ge
+ {coeffs = Vect.mul (Int (-1)) eq.coeffs;
+ op = eq.op ;
+ cst = minus_num eq.cst}
+ | -1 , -1 ->
+ combine_project n
+ {coeffs = Vect.mul (Int (-1)) eq.coeffs;
+ op = eq.op ; cst = minus_num eq.cst} ge
+ | _ -> failwith "pivot" in
+ res
+
+ let check_cstr v c =
+ let {coeffs = _coeffs ; op = _op ; cst = _cst} = c in
+ let vl = Vect.dotp v _coeffs in
+ match _op with
+ | Eq -> vl =/ _cst
+ | Ge -> vl >= _cst
+
+
+ let forall p sys =
+ try
+ CstrBag.fold (fun c () -> if p c then () else raise Not_found) sys (); true
+ with Not_found -> false
+
+
+ let check_sys v sys = forall (check_cstr v) sys
+
+ let check_null_cstr c =
+ let {coeffs = _coeffs ; op = _op ; cst = _cst} = c in
+ match _op with
+ | Eq -> (Int 0) =/ _cst
+ | Ge -> (Int 0) >= _cst
+
+ let check_null sys = forall check_null_cstr sys
+
+
+ let optimise_ge
+ quick_check choose choose_idx return_empty return_ge return_eq m =
+ let c = cardinal m in
+ let bound = 2 * c in
+ if debug then (Printf.printf "optimise_ge: %i\n" c; flush stdout);
+
+ let rec xoptimise m =
+ if debug then (Printf.printf "x%i" (cardinal m) ; flush stdout);
+ if debug then (print_bag "xoptimise" m ; flush stdout);
+ if quick_check m
+ then return_empty m
+ else
+ match find_equality m with
+ | None -> xoptimise_ge m
+ | Some eq -> xoptimise_eq eq m
+
+ and xoptimise_ge m =
+ begin
+ let c = cardinal m in
+ let l = List.map fst (List.sort compare_status (CstrBag.status m)) in
+ let idx = choose bound l c m in
+ match idx with
+ | None -> return_empty m
+ | Some (proj,i) ->
+ match xoptimise proj with
+ | None -> None
+ | Some mapping -> return_ge m i mapping
+ end
+ and xoptimise_eq eq m =
+ let l = List.map fst (Vect.status eq.coeffs) in
+ match choose_idx l with
+ | None -> (*if l = [] then None else*) return_empty m
+ | Some i ->
+ let p = (i,Vect.get i eq.coeffs) in
+ let m' = CstrBag.fold
+ (fun ge res -> CstrBag.add (pivot p eq ge) res) m CstrBag.empty in
+ match xoptimise ( m') with
+ | None -> None
+ | Some mapp -> return_eq m eq i mapp in
+ try
+ let res = xoptimise m in res
+ with CstrBag.Contradiction -> (*print_string "contradiction" ;*) None
+
+
+
+ let minimise m =
+ let opt_zero_choose bound l c m =
+ if c > bound
+ then lightest_projection l c m
+ else match l with
+ | [] -> None
+ | i::_ -> Some (project i m, i) in
+
+ let choose_idx = function [] -> None | x::l -> Some x in
+
+ let opt_zero_return_empty m = Some Vect.null in
+
+
+ let opt_zero_return_ge m i mapping =
+ let (it:intrvl) = CstrBag.fold (fun cstr itv -> Interval.inter
+ (bound_of_constraint (evaluate_constraint i mapping cstr)) itv) m
+ (Itv (None, None)) in
+ match pick_closed_to_zero it with
+ | None -> print_endline "Cannot pick" ; None
+ | Some v ->
+ let res = (Vect.set i v mapping) in
+ if debug
+ then Printf.printf "xoptimise res %i [%s]" i (Vect.string res) ;
+ Some res in
+
+ let opt_zero_return_eq m eq i mapp =
+ let (a,b) = evaluate_constraint i mapp eq in
+ Some (Vect.set i (div_num b a) mapp) in
+
+ optimise_ge check_null opt_zero_choose
+ choose_idx opt_zero_return_empty opt_zero_return_ge opt_zero_return_eq m
+
+ let normalise cstr = [CstrBag.cstr_to_itv cstr]
+
+ let find_point l =
+ (* List.iter (fun e -> print_endline (Cstr.string_of_cstr e)) l;*)
+ try
+ let m = List.fold_left (fun sys e -> CstrBag.add (CstrBag.cstr_to_itv e) sys)
+ CstrBag.empty l in
+ match minimise m with
+ | None -> None
+ | Some res ->
+ if debug then Printf.printf "[%s]" (Vect.string res);
+ Some res
+ with CstrBag.Contradiction -> None
+
+
+ let find_q_interval_for x m =
+ if debug then Printf.printf "find_q_interval_for %i\n" x ;
+
+ let choose bound l c m =
+ let rec xchoose l =
+ match l with
+ | [] -> None
+ | i::l -> if i = x then xchoose l else Some (project i m,i) in
+ xchoose l in
+
+ let rec choose_idx = function
+ [] -> None
+ | e::l -> if e = x then choose_idx l else Some e in
+
+ let return_empty m = (* Beurk *)
+ (* returns the interval of x *)
+ Some (CstrBag.fold (fun cstr itv ->
+ let i = if cstr.op = Eq
+ then Point (cstr.cst // Vect.get x cstr.coeffs)
+ else if Vect.is_null (Vect.set x (Int 0) cstr.coeffs)
+ then bound_of_constraint (Vect.get x cstr.coeffs , cstr.cst)
+ else itv
+ in
+ Interval.inter i itv) m (Itv (None, None))) in
+
+ let return_ge m i res = Some res in
+
+ let return_eq m eq i res = Some res in
+
+ try
+ optimise_ge
+ (fun x -> false) choose choose_idx return_empty return_ge return_eq m
+ with CstrBag.Contradiction -> None
+
+
+ let find_q_intervals sys =
+ let variables =
+ List.map fst (List.sort compare_status (CstrBag.status sys)) in
+ List.map (fun x -> (x,find_q_interval_for x sys)) variables
+
+ let pp_option f o = function
+ None -> Printf.fprintf o "None"
+ | Some x -> Printf.fprintf o "Some %a" f x
+
+ let optimise vect sys =
+ (* we have to modify the system with a dummy variable *)
+ let fresh =
+ List.fold_left (fun fr c -> Pervasives.max fr (Vect.fresh c.coeffs)) 0 sys in
+ assert (List.for_all (fun x -> Vect.get fresh x.coeffs =/ Int 0) sys);
+ let cstr = {
+ coeffs = Vect.set fresh (Int (-1)) vect ;
+ op = Eq ;
+ cst = (Int 0)} in
+ try
+ find_q_interval_for fresh
+ (List.fold_left
+ (fun bg c -> CstrBag.add (CstrBag.cstr_to_itv c) bg)
+ CstrBag.empty (cstr::sys))
+ with CstrBag.Contradiction -> None
+
+
+ let optimise vect sys =
+ let res = optimise vect sys in
+ if debug
+ then Printf.printf "optimise %s -> %a\n"
+ (Vect.string vect) (pp_option (fun o x -> Printf.printf "%s" (string_of_intrvl x))) res
+ ; res
+
+ let find_Q_interval sys =
+ try
+ let sys =
+ (List.fold_left
+ (fun bg c -> CstrBag.add (CstrBag.cstr_to_itv c) bg) CstrBag.empty sys) in
+ let candidates =
+ List.fold_left
+ (fun l (x,i) -> match i with
+ None -> (x,Empty)::l
+ | Some i -> (x,i)::l) [] (find_q_intervals sys) in
+ match List.fold_left
+ (fun (x1,i1) (x2,i2) ->
+ if smaller_itv i1 i2
+ then (x1,i1) else (x2,i2)) (-1,Itv(None,None)) candidates
+ with
+ | (i,Empty) -> None
+ | (x,Itv(Some i, Some j)) -> Some(i,x,j)
+ | (x,Point n) -> Some(n,x,n)
+ | _ -> None
+ with CstrBag.Contradiction -> None
+
+
+end
+
diff --git a/contrib/micromega/micromega.ml b/contrib/micromega/micromega.ml
new file mode 100644
index 000000000..e151e4e1d
--- /dev/null
+++ b/contrib/micromega/micromega.ml
@@ -0,0 +1,1512 @@
+type __ = Obj.t
+let __ = let rec f _ = Obj.repr f in Obj.repr f
+
+type bool =
+ | True
+ | False
+
+(** val negb : bool -> bool **)
+
+let negb = function
+ | True -> False
+ | False -> True
+
+type nat =
+ | O
+ | S of nat
+
+type 'a option =
+ | Some of 'a
+ | None
+
+type ('a, 'b) prod =
+ | Pair of 'a * 'b
+
+type comparison =
+ | Eq
+ | Lt
+ | Gt
+
+(** val compOpp : comparison -> comparison **)
+
+let compOpp = function
+ | Eq -> Eq
+ | Lt -> Gt
+ | Gt -> Lt
+
+type sumbool =
+ | Left
+ | Right
+
+type 'a sumor =
+ | Inleft of 'a
+ | Inright
+
+type 'a list =
+ | Nil
+ | Cons of 'a * 'a list
+
+(** val app : 'a1 list -> 'a1 list -> 'a1 list **)
+
+let rec app l m =
+ match l with
+ | Nil -> m
+ | Cons (a, l1) -> Cons (a, (app l1 m))
+
+(** val nth : nat -> 'a1 list -> 'a1 -> 'a1 **)
+
+let rec nth n0 l default =
+ match n0 with
+ | O -> (match l with
+ | Nil -> default
+ | Cons (x, l') -> x)
+ | S m ->
+ (match l with
+ | Nil -> default
+ | Cons (x, t0) -> nth m t0 default)
+
+(** val map : ('a1 -> 'a2) -> 'a1 list -> 'a2 list **)
+
+let rec map f = function
+ | Nil -> Nil
+ | Cons (a, t0) -> Cons ((f a), (map f t0))
+
+type positive =
+ | XI of positive
+ | XO of positive
+ | XH
+
+(** val psucc : positive -> positive **)
+
+let rec psucc = function
+ | XI p -> XO (psucc p)
+ | XO p -> XI p
+ | XH -> XO XH
+
+(** val pplus : positive -> positive -> positive **)
+
+let rec pplus x y =
+ match x with
+ | XI p ->
+ (match y with
+ | XI q0 -> XO (pplus_carry p q0)
+ | XO q0 -> XI (pplus p q0)
+ | XH -> XO (psucc p))
+ | XO p ->
+ (match y with
+ | XI q0 -> XI (pplus p q0)
+ | XO q0 -> XO (pplus p q0)
+ | XH -> XI p)
+ | XH ->
+ (match y with
+ | XI q0 -> XO (psucc q0)
+ | XO q0 -> XI q0
+ | XH -> XO XH)
+
+(** val pplus_carry : positive -> positive -> positive **)
+
+and pplus_carry x y =
+ match x with
+ | XI p ->
+ (match y with
+ | XI q0 -> XI (pplus_carry p q0)
+ | XO q0 -> XO (pplus_carry p q0)
+ | XH -> XI (psucc p))
+ | XO p ->
+ (match y with
+ | XI q0 -> XO (pplus_carry p q0)
+ | XO q0 -> XI (pplus p q0)
+ | XH -> XO (psucc p))
+ | XH ->
+ (match y with
+ | XI q0 -> XI (psucc q0)
+ | XO q0 -> XO (psucc q0)
+ | XH -> XI XH)
+
+(** val p_of_succ_nat : nat -> positive **)
+
+let rec p_of_succ_nat = function
+ | O -> XH
+ | S x -> psucc (p_of_succ_nat x)
+
+(** val pdouble_minus_one : positive -> positive **)
+
+let rec pdouble_minus_one = function
+ | XI p -> XI (XO p)
+ | XO p -> XI (pdouble_minus_one p)
+ | XH -> XH
+
+type positive_mask =
+ | IsNul
+ | IsPos of positive
+ | IsNeg
+
+(** val pdouble_plus_one_mask : positive_mask -> positive_mask **)
+
+let pdouble_plus_one_mask = function
+ | IsNul -> IsPos XH
+ | IsPos p -> IsPos (XI p)
+ | IsNeg -> IsNeg
+
+(** val pdouble_mask : positive_mask -> positive_mask **)
+
+let pdouble_mask = function
+ | IsNul -> IsNul
+ | IsPos p -> IsPos (XO p)
+ | IsNeg -> IsNeg
+
+(** val pdouble_minus_two : positive -> positive_mask **)
+
+let pdouble_minus_two = function
+ | XI p -> IsPos (XO (XO p))
+ | XO p -> IsPos (XO (pdouble_minus_one p))
+ | XH -> IsNul
+
+(** val pminus_mask : positive -> positive -> positive_mask **)
+
+let rec pminus_mask x y =
+ match x with
+ | XI p ->
+ (match y with
+ | XI q0 -> pdouble_mask (pminus_mask p q0)
+ | XO q0 -> pdouble_plus_one_mask (pminus_mask p q0)
+ | XH -> IsPos (XO p))
+ | XO p ->
+ (match y with
+ | XI q0 -> pdouble_plus_one_mask (pminus_mask_carry p q0)
+ | XO q0 -> pdouble_mask (pminus_mask p q0)
+ | XH -> IsPos (pdouble_minus_one p))
+ | XH -> (match y with
+ | XH -> IsNul
+ | _ -> IsNeg)
+
+(** val pminus_mask_carry : positive -> positive -> positive_mask **)
+
+and pminus_mask_carry x y =
+ match x with
+ | XI p ->
+ (match y with
+ | XI q0 -> pdouble_plus_one_mask (pminus_mask_carry p q0)
+ | XO q0 -> pdouble_mask (pminus_mask p q0)
+ | XH -> IsPos (pdouble_minus_one p))
+ | XO p ->
+ (match y with
+ | XI q0 -> pdouble_mask (pminus_mask_carry p q0)
+ | XO q0 -> pdouble_plus_one_mask (pminus_mask_carry p q0)
+ | XH -> pdouble_minus_two p)
+ | XH -> IsNeg
+
+(** val pminus : positive -> positive -> positive **)
+
+let pminus x y =
+ match pminus_mask x y with
+ | IsPos z0 -> z0
+ | _ -> XH
+
+(** val pmult : positive -> positive -> positive **)
+
+let rec pmult x y =
+ match x with
+ | XI p -> pplus y (XO (pmult p y))
+ | XO p -> XO (pmult p y)
+ | XH -> y
+
+(** val pcompare : positive -> positive -> comparison -> comparison **)
+
+let rec pcompare x y r =
+ match x with
+ | XI p ->
+ (match y with
+ | XI q0 -> pcompare p q0 r
+ | XO q0 -> pcompare p q0 Gt
+ | XH -> Gt)
+ | XO p ->
+ (match y with
+ | XI q0 -> pcompare p q0 Lt
+ | XO q0 -> pcompare p q0 r
+ | XH -> Gt)
+ | XH -> (match y with
+ | XH -> r
+ | _ -> Lt)
+
+type n =
+ | N0
+ | Npos of positive
+
+type z =
+ | Z0
+ | Zpos of positive
+ | Zneg of positive
+
+(** val zdouble_plus_one : z -> z **)
+
+let zdouble_plus_one = function
+ | Z0 -> Zpos XH
+ | Zpos p -> Zpos (XI p)
+ | Zneg p -> Zneg (pdouble_minus_one p)
+
+(** val zdouble_minus_one : z -> z **)
+
+let zdouble_minus_one = function
+ | Z0 -> Zneg XH
+ | Zpos p -> Zpos (pdouble_minus_one p)
+ | Zneg p -> Zneg (XI p)
+
+(** val zdouble : z -> z **)
+
+let zdouble = function
+ | Z0 -> Z0
+ | Zpos p -> Zpos (XO p)
+ | Zneg p -> Zneg (XO p)
+
+(** val zPminus : positive -> positive -> z **)
+
+let rec zPminus x y =
+ match x with
+ | XI p ->
+ (match y with
+ | XI q0 -> zdouble (zPminus p q0)
+ | XO q0 -> zdouble_plus_one (zPminus p q0)
+ | XH -> Zpos (XO p))
+ | XO p ->
+ (match y with
+ | XI q0 -> zdouble_minus_one (zPminus p q0)
+ | XO q0 -> zdouble (zPminus p q0)
+ | XH -> Zpos (pdouble_minus_one p))
+ | XH ->
+ (match y with
+ | XI q0 -> Zneg (XO q0)
+ | XO q0 -> Zneg (pdouble_minus_one q0)
+ | XH -> Z0)
+
+(** val zplus : z -> z -> z **)
+
+let zplus x y =
+ match x with
+ | Z0 -> y
+ | Zpos x' ->
+ (match y with
+ | Z0 -> Zpos x'
+ | Zpos y' -> Zpos (pplus x' y')
+ | Zneg y' ->
+ (match pcompare x' y' Eq with
+ | Eq -> Z0
+ | Lt -> Zneg (pminus y' x')
+ | Gt -> Zpos (pminus x' y')))
+ | Zneg x' ->
+ (match y with
+ | Z0 -> Zneg x'
+ | Zpos y' ->
+ (match pcompare x' y' Eq with
+ | Eq -> Z0
+ | Lt -> Zpos (pminus y' x')
+ | Gt -> Zneg (pminus x' y'))
+ | Zneg y' -> Zneg (pplus x' y'))
+
+(** val zopp : z -> z **)
+
+let zopp = function
+ | Z0 -> Z0
+ | Zpos x0 -> Zneg x0
+ | Zneg x0 -> Zpos x0
+
+(** val zminus : z -> z -> z **)
+
+let zminus m n0 =
+ zplus m (zopp n0)
+
+(** val zmult : z -> z -> z **)
+
+let zmult x y =
+ match x with
+ | Z0 -> Z0
+ | Zpos x' ->
+ (match y with
+ | Z0 -> Z0
+ | Zpos y' -> Zpos (pmult x' y')
+ | Zneg y' -> Zneg (pmult x' y'))
+ | Zneg x' ->
+ (match y with
+ | Z0 -> Z0
+ | Zpos y' -> Zneg (pmult x' y')
+ | Zneg y' -> Zpos (pmult x' y'))
+
+(** val zcompare : z -> z -> comparison **)
+
+let zcompare x y =
+ match x with
+ | Z0 -> (match y with
+ | Z0 -> Eq
+ | Zpos y' -> Lt
+ | Zneg y' -> Gt)
+ | Zpos x' -> (match y with
+ | Zpos y' -> pcompare x' y' Eq
+ | _ -> Gt)
+ | Zneg x' ->
+ (match y with
+ | Zneg y' -> compOpp (pcompare x' y' Eq)
+ | _ -> Lt)
+
+(** val dcompare_inf : comparison -> sumbool sumor **)
+
+let dcompare_inf = function
+ | Eq -> Inleft Left
+ | Lt -> Inleft Right
+ | Gt -> Inright
+
+(** val zcompare_rec :
+ z -> z -> (__ -> 'a1) -> (__ -> 'a1) -> (__ -> 'a1) -> 'a1 **)
+
+let zcompare_rec x y h1 h2 h3 =
+ match dcompare_inf (zcompare x y) with
+ | Inleft x0 -> (match x0 with
+ | Left -> h1 __
+ | Right -> h2 __)
+ | Inright -> h3 __
+
+(** val z_gt_dec : z -> z -> sumbool **)
+
+let z_gt_dec x y =
+ zcompare_rec x y (fun _ -> Right) (fun _ -> Right) (fun _ -> Left)
+
+(** val zle_bool : z -> z -> bool **)
+
+let zle_bool x y =
+ match zcompare x y with
+ | Gt -> False
+ | _ -> True
+
+(** val zge_bool : z -> z -> bool **)
+
+let zge_bool x y =
+ match zcompare x y with
+ | Lt -> False
+ | _ -> True
+
+(** val zgt_bool : z -> z -> bool **)
+
+let zgt_bool x y =
+ match zcompare x y with
+ | Gt -> True
+ | _ -> False
+
+(** val zeq_bool : z -> z -> bool **)
+
+let zeq_bool x y =
+ match zcompare x y with
+ | Eq -> True
+ | _ -> False
+
+(** val n_of_nat : nat -> n **)
+
+let n_of_nat = function
+ | O -> N0
+ | S n' -> Npos (p_of_succ_nat n')
+
+(** val zdiv_eucl_POS : positive -> z -> (z, z) prod **)
+
+let rec zdiv_eucl_POS a b =
+ match a with
+ | XI a' ->
+ let Pair (q0, r) = zdiv_eucl_POS a' b in
+ let r' = zplus (zmult (Zpos (XO XH)) r) (Zpos XH) in
+ (match zgt_bool b r' with
+ | True -> Pair ((zmult (Zpos (XO XH)) q0), r')
+ | False -> Pair ((zplus (zmult (Zpos (XO XH)) q0) (Zpos XH)),
+ (zminus r' b)))
+ | XO a' ->
+ let Pair (q0, r) = zdiv_eucl_POS a' b in
+ let r' = zmult (Zpos (XO XH)) r in
+ (match zgt_bool b r' with
+ | True -> Pair ((zmult (Zpos (XO XH)) q0), r')
+ | False -> Pair ((zplus (zmult (Zpos (XO XH)) q0) (Zpos XH)),
+ (zminus r' b)))
+ | XH ->
+ (match zge_bool b (Zpos (XO XH)) with
+ | True -> Pair (Z0, (Zpos XH))
+ | False -> Pair ((Zpos XH), Z0))
+
+(** val zdiv_eucl : z -> z -> (z, z) prod **)
+
+let zdiv_eucl a b =
+ match a with
+ | Z0 -> Pair (Z0, Z0)
+ | Zpos a' ->
+ (match b with
+ | Z0 -> Pair (Z0, Z0)
+ | Zpos p -> zdiv_eucl_POS a' b
+ | Zneg b' ->
+ let Pair (q0, r) = zdiv_eucl_POS a' (Zpos b') in
+ (match r with
+ | Z0 -> Pair ((zopp q0), Z0)
+ | _ -> Pair ((zopp (zplus q0 (Zpos XH))), (zplus b r))))
+ | Zneg a' ->
+ (match b with
+ | Z0 -> Pair (Z0, Z0)
+ | Zpos p ->
+ let Pair (q0, r) = zdiv_eucl_POS a' b in
+ (match r with
+ | Z0 -> Pair ((zopp q0), Z0)
+ | _ -> Pair ((zopp (zplus q0 (Zpos XH))), (zminus b r)))
+ | Zneg b' ->
+ let Pair (q0, r) = zdiv_eucl_POS a' (Zpos b') in
+ Pair (q0, (zopp r)))
+
+type 'c pol =
+ | Pc of 'c
+ | Pinj of positive * 'c pol
+ | PX of 'c pol * positive * 'c pol
+
+(** val p0 : 'a1 -> 'a1 pol **)
+
+let p0 cO =
+ Pc cO
+
+(** val p1 : 'a1 -> 'a1 pol **)
+
+let p1 cI =
+ Pc cI
+
+(** val peq : ('a1 -> 'a1 -> bool) -> 'a1 pol -> 'a1 pol -> bool **)
+
+let rec peq ceqb p p' =
+ match p with
+ | Pc c -> (match p' with
+ | Pc c' -> ceqb c c'
+ | _ -> False)
+ | Pinj (j, q0) ->
+ (match p' with
+ | Pinj (j', q') ->
+ (match pcompare j j' Eq with
+ | Eq -> peq ceqb q0 q'
+ | _ -> False)
+ | _ -> False)
+ | PX (p2, i, q0) ->
+ (match p' with
+ | PX (p'0, i', q') ->
+ (match pcompare i i' Eq with
+ | Eq ->
+ (match peq ceqb p2 p'0 with
+ | True -> peq ceqb q0 q'
+ | False -> False)
+ | _ -> False)
+ | _ -> False)
+
+(** val mkPinj_pred : positive -> 'a1 pol -> 'a1 pol **)
+
+let mkPinj_pred j p =
+ match j with
+ | XI j0 -> Pinj ((XO j0), p)
+ | XO j0 -> Pinj ((pdouble_minus_one j0), p)
+ | XH -> p
+
+(** val mkPX :
+ 'a1 -> ('a1 -> 'a1 -> bool) -> 'a1 pol -> positive -> 'a1 pol -> 'a1 pol **)
+
+let mkPX cO ceqb p i q0 =
+ match p with
+ | Pc c ->
+ (match ceqb c cO with
+ | True ->
+ (match q0 with
+ | Pc c0 -> q0
+ | Pinj (j', q1) -> Pinj ((pplus XH j'), q1)
+ | PX (p2, p3, p4) -> Pinj (XH, q0))
+ | False -> PX (p, i, q0))
+ | Pinj (p2, p3) -> PX (p, i, q0)
+ | PX (p', i', q') ->
+ (match peq ceqb q' (p0 cO) with
+ | True -> PX (p', (pplus i' i), q0)
+ | False -> PX (p, i, q0))
+
+(** val mkXi : 'a1 -> 'a1 -> positive -> 'a1 pol **)
+
+let mkXi cO cI i =
+ PX ((p1 cI), i, (p0 cO))
+
+(** val mkX : 'a1 -> 'a1 -> 'a1 pol **)
+
+let mkX cO cI =
+ mkXi cO cI XH
+
+(** val popp : ('a1 -> 'a1) -> 'a1 pol -> 'a1 pol **)
+
+let rec popp copp = function
+ | Pc c -> Pc (copp c)
+ | Pinj (j, q0) -> Pinj (j, (popp copp q0))
+ | PX (p2, i, q0) -> PX ((popp copp p2), i, (popp copp q0))
+
+(** val paddC : ('a1 -> 'a1 -> 'a1) -> 'a1 pol -> 'a1 -> 'a1 pol **)
+
+let rec paddC cadd p c =
+ match p with
+ | Pc c1 -> Pc (cadd c1 c)
+ | Pinj (j, q0) -> Pinj (j, (paddC cadd q0 c))
+ | PX (p2, i, q0) -> PX (p2, i, (paddC cadd q0 c))
+
+(** val psubC : ('a1 -> 'a1 -> 'a1) -> 'a1 pol -> 'a1 -> 'a1 pol **)
+
+let rec psubC csub p c =
+ match p with
+ | Pc c1 -> Pc (csub c1 c)
+ | Pinj (j, q0) -> Pinj (j, (psubC csub q0 c))
+ | PX (p2, i, q0) -> PX (p2, i, (psubC csub q0 c))
+
+(** val paddI :
+ ('a1 -> 'a1 -> 'a1) -> ('a1 pol -> 'a1 pol -> 'a1 pol) -> 'a1 pol ->
+ positive -> 'a1 pol -> 'a1 pol **)
+
+let rec paddI cadd pop q0 j = function
+ | Pc c ->
+ let p2 = paddC cadd q0 c in
+ (match p2 with
+ | Pc c0 -> p2
+ | Pinj (j', q1) -> Pinj ((pplus j j'), q1)
+ | PX (p3, p4, p5) -> Pinj (j, p2))
+ | Pinj (j', q') ->
+ (match zPminus j' j with
+ | Z0 ->
+ let p2 = pop q' q0 in
+ (match p2 with
+ | Pc c -> p2
+ | Pinj (j'0, q1) -> Pinj ((pplus j j'0), q1)
+ | PX (p3, p4, p5) -> Pinj (j, p2))
+ | Zpos k ->
+ let p2 = pop (Pinj (k, q')) q0 in
+ (match p2 with
+ | Pc c -> p2
+ | Pinj (j'0, q1) -> Pinj ((pplus j j'0), q1)
+ | PX (p3, p4, p5) -> Pinj (j, p2))
+ | Zneg k ->
+ let p2 = paddI cadd pop q0 k q' in
+ (match p2 with
+ | Pc c -> p2
+ | Pinj (j'0, q1) -> Pinj ((pplus j' j'0), q1)
+ | PX (p3, p4, p5) -> Pinj (j', p2)))
+ | PX (p2, i, q') ->
+ (match j with
+ | XI j0 -> PX (p2, i, (paddI cadd pop q0 (XO j0) q'))
+ | XO j0 -> PX (p2, i, (paddI cadd pop q0 (pdouble_minus_one j0) q'))
+ | XH -> PX (p2, i, (pop q' q0)))
+
+(** val psubI :
+ ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1) -> ('a1 pol -> 'a1 pol -> 'a1 pol) ->
+ 'a1 pol -> positive -> 'a1 pol -> 'a1 pol **)
+
+let rec psubI cadd copp pop q0 j = function
+ | Pc c ->
+ let p2 = paddC cadd (popp copp q0) c in
+ (match p2 with
+ | Pc c0 -> p2
+ | Pinj (j', q1) -> Pinj ((pplus j j'), q1)
+ | PX (p3, p4, p5) -> Pinj (j, p2))
+ | Pinj (j', q') ->
+ (match zPminus j' j with
+ | Z0 ->
+ let p2 = pop q' q0 in
+ (match p2 with
+ | Pc c -> p2
+ | Pinj (j'0, q1) -> Pinj ((pplus j j'0), q1)
+ | PX (p3, p4, p5) -> Pinj (j, p2))
+ | Zpos k ->
+ let p2 = pop (Pinj (k, q')) q0 in
+ (match p2 with
+ | Pc c -> p2
+ | Pinj (j'0, q1) -> Pinj ((pplus j j'0), q1)
+ | PX (p3, p4, p5) -> Pinj (j, p2))
+ | Zneg k ->
+ let p2 = psubI cadd copp pop q0 k q' in
+ (match p2 with
+ | Pc c -> p2
+ | Pinj (j'0, q1) -> Pinj ((pplus j' j'0), q1)
+ | PX (p3, p4, p5) -> Pinj (j', p2)))
+ | PX (p2, i, q') ->
+ (match j with
+ | XI j0 -> PX (p2, i, (psubI cadd copp pop q0 (XO j0) q'))
+ | XO j0 -> PX (p2, i,
+ (psubI cadd copp pop q0 (pdouble_minus_one j0) q'))
+ | XH -> PX (p2, i, (pop q' q0)))
+
+(** val paddX :
+ 'a1 -> ('a1 -> 'a1 -> bool) -> ('a1 pol -> 'a1 pol -> 'a1 pol) -> 'a1 pol
+ -> positive -> 'a1 pol -> 'a1 pol **)
+
+let rec paddX cO ceqb pop p' i' p = match p with
+ | Pc c -> PX (p', i', p)
+ | Pinj (j, q') ->
+ (match j with
+ | XI j0 -> PX (p', i', (Pinj ((XO j0), q')))
+ | XO j0 -> PX (p', i', (Pinj ((pdouble_minus_one j0), q')))
+ | XH -> PX (p', i', q'))
+ | PX (p2, i, q') ->
+ (match zPminus i i' with
+ | Z0 -> mkPX cO ceqb (pop p2 p') i q'
+ | Zpos k -> mkPX cO ceqb (pop (PX (p2, k, (p0 cO))) p') i' q'
+ | Zneg k -> mkPX cO ceqb (paddX cO ceqb pop p' k p2) i q')
+
+(** val psubX :
+ 'a1 -> ('a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> ('a1 pol -> 'a1 pol -> 'a1
+ pol) -> 'a1 pol -> positive -> 'a1 pol -> 'a1 pol **)
+
+let rec psubX cO copp ceqb pop p' i' p = match p with
+ | Pc c -> PX ((popp copp p'), i', p)
+ | Pinj (j, q') ->
+ (match j with
+ | XI j0 -> PX ((popp copp p'), i', (Pinj ((XO j0), q')))
+ | XO j0 -> PX ((popp copp p'), i', (Pinj (
+ (pdouble_minus_one j0), q')))
+ | XH -> PX ((popp copp p'), i', q'))
+ | PX (p2, i, q') ->
+ (match zPminus i i' with
+ | Z0 -> mkPX cO ceqb (pop p2 p') i q'
+ | Zpos k -> mkPX cO ceqb (pop (PX (p2, k, (p0 cO))) p') i' q'
+ | Zneg k -> mkPX cO ceqb (psubX cO copp ceqb pop p' k p2) i q')
+
+(** val padd :
+ 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1 pol -> 'a1 pol
+ -> 'a1 pol **)
+
+let rec padd cO cadd ceqb p = function
+ | Pc c' -> paddC cadd p c'
+ | Pinj (j', q') -> paddI cadd (fun x x0 -> padd cO cadd ceqb x x0) q' j' p
+ | PX (p'0, i', q') ->
+ (match p with
+ | Pc c -> PX (p'0, i', (paddC cadd q' c))
+ | Pinj (j, q0) ->
+ (match j with
+ | XI j0 -> PX (p'0, i',
+ (padd cO cadd ceqb (Pinj ((XO j0), q0)) q'))
+ | XO j0 -> PX (p'0, i',
+ (padd cO cadd ceqb (Pinj ((pdouble_minus_one j0), q0))
+ q'))
+ | XH -> PX (p'0, i', (padd cO cadd ceqb q0 q')))
+ | PX (p2, i, q0) ->
+ (match zPminus i i' with
+ | Z0 ->
+ mkPX cO ceqb (padd cO cadd ceqb p2 p'0) i
+ (padd cO cadd ceqb q0 q')
+ | Zpos k ->
+ mkPX cO ceqb
+ (padd cO cadd ceqb (PX (p2, k, (p0 cO))) p'0) i'
+ (padd cO cadd ceqb q0 q')
+ | Zneg k ->
+ mkPX cO ceqb
+ (paddX cO ceqb (fun x x0 -> padd cO cadd ceqb x x0) p'0
+ k p2) i (padd cO cadd ceqb q0 q')))
+
+(** val psub :
+ 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1) -> ('a1
+ -> 'a1 -> bool) -> 'a1 pol -> 'a1 pol -> 'a1 pol **)
+
+let rec psub cO cadd csub copp ceqb p = function
+ | Pc c' -> psubC csub p c'
+ | Pinj (j', q') ->
+ psubI cadd copp (fun x x0 -> psub cO cadd csub copp ceqb x x0) q' j' p
+ | PX (p'0, i', q') ->
+ (match p with
+ | Pc c -> PX ((popp copp p'0), i', (paddC cadd (popp copp q') c))
+ | Pinj (j, q0) ->
+ (match j with
+ | XI j0 -> PX ((popp copp p'0), i',
+ (psub cO cadd csub copp ceqb (Pinj ((XO j0), q0)) q'))
+ | XO j0 -> PX ((popp copp p'0), i',
+ (psub cO cadd csub copp ceqb (Pinj
+ ((pdouble_minus_one j0), q0)) q'))
+ | XH -> PX ((popp copp p'0), i',
+ (psub cO cadd csub copp ceqb q0 q')))
+ | PX (p2, i, q0) ->
+ (match zPminus i i' with
+ | Z0 ->
+ mkPX cO ceqb (psub cO cadd csub copp ceqb p2 p'0) i
+ (psub cO cadd csub copp ceqb q0 q')
+ | Zpos k ->
+ mkPX cO ceqb
+ (psub cO cadd csub copp ceqb (PX (p2, k, (p0 cO))) p'0)
+ i' (psub cO cadd csub copp ceqb q0 q')
+ | Zneg k ->
+ mkPX cO ceqb
+ (psubX cO copp ceqb (fun x x0 ->
+ psub cO cadd csub copp ceqb x x0) p'0 k p2) i
+ (psub cO cadd csub copp ceqb q0 q')))
+
+(** val pmulC_aux :
+ 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1 pol -> 'a1 ->
+ 'a1 pol **)
+
+let rec pmulC_aux cO cmul ceqb p c =
+ match p with
+ | Pc c' -> Pc (cmul c' c)
+ | Pinj (j, q0) ->
+ let p2 = pmulC_aux cO cmul ceqb q0 c in
+ (match p2 with
+ | Pc c0 -> p2
+ | Pinj (j', q1) -> Pinj ((pplus j j'), q1)
+ | PX (p3, p4, p5) -> Pinj (j, p2))
+ | PX (p2, i, q0) ->
+ mkPX cO ceqb (pmulC_aux cO cmul ceqb p2 c) i
+ (pmulC_aux cO cmul ceqb q0 c)
+
+(** val pmulC :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1 pol ->
+ 'a1 -> 'a1 pol **)
+
+let pmulC cO cI cmul ceqb p c =
+ match ceqb c cO with
+ | True -> p0 cO
+ | False ->
+ (match ceqb c cI with
+ | True -> p
+ | False -> pmulC_aux cO cmul ceqb p c)
+
+(** val pmulI :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> ('a1 pol ->
+ 'a1 pol -> 'a1 pol) -> 'a1 pol -> positive -> 'a1 pol -> 'a1 pol **)
+
+let rec pmulI cO cI cmul ceqb pmul0 q0 j = function
+ | Pc c ->
+ let p2 = pmulC cO cI cmul ceqb q0 c in
+ (match p2 with
+ | Pc c0 -> p2
+ | Pinj (j', q1) -> Pinj ((pplus j j'), q1)
+ | PX (p3, p4, p5) -> Pinj (j, p2))
+ | Pinj (j', q') ->
+ (match zPminus j' j with
+ | Z0 ->
+ let p2 = pmul0 q' q0 in
+ (match p2 with
+ | Pc c -> p2
+ | Pinj (j'0, q1) -> Pinj ((pplus j j'0), q1)
+ | PX (p3, p4, p5) -> Pinj (j, p2))
+ | Zpos k ->
+ let p2 = pmul0 (Pinj (k, q')) q0 in
+ (match p2 with
+ | Pc c -> p2
+ | Pinj (j'0, q1) -> Pinj ((pplus j j'0), q1)
+ | PX (p3, p4, p5) -> Pinj (j, p2))
+ | Zneg k ->
+ let p2 = pmulI cO cI cmul ceqb pmul0 q0 k q' in
+ (match p2 with
+ | Pc c -> p2
+ | Pinj (j'0, q1) -> Pinj ((pplus j' j'0), q1)
+ | PX (p3, p4, p5) -> Pinj (j', p2)))
+ | PX (p', i', q') ->
+ (match j with
+ | XI j' ->
+ mkPX cO ceqb (pmulI cO cI cmul ceqb pmul0 q0 j p') i'
+ (pmulI cO cI cmul ceqb pmul0 q0 (XO j') q')
+ | XO j' ->
+ mkPX cO ceqb (pmulI cO cI cmul ceqb pmul0 q0 j p') i'
+ (pmulI cO cI cmul ceqb pmul0 q0 (pdouble_minus_one j') q')
+ | XH ->
+ mkPX cO ceqb (pmulI cO cI cmul ceqb pmul0 q0 XH p') i'
+ (pmul0 q' q0))
+
+(** val pmul :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1
+ -> bool) -> 'a1 pol -> 'a1 pol -> 'a1 pol **)
+
+let rec pmul cO cI cadd cmul ceqb p p'' = match p'' with
+ | Pc c -> pmulC cO cI cmul ceqb p c
+ | Pinj (j', q') ->
+ pmulI cO cI cmul ceqb (fun x x0 -> pmul cO cI cadd cmul ceqb x x0) q'
+ j' p
+ | PX (p', i', q') ->
+ (match p with
+ | Pc c -> pmulC cO cI cmul ceqb p'' c
+ | Pinj (j, q0) ->
+ mkPX cO ceqb (pmul cO cI cadd cmul ceqb p p') i'
+ (match j with
+ | XI j0 ->
+ pmul cO cI cadd cmul ceqb (Pinj ((XO j0), q0)) q'
+ | XO j0 ->
+ pmul cO cI cadd cmul ceqb (Pinj
+ ((pdouble_minus_one j0), q0)) q'
+ | XH -> pmul cO cI cadd cmul ceqb q0 q')
+ | PX (p2, i, q0) ->
+ padd cO cadd ceqb
+ (mkPX cO ceqb
+ (padd cO cadd ceqb
+ (mkPX cO ceqb (pmul cO cI cadd cmul ceqb p2 p') i (p0 cO))
+ (pmul cO cI cadd cmul ceqb
+ (match q0 with
+ | Pc c -> q0
+ | Pinj (j', q1) -> Pinj ((pplus XH j'), q1)
+ | PX (p3, p4, p5) -> Pinj (XH, q0)) p')) i'
+ (p0 cO))
+ (mkPX cO ceqb
+ (pmulI cO cI cmul ceqb (fun x x0 ->
+ pmul cO cI cadd cmul ceqb x x0) q' XH p2) i
+ (pmul cO cI cadd cmul ceqb q0 q')))
+
+type 'c pExpr =
+ | PEc of 'c
+ | PEX of positive
+ | PEadd of 'c pExpr * 'c pExpr
+ | PEsub of 'c pExpr * 'c pExpr
+ | PEmul of 'c pExpr * 'c pExpr
+ | PEopp of 'c pExpr
+ | PEpow of 'c pExpr * n
+
+(** val mk_X : 'a1 -> 'a1 -> positive -> 'a1 pol **)
+
+let mk_X cO cI j =
+ mkPinj_pred j (mkX cO cI)
+
+(** val ppow_pos :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1
+ -> bool) -> ('a1 pol -> 'a1 pol) -> 'a1 pol -> 'a1 pol -> positive -> 'a1
+ pol **)
+
+let rec ppow_pos cO cI cadd cmul ceqb subst_l res p = function
+ | XI p3 ->
+ subst_l
+ (pmul cO cI cadd cmul ceqb
+ (ppow_pos cO cI cadd cmul ceqb subst_l
+ (ppow_pos cO cI cadd cmul ceqb subst_l res p p3) p p3) p)
+ | XO p3 ->
+ ppow_pos cO cI cadd cmul ceqb subst_l
+ (ppow_pos cO cI cadd cmul ceqb subst_l res p p3) p p3
+ | XH -> subst_l (pmul cO cI cadd cmul ceqb res p)
+
+(** val ppow_N :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1
+ -> bool) -> ('a1 pol -> 'a1 pol) -> 'a1 pol -> n -> 'a1 pol **)
+
+let ppow_N cO cI cadd cmul ceqb subst_l p = function
+ | N0 -> p1 cI
+ | Npos p2 -> ppow_pos cO cI cadd cmul ceqb subst_l (p1 cI) p p2
+
+(** val norm_aux :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1
+ -> 'a1) -> ('a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1 pExpr -> 'a1 pol **)
+
+let rec norm_aux cO cI cadd cmul csub copp ceqb = function
+ | PEc c -> Pc c
+ | PEX j -> mk_X cO cI j
+ | PEadd (pe1, pe2) ->
+ (match pe1 with
+ | PEopp pe3 ->
+ psub cO cadd csub copp ceqb
+ (norm_aux cO cI cadd cmul csub copp ceqb pe2)
+ (norm_aux cO cI cadd cmul csub copp ceqb pe3)
+ | _ ->
+ (match pe2 with
+ | PEopp pe3 ->
+ psub cO cadd csub copp ceqb
+ (norm_aux cO cI cadd cmul csub copp ceqb pe1)
+ (norm_aux cO cI cadd cmul csub copp ceqb pe3)
+ | _ ->
+ padd cO cadd ceqb
+ (norm_aux cO cI cadd cmul csub copp ceqb pe1)
+ (norm_aux cO cI cadd cmul csub copp ceqb pe2)))
+ | PEsub (pe1, pe2) ->
+ psub cO cadd csub copp ceqb
+ (norm_aux cO cI cadd cmul csub copp ceqb pe1)
+ (norm_aux cO cI cadd cmul csub copp ceqb pe2)
+ | PEmul (pe1, pe2) ->
+ pmul cO cI cadd cmul ceqb (norm_aux cO cI cadd cmul csub copp ceqb pe1)
+ (norm_aux cO cI cadd cmul csub copp ceqb pe2)
+ | PEopp pe1 -> popp copp (norm_aux cO cI cadd cmul csub copp ceqb pe1)
+ | PEpow (pe1, n0) ->
+ ppow_N cO cI cadd cmul ceqb (fun p -> p)
+ (norm_aux cO cI cadd cmul csub copp ceqb pe1) n0
+
+type 'a bFormula =
+ | TT
+ | FF
+ | X
+ | A of 'a
+ | Cj of 'a bFormula * 'a bFormula
+ | D of 'a bFormula * 'a bFormula
+ | N of 'a bFormula
+ | I of 'a bFormula * 'a bFormula
+
+type 'term' clause = 'term' list
+
+type 'term' cnf = 'term' clause list
+
+(** val tt : 'a1 cnf **)
+
+let tt =
+ Nil
+
+(** val ff : 'a1 cnf **)
+
+let ff =
+ Cons (Nil, Nil)
+
+(** val or_clause_cnf : 'a1 clause -> 'a1 cnf -> 'a1 cnf **)
+
+let or_clause_cnf t0 f =
+ map (fun x -> app t0 x) f
+
+(** val or_cnf : 'a1 cnf -> 'a1 cnf -> 'a1 cnf **)
+
+let rec or_cnf f f' =
+ match f with
+ | Nil -> tt
+ | Cons (e, rst) -> app (or_cnf rst f') (or_clause_cnf e f')
+
+(** val and_cnf : 'a1 cnf -> 'a1 cnf -> 'a1 cnf **)
+
+let and_cnf f1 f2 =
+ app f1 f2
+
+(** val xcnf :
+ ('a1 -> 'a2 cnf) -> ('a1 -> 'a2 cnf) -> bool -> 'a1 bFormula -> 'a2 cnf **)
+
+let rec xcnf normalise0 negate0 pol0 = function
+ | TT -> (match pol0 with
+ | True -> tt
+ | False -> ff)
+ | FF -> (match pol0 with
+ | True -> ff
+ | False -> tt)
+ | X -> ff
+ | A x -> (match pol0 with
+ | True -> normalise0 x
+ | False -> negate0 x)
+ | Cj (e1, e2) ->
+ (match pol0 with
+ | True ->
+ and_cnf (xcnf normalise0 negate0 pol0 e1)
+ (xcnf normalise0 negate0 pol0 e2)
+ | False ->
+ or_cnf (xcnf normalise0 negate0 pol0 e1)
+ (xcnf normalise0 negate0 pol0 e2))
+ | D (e1, e2) ->
+ (match pol0 with
+ | True ->
+ or_cnf (xcnf normalise0 negate0 pol0 e1)
+ (xcnf normalise0 negate0 pol0 e2)
+ | False ->
+ and_cnf (xcnf normalise0 negate0 pol0 e1)
+ (xcnf normalise0 negate0 pol0 e2))
+ | N e -> xcnf normalise0 negate0 (negb pol0) e
+ | I (e1, e2) ->
+ (match pol0 with
+ | True ->
+ or_cnf (xcnf normalise0 negate0 (negb pol0) e1)
+ (xcnf normalise0 negate0 pol0 e2)
+ | False ->
+ and_cnf (xcnf normalise0 negate0 (negb pol0) e1)
+ (xcnf normalise0 negate0 pol0 e2))
+
+(** val cnf_checker :
+ ('a1 list -> 'a2 -> bool) -> 'a1 cnf -> 'a2 list -> bool **)
+
+let rec cnf_checker checker f l =
+ match f with
+ | Nil -> True
+ | Cons (e, f0) ->
+ (match l with
+ | Nil -> False
+ | Cons (c, l0) ->
+ (match checker e c with
+ | True -> cnf_checker checker f0 l0
+ | False -> False))
+
+(** val tauto_checker :
+ ('a1 -> 'a2 cnf) -> ('a1 -> 'a2 cnf) -> ('a2 list -> 'a3 -> bool) -> 'a1
+ bFormula -> 'a3 list -> bool **)
+
+let tauto_checker normalise0 negate0 checker f w =
+ cnf_checker checker (xcnf normalise0 negate0 True f) w
+
+type 'c pExprC = 'c pExpr
+
+type 'c polC = 'c pol
+
+type op1 =
+ | Equal
+ | NonEqual
+ | Strict
+ | NonStrict
+
+type 'c nFormula = ('c pExprC, op1) prod
+
+type monoidMember = nat list
+
+type 'c coneMember =
+ | S_In of nat
+ | S_Ideal of 'c pExprC * 'c coneMember
+ | S_Square of 'c pExprC
+ | S_Monoid of monoidMember
+ | S_Mult of 'c coneMember * 'c coneMember
+ | S_Add of 'c coneMember * 'c coneMember
+ | S_Pos of 'c
+ | S_Z
+
+(** val nformula_times : 'a1 nFormula -> 'a1 nFormula -> 'a1 nFormula **)
+
+let nformula_times f f' =
+ let Pair (p, op) = f in
+ let Pair (p', op') = f' in
+ Pair ((PEmul (p, p')),
+ (match op with
+ | Equal -> Equal
+ | NonEqual -> NonEqual
+ | Strict -> op'
+ | NonStrict -> NonStrict))
+
+(** val nformula_plus : 'a1 nFormula -> 'a1 nFormula -> 'a1 nFormula **)
+
+let nformula_plus f f' =
+ let Pair (p, op) = f in
+ let Pair (p', op') = f' in
+ Pair ((PEadd (p, p')),
+ (match op with
+ | Equal -> op'
+ | NonEqual -> NonEqual
+ | Strict -> Strict
+ | NonStrict -> (match op' with
+ | Strict -> Strict
+ | _ -> NonStrict)))
+
+(** val eval_monoid :
+ 'a1 -> 'a1 nFormula list -> monoidMember -> 'a1 pExprC **)
+
+let rec eval_monoid cI l = function
+ | Nil -> PEc cI
+ | Cons (n0, ns0) -> PEmul
+ ((let Pair (q0, o) = nth n0 l (Pair ((PEc cI), NonEqual)) in
+ (match o with
+ | NonEqual -> q0
+ | _ -> PEc cI)), (eval_monoid cI l ns0))
+
+(** val eval_cone :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> bool) -> ('a1 -> 'a1 -> bool) -> 'a1
+ nFormula list -> 'a1 coneMember -> 'a1 nFormula **)
+
+let rec eval_cone cO cI ceqb cleb l = function
+ | S_In n0 ->
+ let Pair (p, o) = nth n0 l (Pair ((PEc cO), Equal)) in
+ (match o with
+ | NonEqual -> Pair ((PEc cO), Equal)
+ | _ -> nth n0 l (Pair ((PEc cO), Equal)))
+ | S_Ideal (p, cm') ->
+ let f = eval_cone cO cI ceqb cleb l cm' in
+ let Pair (q0, op) = f in
+ (match op with
+ | Equal -> Pair ((PEmul (q0, p)), Equal)
+ | _ -> f)
+ | S_Square p -> Pair ((PEmul (p, p)), NonStrict)
+ | S_Monoid m -> let p = eval_monoid cI l m in Pair ((PEmul (p, p)), Strict)
+ | S_Mult (p, q0) ->
+ nformula_times (eval_cone cO cI ceqb cleb l p)
+ (eval_cone cO cI ceqb cleb l q0)
+ | S_Add (p, q0) ->
+ nformula_plus (eval_cone cO cI ceqb cleb l p)
+ (eval_cone cO cI ceqb cleb l q0)
+ | S_Pos c ->
+ (match match cleb cO c with
+ | True -> negb (ceqb cO c)
+ | False -> False with
+ | True -> Pair ((PEc c), Strict)
+ | False -> Pair ((PEc cO), Equal))
+ | S_Z -> Pair ((PEc cO), Equal)
+
+(** val normalise_pexpr :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1
+ -> 'a1) -> ('a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1 pExprC -> 'a1 polC **)
+
+let normalise_pexpr cO cI cplus ctimes cminus copp ceqb x =
+ norm_aux cO cI cplus ctimes cminus copp ceqb x
+
+(** val check_inconsistent :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1
+ -> 'a1) -> ('a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> ('a1 -> 'a1 -> bool)
+ -> 'a1 nFormula -> bool **)
+
+let check_inconsistent cO cI cplus ctimes cminus copp ceqb cleb = function
+ | Pair (e, op) ->
+ (match normalise_pexpr cO cI cplus ctimes cminus copp ceqb e with
+ | Pc c ->
+ (match op with
+ | Equal -> negb (ceqb c cO)
+ | NonEqual -> False
+ | Strict -> cleb c cO
+ | NonStrict ->
+ (match cleb c cO with
+ | True -> negb (ceqb c cO)
+ | False -> False))
+ | _ -> False)
+
+(** val check_normalised_formulas :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1
+ -> 'a1) -> ('a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> ('a1 -> 'a1 -> bool)
+ -> 'a1 nFormula list -> 'a1 coneMember -> bool **)
+
+let check_normalised_formulas cO cI cplus ctimes cminus copp ceqb cleb l cm =
+ check_inconsistent cO cI cplus ctimes cminus copp ceqb cleb
+ (eval_cone cO cI ceqb cleb l cm)
+
+type op2 =
+ | OpEq
+ | OpNEq
+ | OpLe
+ | OpGe
+ | OpLt
+ | OpGt
+
+type 'c formula = { flhs : 'c pExprC; fop : op2; frhs : 'c pExprC }
+
+(** val flhs : 'a1 formula -> 'a1 pExprC **)
+
+let flhs x = x.flhs
+
+(** val fop : 'a1 formula -> op2 **)
+
+let fop x = x.fop
+
+(** val frhs : 'a1 formula -> 'a1 pExprC **)
+
+let frhs x = x.frhs
+
+(** val xnormalise : 'a1 formula -> 'a1 nFormula list **)
+
+let xnormalise t0 =
+ let { flhs = lhs; fop = o; frhs = rhs } = t0 in
+ (match o with
+ | OpEq -> Cons ((Pair ((PEsub (lhs, rhs)), Strict)), (Cons ((Pair
+ ((PEsub (rhs, lhs)), Strict)), Nil)))
+ | OpNEq -> Cons ((Pair ((PEsub (lhs, rhs)), Equal)), Nil)
+ | OpLe -> Cons ((Pair ((PEsub (lhs, rhs)), Strict)), Nil)
+ | OpGe -> Cons ((Pair ((PEsub (rhs, lhs)), Strict)), Nil)
+ | OpLt -> Cons ((Pair ((PEsub (lhs, rhs)), NonStrict)), Nil)
+ | OpGt -> Cons ((Pair ((PEsub (rhs, lhs)), NonStrict)), Nil))
+
+(** val cnf_normalise : 'a1 formula -> 'a1 nFormula cnf **)
+
+let cnf_normalise t0 =
+ map (fun x -> Cons (x, Nil)) (xnormalise t0)
+
+(** val xnegate : 'a1 formula -> 'a1 nFormula list **)
+
+let xnegate t0 =
+ let { flhs = lhs; fop = o; frhs = rhs } = t0 in
+ (match o with
+ | OpEq -> Cons ((Pair ((PEsub (lhs, rhs)), Equal)), Nil)
+ | OpNEq -> Cons ((Pair ((PEsub (lhs, rhs)), Strict)), (Cons ((Pair
+ ((PEsub (rhs, lhs)), Strict)), Nil)))
+ | OpLe -> Cons ((Pair ((PEsub (rhs, lhs)), NonStrict)), Nil)
+ | OpGe -> Cons ((Pair ((PEsub (lhs, rhs)), NonStrict)), Nil)
+ | OpLt -> Cons ((Pair ((PEsub (rhs, lhs)), Strict)), Nil)
+ | OpGt -> Cons ((Pair ((PEsub (lhs, rhs)), Strict)), Nil))
+
+(** val cnf_negate : 'a1 formula -> 'a1 nFormula cnf **)
+
+let cnf_negate t0 =
+ map (fun x -> Cons (x, Nil)) (xnegate t0)
+
+(** val simpl_expr :
+ 'a1 -> ('a1 -> 'a1 -> bool) -> 'a1 pExprC -> 'a1 pExprC **)
+
+let rec simpl_expr cI ceqb e = match e with
+ | PEadd (x, y) -> PEadd ((simpl_expr cI ceqb x), (simpl_expr cI ceqb y))
+ | PEmul (y, z0) ->
+ let y' = simpl_expr cI ceqb y in
+ (match y' with
+ | PEc c ->
+ (match ceqb c cI with
+ | True -> simpl_expr cI ceqb z0
+ | False -> PEmul (y', (simpl_expr cI ceqb z0)))
+ | _ -> PEmul (y', (simpl_expr cI ceqb z0)))
+ | _ -> e
+
+(** val simpl_cone :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1
+ coneMember -> 'a1 coneMember **)
+
+let simpl_cone cO cI ctimes ceqb e = match e with
+ | S_Square t0 ->
+ (match simpl_expr cI ceqb t0 with
+ | PEc c ->
+ (match ceqb cO c with
+ | True -> S_Z
+ | False -> S_Pos (ctimes c c))
+ | _ -> S_Square (simpl_expr cI ceqb t0))
+ | S_Mult (t1, t2) ->
+ (match t1 with
+ | S_Mult (x, x0) ->
+ (match x with
+ | S_Pos p2 ->
+ (match t2 with
+ | S_Pos c -> S_Mult ((S_Pos (ctimes c p2)), x0)
+ | S_Z -> S_Z
+ | _ -> e)
+ | _ ->
+ (match x0 with
+ | S_Pos p2 ->
+ (match t2 with
+ | S_Pos c -> S_Mult ((S_Pos (ctimes c p2)), x)
+ | S_Z -> S_Z
+ | _ -> e)
+ | _ ->
+ (match t2 with
+ | S_Pos c ->
+ (match ceqb cI c with
+ | True -> t1
+ | False -> S_Mult (t1, t2))
+ | S_Z -> S_Z
+ | _ -> e)))
+ | S_Pos c ->
+ (match t2 with
+ | S_Mult (x, x0) ->
+ (match x with
+ | S_Pos p2 -> S_Mult ((S_Pos (ctimes c p2)), x0)
+ | _ ->
+ (match x0 with
+ | S_Pos p2 -> S_Mult ((S_Pos (ctimes c p2)), x)
+ | _ ->
+ (match ceqb cI c with
+ | True -> t2
+ | False -> S_Mult (t1, t2))))
+ | S_Add (y, z0) -> S_Add ((S_Mult ((S_Pos c), y)), (S_Mult
+ ((S_Pos c), z0)))
+ | S_Pos c0 -> S_Pos (ctimes c c0)
+ | S_Z -> S_Z
+ | _ ->
+ (match ceqb cI c with
+ | True -> t2
+ | False -> S_Mult (t1, t2)))
+ | S_Z -> S_Z
+ | _ ->
+ (match t2 with
+ | S_Pos c ->
+ (match ceqb cI c with
+ | True -> t1
+ | False -> S_Mult (t1, t2))
+ | S_Z -> S_Z
+ | _ -> e))
+ | S_Add (t1, t2) ->
+ (match t1 with
+ | S_Z -> t2
+ | _ -> (match t2 with
+ | S_Z -> t1
+ | _ -> S_Add (t1, t2)))
+ | _ -> e
+
+type q = { qnum : z; qden : positive }
+
+(** val qnum : q -> z **)
+
+let qnum x = x.qnum
+
+(** val qden : q -> positive **)
+
+let qden x = x.qden
+
+(** val qplus : q -> q -> q **)
+
+let qplus x y =
+ { qnum = (zplus (zmult x.qnum (Zpos y.qden)) (zmult y.qnum (Zpos x.qden)));
+ qden = (pmult x.qden y.qden) }
+
+(** val qmult : q -> q -> q **)
+
+let qmult x y =
+ { qnum = (zmult x.qnum y.qnum); qden = (pmult x.qden y.qden) }
+
+(** val qopp : q -> q **)
+
+let qopp x =
+ { qnum = (zopp x.qnum); qden = x.qden }
+
+(** val qminus : q -> q -> q **)
+
+let qminus x y =
+ qplus x (qopp y)
+
+type 'a t =
+ | Empty
+ | Leaf of 'a
+ | Node of 'a t * 'a * 'a t
+
+(** val find : 'a1 -> 'a1 t -> positive -> 'a1 **)
+
+let rec find default vm p =
+ match vm with
+ | Empty -> default
+ | Leaf i -> i
+ | Node (l, e, r) ->
+ (match p with
+ | XI p2 -> find default r p2
+ | XO p2 -> find default l p2
+ | XH -> e)
+
+type zWitness = z coneMember
+
+(** val zWeakChecker : z nFormula list -> z coneMember -> bool **)
+
+let zWeakChecker x x0 =
+ check_normalised_formulas Z0 (Zpos XH) zplus zmult zminus zopp zeq_bool
+ zle_bool x x0
+
+(** val xnormalise0 : z formula -> z nFormula list **)
+
+let xnormalise0 t0 =
+ let { flhs = lhs; fop = o; frhs = rhs } = t0 in
+ (match o with
+ | OpEq -> Cons ((Pair ((PEsub (lhs, (PEadd (rhs, (PEc (Zpos XH)))))),
+ NonStrict)), (Cons ((Pair ((PEsub (rhs, (PEadd (lhs, (PEc (Zpos
+ XH)))))), NonStrict)), Nil)))
+ | OpNEq -> Cons ((Pair ((PEsub (lhs, rhs)), Equal)), Nil)
+ | OpLe -> Cons ((Pair ((PEsub (lhs, (PEadd (rhs, (PEc (Zpos XH)))))),
+ NonStrict)), Nil)
+ | OpGe -> Cons ((Pair ((PEsub (rhs, (PEadd (lhs, (PEc (Zpos XH)))))),
+ NonStrict)), Nil)
+ | OpLt -> Cons ((Pair ((PEsub (lhs, rhs)), NonStrict)), Nil)
+ | OpGt -> Cons ((Pair ((PEsub (rhs, lhs)), NonStrict)), Nil))
+
+(** val normalise : z formula -> z nFormula cnf **)
+
+let normalise t0 =
+ map (fun x -> Cons (x, Nil)) (xnormalise0 t0)
+
+(** val xnegate0 : z formula -> z nFormula list **)
+
+let xnegate0 t0 =
+ let { flhs = lhs; fop = o; frhs = rhs } = t0 in
+ (match o with
+ | OpEq -> Cons ((Pair ((PEsub (lhs, rhs)), Equal)), Nil)
+ | OpNEq -> Cons ((Pair ((PEsub (lhs, (PEadd (rhs, (PEc (Zpos XH)))))),
+ NonStrict)), (Cons ((Pair ((PEsub (rhs, (PEadd (lhs, (PEc (Zpos
+ XH)))))), NonStrict)), Nil)))
+ | OpLe -> Cons ((Pair ((PEsub (rhs, lhs)), NonStrict)), Nil)
+ | OpGe -> Cons ((Pair ((PEsub (lhs, rhs)), NonStrict)), Nil)
+ | OpLt -> Cons ((Pair ((PEsub (rhs, (PEadd (lhs, (PEc (Zpos XH)))))),
+ NonStrict)), Nil)
+ | OpGt -> Cons ((Pair ((PEsub (lhs, (PEadd (rhs, (PEc (Zpos XH)))))),
+ NonStrict)), Nil))
+
+(** val negate : z formula -> z nFormula cnf **)
+
+let negate t0 =
+ map (fun x -> Cons (x, Nil)) (xnegate0 t0)
+
+(** val ceiling : z -> z -> z **)
+
+let ceiling a b =
+ let Pair (q0, r) = zdiv_eucl a b in
+ (match r with
+ | Z0 -> q0
+ | _ -> zplus q0 (Zpos XH))
+
+type proofTerm =
+ | RatProof of zWitness
+ | CutProof of z pExprC * q * zWitness * proofTerm
+ | EnumProof of q * z pExprC * q * zWitness * zWitness * proofTerm list
+
+(** val makeLb : z pExpr -> q -> z nFormula **)
+
+let makeLb v q0 =
+ let { qnum = n0; qden = d } = q0 in
+ Pair ((PEsub ((PEmul ((PEc (Zpos d)), v)), (PEc n0))), NonStrict)
+
+(** val qceiling : q -> z **)
+
+let qceiling q0 =
+ let { qnum = n0; qden = d } = q0 in ceiling n0 (Zpos d)
+
+(** val makeLbCut : z pExprC -> q -> z nFormula **)
+
+let makeLbCut v q0 =
+ Pair ((PEsub (v, (PEc (qceiling q0)))), NonStrict)
+
+(** val neg_nformula : z nFormula -> (z pExpr, op1) prod **)
+
+let neg_nformula = function
+ | Pair (e, o) -> Pair ((PEopp (PEadd (e, (PEc (Zpos XH))))), o)
+
+(** val cutChecker :
+ z nFormula list -> z pExpr -> q -> zWitness -> z nFormula option **)
+
+let cutChecker l e lb pf =
+ match zWeakChecker (Cons ((neg_nformula (makeLb e lb)), l)) pf with
+ | True -> Some (makeLbCut e lb)
+ | False -> None
+
+(** val zChecker : z nFormula list -> proofTerm -> bool **)
+
+let rec zChecker l = function
+ | RatProof pf0 -> zWeakChecker l pf0
+ | CutProof (e, q0, pf0, rst) ->
+ (match cutChecker l e q0 pf0 with
+ | Some c -> zChecker (Cons (c, l)) rst
+ | None -> False)
+ | EnumProof (lb, e, ub, pf1, pf2, rst) ->
+ (match cutChecker l e lb pf1 with
+ | Some n0 ->
+ (match cutChecker l (PEopp e) (qopp ub) pf2 with
+ | Some n1 ->
+ let rec label pfs lb0 ub0 =
+ match pfs with
+ | Nil ->
+ (match z_gt_dec lb0 ub0 with
+ | Left -> True
+ | Right -> False)
+ | Cons (pf0, rsr) ->
+ (match zChecker (Cons ((Pair ((PEsub (e, (PEc
+ lb0))), Equal)), l)) pf0 with
+ | True -> label rsr (zplus lb0 (Zpos XH)) ub0
+ | False -> False)
+ in label rst (qceiling lb) (zopp (qceiling (qopp ub)))
+ | None -> False)
+ | None -> False)
+
+(** val zTautoChecker : z formula bFormula -> proofTerm list -> bool **)
+
+let zTautoChecker f w =
+ tauto_checker normalise negate zChecker f w
+
+(** val map_cone : (nat -> nat) -> zWitness -> zWitness **)
+
+let rec map_cone f e = match e with
+ | S_In n0 -> S_In (f n0)
+ | S_Ideal (e0, cm) -> S_Ideal (e0, (map_cone f cm))
+ | S_Monoid l -> S_Monoid (map f l)
+ | S_Mult (cm1, cm2) -> S_Mult ((map_cone f cm1), (map_cone f cm2))
+ | S_Add (cm1, cm2) -> S_Add ((map_cone f cm1), (map_cone f cm2))
+ | _ -> e
+
+(** val indexes : zWitness -> nat list **)
+
+let rec indexes = function
+ | S_In n0 -> Cons (n0, Nil)
+ | S_Ideal (e0, cm) -> indexes cm
+ | S_Monoid l -> l
+ | S_Mult (cm1, cm2) -> app (indexes cm1) (indexes cm2)
+ | S_Add (cm1, cm2) -> app (indexes cm1) (indexes cm2)
+ | _ -> Nil
+
+(** val n_of_Z : z -> n **)
+
+let n_of_Z = function
+ | Zpos p -> Npos p
+ | _ -> N0
+
+(** val qeq_bool : q -> q -> bool **)
+
+let qeq_bool p q0 =
+ zeq_bool (zmult p.qnum (Zpos q0.qden)) (zmult q0.qnum (Zpos p.qden))
+
+(** val qle_bool : q -> q -> bool **)
+
+let qle_bool x y =
+ zle_bool (zmult x.qnum (Zpos y.qden)) (zmult y.qnum (Zpos x.qden))
+
+type qWitness = q coneMember
+
+(** val qWeakChecker : q nFormula list -> q coneMember -> bool **)
+
+let qWeakChecker x x0 =
+ check_normalised_formulas { qnum = Z0; qden = XH } { qnum = (Zpos XH);
+ qden = XH } qplus qmult qminus qopp qeq_bool qle_bool x x0
+
+(** val qTautoChecker : q formula bFormula -> qWitness list -> bool **)
+
+let qTautoChecker f w =
+ tauto_checker (fun x -> cnf_normalise x) (fun x ->
+ cnf_negate x) qWeakChecker f w
+
diff --git a/contrib/micromega/micromega.mli b/contrib/micromega/micromega.mli
new file mode 100644
index 000000000..f94f091e8
--- /dev/null
+++ b/contrib/micromega/micromega.mli
@@ -0,0 +1,398 @@
+type __ = Obj.t
+
+type bool =
+ | True
+ | False
+
+val negb : bool -> bool
+
+type nat =
+ | O
+ | S of nat
+
+type 'a option =
+ | Some of 'a
+ | None
+
+type ('a, 'b) prod =
+ | Pair of 'a * 'b
+
+type comparison =
+ | Eq
+ | Lt
+ | Gt
+
+val compOpp : comparison -> comparison
+
+type sumbool =
+ | Left
+ | Right
+
+type 'a sumor =
+ | Inleft of 'a
+ | Inright
+
+type 'a list =
+ | Nil
+ | Cons of 'a * 'a list
+
+val app : 'a1 list -> 'a1 list -> 'a1 list
+
+val nth : nat -> 'a1 list -> 'a1 -> 'a1
+
+val map : ('a1 -> 'a2) -> 'a1 list -> 'a2 list
+
+type positive =
+ | XI of positive
+ | XO of positive
+ | XH
+
+val psucc : positive -> positive
+
+val pplus : positive -> positive -> positive
+
+val pplus_carry : positive -> positive -> positive
+
+val p_of_succ_nat : nat -> positive
+
+val pdouble_minus_one : positive -> positive
+
+type positive_mask =
+ | IsNul
+ | IsPos of positive
+ | IsNeg
+
+val pdouble_plus_one_mask : positive_mask -> positive_mask
+
+val pdouble_mask : positive_mask -> positive_mask
+
+val pdouble_minus_two : positive -> positive_mask
+
+val pminus_mask : positive -> positive -> positive_mask
+
+val pminus_mask_carry : positive -> positive -> positive_mask
+
+val pminus : positive -> positive -> positive
+
+val pmult : positive -> positive -> positive
+
+val pcompare : positive -> positive -> comparison -> comparison
+
+type n =
+ | N0
+ | Npos of positive
+
+type z =
+ | Z0
+ | Zpos of positive
+ | Zneg of positive
+
+val zdouble_plus_one : z -> z
+
+val zdouble_minus_one : z -> z
+
+val zdouble : z -> z
+
+val zPminus : positive -> positive -> z
+
+val zplus : z -> z -> z
+
+val zopp : z -> z
+
+val zminus : z -> z -> z
+
+val zmult : z -> z -> z
+
+val zcompare : z -> z -> comparison
+
+val dcompare_inf : comparison -> sumbool sumor
+
+val zcompare_rec : z -> z -> (__ -> 'a1) -> (__ -> 'a1) -> (__ -> 'a1) -> 'a1
+
+val z_gt_dec : z -> z -> sumbool
+
+val zle_bool : z -> z -> bool
+
+val zge_bool : z -> z -> bool
+
+val zgt_bool : z -> z -> bool
+
+val zeq_bool : z -> z -> bool
+
+val n_of_nat : nat -> n
+
+val zdiv_eucl_POS : positive -> z -> (z, z) prod
+
+val zdiv_eucl : z -> z -> (z, z) prod
+
+type 'c pol =
+ | Pc of 'c
+ | Pinj of positive * 'c pol
+ | PX of 'c pol * positive * 'c pol
+
+val p0 : 'a1 -> 'a1 pol
+
+val p1 : 'a1 -> 'a1 pol
+
+val peq : ('a1 -> 'a1 -> bool) -> 'a1 pol -> 'a1 pol -> bool
+
+val mkPinj_pred : positive -> 'a1 pol -> 'a1 pol
+
+val mkPX :
+ 'a1 -> ('a1 -> 'a1 -> bool) -> 'a1 pol -> positive -> 'a1 pol -> 'a1 pol
+
+val mkXi : 'a1 -> 'a1 -> positive -> 'a1 pol
+
+val mkX : 'a1 -> 'a1 -> 'a1 pol
+
+val popp : ('a1 -> 'a1) -> 'a1 pol -> 'a1 pol
+
+val paddC : ('a1 -> 'a1 -> 'a1) -> 'a1 pol -> 'a1 -> 'a1 pol
+
+val psubC : ('a1 -> 'a1 -> 'a1) -> 'a1 pol -> 'a1 -> 'a1 pol
+
+val paddI :
+ ('a1 -> 'a1 -> 'a1) -> ('a1 pol -> 'a1 pol -> 'a1 pol) -> 'a1 pol ->
+ positive -> 'a1 pol -> 'a1 pol
+
+val psubI :
+ ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1) -> ('a1 pol -> 'a1 pol -> 'a1 pol) ->
+ 'a1 pol -> positive -> 'a1 pol -> 'a1 pol
+
+val paddX :
+ 'a1 -> ('a1 -> 'a1 -> bool) -> ('a1 pol -> 'a1 pol -> 'a1 pol) -> 'a1 pol
+ -> positive -> 'a1 pol -> 'a1 pol
+
+val psubX :
+ 'a1 -> ('a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> ('a1 pol -> 'a1 pol -> 'a1
+ pol) -> 'a1 pol -> positive -> 'a1 pol -> 'a1 pol
+
+val padd :
+ 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1 pol -> 'a1 pol ->
+ 'a1 pol
+
+val psub :
+ 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1) -> ('a1
+ -> 'a1 -> bool) -> 'a1 pol -> 'a1 pol -> 'a1 pol
+
+val pmulC_aux :
+ 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1 pol -> 'a1 -> 'a1
+ pol
+
+val pmulC :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1 pol -> 'a1
+ -> 'a1 pol
+
+val pmulI :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> ('a1 pol ->
+ 'a1 pol -> 'a1 pol) -> 'a1 pol -> positive -> 'a1 pol -> 'a1 pol
+
+val pmul :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 ->
+ bool) -> 'a1 pol -> 'a1 pol -> 'a1 pol
+
+type 'c pExpr =
+ | PEc of 'c
+ | PEX of positive
+ | PEadd of 'c pExpr * 'c pExpr
+ | PEsub of 'c pExpr * 'c pExpr
+ | PEmul of 'c pExpr * 'c pExpr
+ | PEopp of 'c pExpr
+ | PEpow of 'c pExpr * n
+
+val mk_X : 'a1 -> 'a1 -> positive -> 'a1 pol
+
+val ppow_pos :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 ->
+ bool) -> ('a1 pol -> 'a1 pol) -> 'a1 pol -> 'a1 pol -> positive -> 'a1 pol
+
+val ppow_N :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 ->
+ bool) -> ('a1 pol -> 'a1 pol) -> 'a1 pol -> n -> 'a1 pol
+
+val norm_aux :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 ->
+ 'a1) -> ('a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1 pExpr -> 'a1 pol
+
+type 'a bFormula =
+ | TT
+ | FF
+ | X
+ | A of 'a
+ | Cj of 'a bFormula * 'a bFormula
+ | D of 'a bFormula * 'a bFormula
+ | N of 'a bFormula
+ | I of 'a bFormula * 'a bFormula
+
+type 'term' clause = 'term' list
+
+type 'term' cnf = 'term' clause list
+
+val tt : 'a1 cnf
+
+val ff : 'a1 cnf
+
+val or_clause_cnf : 'a1 clause -> 'a1 cnf -> 'a1 cnf
+
+val or_cnf : 'a1 cnf -> 'a1 cnf -> 'a1 cnf
+
+val and_cnf : 'a1 cnf -> 'a1 cnf -> 'a1 cnf
+
+val xcnf :
+ ('a1 -> 'a2 cnf) -> ('a1 -> 'a2 cnf) -> bool -> 'a1 bFormula -> 'a2 cnf
+
+val cnf_checker : ('a1 list -> 'a2 -> bool) -> 'a1 cnf -> 'a2 list -> bool
+
+val tauto_checker :
+ ('a1 -> 'a2 cnf) -> ('a1 -> 'a2 cnf) -> ('a2 list -> 'a3 -> bool) -> 'a1
+ bFormula -> 'a3 list -> bool
+
+type 'c pExprC = 'c pExpr
+
+type 'c polC = 'c pol
+
+type op1 =
+ | Equal
+ | NonEqual
+ | Strict
+ | NonStrict
+
+type 'c nFormula = ('c pExprC, op1) prod
+
+type monoidMember = nat list
+
+type 'c coneMember =
+ | S_In of nat
+ | S_Ideal of 'c pExprC * 'c coneMember
+ | S_Square of 'c pExprC
+ | S_Monoid of monoidMember
+ | S_Mult of 'c coneMember * 'c coneMember
+ | S_Add of 'c coneMember * 'c coneMember
+ | S_Pos of 'c
+ | S_Z
+
+val nformula_times : 'a1 nFormula -> 'a1 nFormula -> 'a1 nFormula
+
+val nformula_plus : 'a1 nFormula -> 'a1 nFormula -> 'a1 nFormula
+
+val eval_monoid : 'a1 -> 'a1 nFormula list -> monoidMember -> 'a1 pExprC
+
+val eval_cone :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> bool) -> ('a1 -> 'a1 -> bool) -> 'a1 nFormula
+ list -> 'a1 coneMember -> 'a1 nFormula
+
+val normalise_pexpr :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 ->
+ 'a1) -> ('a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1 pExprC -> 'a1 polC
+
+val check_inconsistent :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 ->
+ 'a1) -> ('a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> ('a1 -> 'a1 -> bool) -> 'a1
+ nFormula -> bool
+
+val check_normalised_formulas :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 ->
+ 'a1) -> ('a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> ('a1 -> 'a1 -> bool) -> 'a1
+ nFormula list -> 'a1 coneMember -> bool
+
+type op2 =
+ | OpEq
+ | OpNEq
+ | OpLe
+ | OpGe
+ | OpLt
+ | OpGt
+
+type 'c formula = { flhs : 'c pExprC; fop : op2; frhs : 'c pExprC }
+
+val flhs : 'a1 formula -> 'a1 pExprC
+
+val fop : 'a1 formula -> op2
+
+val frhs : 'a1 formula -> 'a1 pExprC
+
+val xnormalise : 'a1 formula -> 'a1 nFormula list
+
+val cnf_normalise : 'a1 formula -> 'a1 nFormula cnf
+
+val xnegate : 'a1 formula -> 'a1 nFormula list
+
+val cnf_negate : 'a1 formula -> 'a1 nFormula cnf
+
+val simpl_expr : 'a1 -> ('a1 -> 'a1 -> bool) -> 'a1 pExprC -> 'a1 pExprC
+
+val simpl_cone :
+ 'a1 -> 'a1 -> ('a1 -> 'a1 -> 'a1) -> ('a1 -> 'a1 -> bool) -> 'a1 coneMember
+ -> 'a1 coneMember
+
+type q = { qnum : z; qden : positive }
+
+val qnum : q -> z
+
+val qden : q -> positive
+
+val qplus : q -> q -> q
+
+val qmult : q -> q -> q
+
+val qopp : q -> q
+
+val qminus : q -> q -> q
+
+type 'a t =
+ | Empty
+ | Leaf of 'a
+ | Node of 'a t * 'a * 'a t
+
+val find : 'a1 -> 'a1 t -> positive -> 'a1
+
+type zWitness = z coneMember
+
+val zWeakChecker : z nFormula list -> z coneMember -> bool
+
+val xnormalise0 : z formula -> z nFormula list
+
+val normalise : z formula -> z nFormula cnf
+
+val xnegate0 : z formula -> z nFormula list
+
+val negate : z formula -> z nFormula cnf
+
+val ceiling : z -> z -> z
+
+type proofTerm =
+ | RatProof of zWitness
+ | CutProof of z pExprC * q * zWitness * proofTerm
+ | EnumProof of q * z pExprC * q * zWitness * zWitness * proofTerm list
+
+val makeLb : z pExpr -> q -> z nFormula
+
+val qceiling : q -> z
+
+val makeLbCut : z pExprC -> q -> z nFormula
+
+val neg_nformula : z nFormula -> (z pExpr, op1) prod
+
+val cutChecker :
+ z nFormula list -> z pExpr -> q -> zWitness -> z nFormula option
+
+val zChecker : z nFormula list -> proofTerm -> bool
+
+val zTautoChecker : z formula bFormula -> proofTerm list -> bool
+
+val map_cone : (nat -> nat) -> zWitness -> zWitness
+
+val indexes : zWitness -> nat list
+
+val n_of_Z : z -> n
+
+val qeq_bool : q -> q -> bool
+
+val qle_bool : q -> q -> bool
+
+type qWitness = q coneMember
+
+val qWeakChecker : q nFormula list -> q coneMember -> bool
+
+val qTautoChecker : q formula bFormula -> qWitness list -> bool
+
diff --git a/contrib/micromega/mutils.ml b/contrib/micromega/mutils.ml
new file mode 100644
index 000000000..2473608f2
--- /dev/null
+++ b/contrib/micromega/mutils.ml
@@ -0,0 +1,305 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+let debug = false
+
+let fst' (Micromega.Pair(x,y)) = x
+let snd' (Micromega.Pair(x,y)) = y
+
+let rec try_any l x =
+ match l with
+ | [] -> None
+ | (f,s)::l -> match f x with
+ | None -> try_any l x
+ | x -> x
+
+let list_try_find f =
+ let rec try_find_f = function
+ | [] -> failwith "try_find"
+ | h::t -> try f h with Failure _ -> try_find_f t
+ in
+ try_find_f
+
+let rec list_fold_right_elements f l =
+ let rec aux = function
+ | [] -> invalid_arg "list_fold_right_elements"
+ | [x] -> x
+ | x::l -> f x (aux l) in
+ aux l
+
+let interval n m =
+ let rec interval_n (l,m) =
+ if n > m then l else interval_n (m::l,pred m)
+ in
+ interval_n ([],m)
+
+open Num
+open Big_int
+
+let ppcm x y =
+ let g = gcd_big_int x y in
+ let x' = div_big_int x g in
+ let y' = div_big_int y g in
+ mult_big_int g (mult_big_int x' y')
+
+
+let denominator = function
+ | Int _ | Big_int _ -> unit_big_int
+ | Ratio r -> Ratio.denominator_ratio r
+
+let numerator = function
+ | Ratio r -> Ratio.numerator_ratio r
+ | Int i -> Big_int.big_int_of_int i
+ | Big_int i -> i
+
+let rec ppcm_list c l =
+ match l with
+ | [] -> c
+ | e::l -> ppcm_list (ppcm c (denominator e)) l
+
+let rec rec_gcd_list c l =
+ match l with
+ | [] -> c
+ | e::l -> rec_gcd_list (gcd_big_int c (numerator e)) l
+
+let rec gcd_list l =
+ let res = rec_gcd_list zero_big_int l in
+ if compare_big_int res zero_big_int = 0
+ then unit_big_int else res
+
+
+
+let rats_to_ints l =
+ let c = ppcm_list unit_big_int l in
+ List.map (fun x -> (div_big_int (mult_big_int (numerator x) c)
+ (denominator x))) l
+
+(* Nasty reordering of lists - useful to trim certificate down *)
+let mapi f l =
+ let rec xmapi i l =
+ match l with
+ | [] -> []
+ | e::l -> (f e i)::(xmapi (i+1) l) in
+ xmapi 0 l
+
+
+let concatMapi f l = List.rev (mapi (fun e i -> (i,f e)) l)
+
+(* assoc_pos j [a0...an] = [j,a0....an,j+n],j+n+1 *)
+let assoc_pos j l = (mapi (fun e i -> e,i+j) l, j + (List.length l))
+
+let assoc_pos_assoc l =
+ let rec xpos i l =
+ match l with
+ | [] -> []
+ | (x,l) ::rst -> let (l',j) = assoc_pos i l in
+ (x,l')::(xpos j rst) in
+ xpos 0 l
+
+let filter_pos f l =
+ (* Could sort ... take care of duplicates... *)
+ let rec xfilter l =
+ match l with
+ | [] -> []
+ | (x,e)::l ->
+ if List.exists (fun ee -> List.mem ee f) (List.map snd e)
+ then (x,e)::(xfilter l)
+ else xfilter l in
+ xfilter l
+
+let select_pos lpos l =
+ let rec xselect i lpos l =
+ match lpos with
+ | [] -> []
+ | j::rpos ->
+ match l with
+ | [] -> failwith "select_pos"
+ | e::l ->
+ if i = j
+ then e:: (xselect (i+1) rpos l)
+ else xselect (i+1) lpos l in
+ xselect 0 lpos l
+
+
+module CoqToCaml =
+struct
+ open Micromega
+
+ let rec nat = function
+ | O -> 0
+ | S n -> (nat n) + 1
+
+
+ let rec positive p =
+ match p with
+ | XH -> 1
+ | XI p -> 1+ 2*(positive p)
+ | XO p -> 2*(positive p)
+
+
+ let n nt =
+ match nt with
+ | N0 -> 0
+ | Npos p -> positive p
+
+
+ let rec index i = (* Swap left-right ? *)
+ match i with
+ | XH -> 1
+ | XI i -> 1+(2*(index i))
+ | XO i -> 2*(index i)
+
+
+ let z x =
+ match x with
+ | Z0 -> 0
+ | Zpos p -> (positive p)
+ | Zneg p -> - (positive p)
+
+ open Big_int
+
+ let rec positive_big_int p =
+ match p with
+ | XH -> unit_big_int
+ | XI p -> add_int_big_int 1 (mult_int_big_int 2 (positive_big_int p))
+ | XO p -> (mult_int_big_int 2 (positive_big_int p))
+
+
+ let z_big_int x =
+ match x with
+ | Z0 -> zero_big_int
+ | Zpos p -> (positive_big_int p)
+ | Zneg p -> minus_big_int (positive_big_int p)
+
+
+ let num x = Num.Big_int (z_big_int x)
+
+ let rec list elt l =
+ match l with
+ | Nil -> []
+ | Cons(e,l) -> (elt e)::(list elt l)
+
+ let q_to_num {qnum = x ; qden = y} =
+ Big_int (z_big_int x) // (Big_int (z_big_int (Zpos y)))
+
+end
+
+
+module CamlToCoq =
+struct
+ open Micromega
+
+ let rec nat = function
+ | 0 -> O
+ | n -> S (nat (n-1))
+
+
+ let rec positive n =
+ if n=1 then XH
+ else if n land 1 = 1 then XI (positive (n lsr 1))
+ else XO (positive (n lsr 1))
+
+ let n nt =
+ if nt < 0
+ then assert false
+ else if nt = 0 then N0
+ else Npos (positive nt)
+
+
+
+
+
+ let rec index n =
+ if n=1 then XH
+ else if n land 1 = 1 then XI (index (n lsr 1))
+ else XO (index (n lsr 1))
+
+
+ let idx n =
+ (*a.k.a path_of_int *)
+ (* returns the list of digits of n in reverse order with
+ initial 1 removed *)
+ let rec digits_of_int n =
+ if n=1 then []
+ else (n mod 2 = 1)::(digits_of_int (n lsr 1))
+ in
+ List.fold_right
+ (fun b c -> (if b then XI c else XO c))
+ (List.rev (digits_of_int n))
+ (XH)
+
+
+
+ let z x =
+ match compare x 0 with
+ | 0 -> Z0
+ | 1 -> Zpos (positive x)
+ | _ -> (* this should be -1 *)
+ Zneg (positive (-x))
+
+ open Big_int
+
+ let positive_big_int n =
+ let two = big_int_of_int 2 in
+ let rec _pos n =
+ if eq_big_int n unit_big_int then XH
+ else
+ let (q,m) = quomod_big_int n two in
+ if eq_big_int unit_big_int m
+ then XI (_pos q)
+ else XO (_pos q) in
+ _pos n
+
+ let bigint x =
+ match sign_big_int x with
+ | 0 -> Z0
+ | 1 -> Zpos (positive_big_int x)
+ | _ -> Zneg (positive_big_int (minus_big_int x))
+
+ let q n =
+ {Micromega.qnum = bigint (numerator n) ;
+ Micromega.qden = positive_big_int (denominator n)}
+
+
+ let list elt l = List.fold_right (fun x l -> Cons(elt x, l)) l Nil
+
+end
+
+module Cmp =
+struct
+
+ let rec compare_lexical l =
+ match l with
+ | [] -> 0 (* Equal *)
+ | f::l ->
+ let cmp = f () in
+ if cmp = 0 then compare_lexical l else cmp
+
+ let rec compare_list cmp l1 l2 =
+ match l1 , l2 with
+ | [] , [] -> 0
+ | [] , _ -> -1
+ | _ , [] -> 1
+ | e1::l1 , e2::l2 ->
+ let c = cmp e1 e2 in
+ if c = 0 then compare_list cmp l1 l2 else c
+
+ let hash_list hash l =
+ let rec _hash_list l h =
+ match l with
+ | [] -> h lxor (Hashtbl.hash [])
+ | e::l -> _hash_list l ((hash e) lxor h) in
+
+ _hash_list l 0
+end
diff --git a/contrib/micromega/sos.ml b/contrib/micromega/sos.ml
new file mode 100644
index 000000000..e3d72ed9a
--- /dev/null
+++ b/contrib/micromega/sos.ml
@@ -0,0 +1,1919 @@
+(* ========================================================================= *)
+(* - This code originates from John Harrison's HOL LIGHT 2.20 *)
+(* (see file LICENSE.sos for license, copyright and disclaimer) *)
+(* - Laurent Théry (thery@sophia.inria.fr) has isolated the HOL *)
+(* independent bits *)
+(* - Frédéric Besson (fbesson@irisa.fr) is using it to feed micromega *)
+(* - Addition of a csdp cache by the Coq development team *)
+(* ========================================================================= *)
+
+(* ========================================================================= *)
+(* Nonlinear universal reals procedure using SOS decomposition. *)
+(* ========================================================================= *)
+
+open Num;;
+open List;;
+
+let debugging = ref false;;
+
+exception Sanity;;
+
+exception Unsolvable;;
+
+(* ------------------------------------------------------------------------- *)
+(* Comparisons that are reflexive on NaN and also short-circuiting. *)
+(* ------------------------------------------------------------------------- *)
+
+let (=?) = fun x y -> Pervasives.compare x y = 0;;
+let (<?) = fun x y -> Pervasives.compare x y < 0;;
+let (<=?) = fun x y -> Pervasives.compare x y <= 0;;
+let (>?) = fun x y -> Pervasives.compare x y > 0;;
+let (>=?) = fun x y -> Pervasives.compare x y >= 0;;
+
+(* ------------------------------------------------------------------------- *)
+(* Combinators. *)
+(* ------------------------------------------------------------------------- *)
+
+let (o) = fun f g x -> f(g x);;
+
+(* ------------------------------------------------------------------------- *)
+(* Some useful functions on "num" type. *)
+(* ------------------------------------------------------------------------- *)
+
+
+let num_0 = Int 0
+and num_1 = Int 1
+and num_2 = Int 2
+and num_10 = Int 10;;
+
+let pow2 n = power_num num_2 (Int n);;
+let pow10 n = power_num num_10 (Int n);;
+
+let numdom r =
+ let r' = Ratio.normalize_ratio (ratio_of_num r) in
+ num_of_big_int(Ratio.numerator_ratio r'),
+ num_of_big_int(Ratio.denominator_ratio r');;
+
+let numerator = (o) fst numdom
+and denominator = (o) snd numdom;;
+
+let gcd_num n1 n2 =
+ num_of_big_int(Big_int.gcd_big_int (big_int_of_num n1) (big_int_of_num n2));;
+
+let lcm_num x y =
+ if x =/ num_0 & y =/ num_0 then num_0
+ else abs_num((x */ y) // gcd_num x y);;
+
+
+(* ------------------------------------------------------------------------- *)
+(* List basics. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec el n l =
+ if n = 0 then hd l else el (n - 1) (tl l);;
+
+
+(* ------------------------------------------------------------------------- *)
+(* Various versions of list iteration. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec itlist f l b =
+ match l with
+ [] -> b
+ | (h::t) -> f h (itlist f t b);;
+
+let rec end_itlist f l =
+ match l with
+ [] -> failwith "end_itlist"
+ | [x] -> x
+ | (h::t) -> f h (end_itlist f t);;
+
+let rec itlist2 f l1 l2 b =
+ match (l1,l2) with
+ ([],[]) -> b
+ | (h1::t1,h2::t2) -> f h1 h2 (itlist2 f t1 t2 b)
+ | _ -> failwith "itlist2";;
+
+(* ------------------------------------------------------------------------- *)
+(* All pairs arising from applying a function over two lists. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec allpairs f l1 l2 =
+ match l1 with
+ h1::t1 -> itlist (fun x a -> f h1 x :: a) l2 (allpairs f t1 l2)
+ | [] -> [];;
+
+(* ------------------------------------------------------------------------- *)
+(* String operations (surely there is a better way...) *)
+(* ------------------------------------------------------------------------- *)
+
+let implode l = itlist (^) l "";;
+
+let explode s =
+ let rec exap n l =
+ if n < 0 then l else
+ exap (n - 1) ((String.sub s n 1)::l) in
+ exap (String.length s - 1) [];;
+
+
+(* ------------------------------------------------------------------------- *)
+(* Attempting function or predicate applications. *)
+(* ------------------------------------------------------------------------- *)
+
+let can f x = try (f x; true) with Failure _ -> false;;
+
+
+(* ------------------------------------------------------------------------- *)
+(* Repetition of a function. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec funpow n f x =
+ if n < 1 then x else funpow (n-1) f (f x);;
+
+
+(* ------------------------------------------------------------------------- *)
+(* term?? *)
+(* ------------------------------------------------------------------------- *)
+
+type vname = string;;
+
+type term =
+| Zero
+| Const of Num.num
+| Var of vname
+| Inv of term
+| Opp of term
+| Add of (term * term)
+| Sub of (term * term)
+| Mul of (term * term)
+| Div of (term * term)
+| Pow of (term * int);;
+
+
+(* ------------------------------------------------------------------------- *)
+(* Data structure for Positivstellensatz refutations. *)
+(* ------------------------------------------------------------------------- *)
+
+type positivstellensatz =
+ Axiom_eq of int
+ | Axiom_le of int
+ | Axiom_lt of int
+ | Rational_eq of num
+ | Rational_le of num
+ | Rational_lt of num
+ | Square of term
+ | Monoid of int list
+ | Eqmul of term * positivstellensatz
+ | Sum of positivstellensatz * positivstellensatz
+ | Product of positivstellensatz * positivstellensatz;;
+
+
+
+(* ------------------------------------------------------------------------- *)
+(* Replication and sequences. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec replicate x n =
+ if n < 1 then []
+ else x::(replicate x (n - 1));;
+
+let rec (--) = fun m n -> if m > n then [] else m::((m + 1) -- n);;
+
+(* ------------------------------------------------------------------------- *)
+(* Various useful list operations. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec forall p l =
+ match l with
+ [] -> true
+ | h::t -> p(h) & forall p t;;
+
+let rec tryfind f l =
+ match l with
+ [] -> failwith "tryfind"
+ | (h::t) -> try f h with Failure _ -> tryfind f t;;
+
+let index x =
+ let rec ind n l =
+ match l with
+ [] -> failwith "index"
+ | (h::t) -> if x =? h then n else ind (n + 1) t in
+ ind 0;;
+
+(* ------------------------------------------------------------------------- *)
+(* "Set" operations on lists. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec mem x lis =
+ match lis with
+ [] -> false
+ | (h::t) -> x =? h or mem x t;;
+
+let insert x l =
+ if mem x l then l else x::l;;
+
+let union l1 l2 = itlist insert l1 l2;;
+
+let subtract l1 l2 = filter (fun x -> not (mem x l2)) l1;;
+
+(* ------------------------------------------------------------------------- *)
+(* Merging and bottom-up mergesort. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec merge ord l1 l2 =
+ match l1 with
+ [] -> l2
+ | h1::t1 -> match l2 with
+ [] -> l1
+ | h2::t2 -> if ord h1 h2 then h1::(merge ord t1 l2)
+ else h2::(merge ord l1 t2);;
+
+
+(* ------------------------------------------------------------------------- *)
+(* Common measure predicates to use with "sort". *)
+(* ------------------------------------------------------------------------- *)
+
+let increasing f x y = f x <? f y;;
+
+let decreasing f x y = f x >? f y;;
+
+(* ------------------------------------------------------------------------- *)
+(* Zipping, unzipping etc. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec zip l1 l2 =
+ match (l1,l2) with
+ ([],[]) -> []
+ | (h1::t1,h2::t2) -> (h1,h2)::(zip t1 t2)
+ | _ -> failwith "zip";;
+
+let rec unzip =
+ function [] -> [],[]
+ | ((a,b)::rest) -> let alist,blist = unzip rest in
+ (a::alist,b::blist);;
+
+(* ------------------------------------------------------------------------- *)
+(* Iterating functions over lists. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec do_list f l =
+ match l with
+ [] -> ()
+ | (h::t) -> (f h; do_list f t);;
+
+(* ------------------------------------------------------------------------- *)
+(* Sorting. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec sort cmp lis =
+ match lis with
+ [] -> []
+ | piv::rest ->
+ let r,l = partition (cmp piv) rest in
+ (sort cmp l) @ (piv::(sort cmp r));;
+
+(* ------------------------------------------------------------------------- *)
+(* Removing adjacent (NB!) equal elements from list. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec uniq l =
+ match l with
+ x::(y::_ as t) -> let t' = uniq t in
+ if x =? y then t' else
+ if t'==t then l else x::t'
+ | _ -> l;;
+
+(* ------------------------------------------------------------------------- *)
+(* Convert list into set by eliminating duplicates. *)
+(* ------------------------------------------------------------------------- *)
+
+let setify s = uniq (sort (<=?) s);;
+
+(* ------------------------------------------------------------------------- *)
+(* Polymorphic finite partial functions via Patricia trees. *)
+(* *)
+(* The point of this strange representation is that it is canonical (equal *)
+(* functions have the same encoding) yet reasonably efficient on average. *)
+(* *)
+(* Idea due to Diego Olivier Fernandez Pons (OCaml list, 2003/11/10). *)
+(* ------------------------------------------------------------------------- *)
+
+type ('a,'b)func =
+ Empty
+ | Leaf of int * ('a*'b)list
+ | Branch of int * int * ('a,'b)func * ('a,'b)func;;
+
+(* ------------------------------------------------------------------------- *)
+(* Undefined function. *)
+(* ------------------------------------------------------------------------- *)
+
+let undefined = Empty;;
+
+(* ------------------------------------------------------------------------- *)
+(* In case of equality comparison worries, better use this. *)
+(* ------------------------------------------------------------------------- *)
+
+let is_undefined f =
+ match f with
+ Empty -> true
+ | _ -> false;;
+
+(* ------------------------------------------------------------------------- *)
+(* Operation analagous to "map" for lists. *)
+(* ------------------------------------------------------------------------- *)
+
+let mapf =
+ let rec map_list f l =
+ match l with
+ [] -> []
+ | (x,y)::t -> (x,f(y))::(map_list f t) in
+ let rec mapf f t =
+ match t with
+ Empty -> Empty
+ | Leaf(h,l) -> Leaf(h,map_list f l)
+ | Branch(p,b,l,r) -> Branch(p,b,mapf f l,mapf f r) in
+ mapf;;
+
+(* ------------------------------------------------------------------------- *)
+(* Operations analogous to "fold" for lists. *)
+(* ------------------------------------------------------------------------- *)
+
+let foldl =
+ let rec foldl_list f a l =
+ match l with
+ [] -> a
+ | (x,y)::t -> foldl_list f (f a x y) t in
+ let rec foldl f a t =
+ match t with
+ Empty -> a
+ | Leaf(h,l) -> foldl_list f a l
+ | Branch(p,b,l,r) -> foldl f (foldl f a l) r in
+ foldl;;
+
+let foldr =
+ let rec foldr_list f l a =
+ match l with
+ [] -> a
+ | (x,y)::t -> f x y (foldr_list f t a) in
+ let rec foldr f t a =
+ match t with
+ Empty -> a
+ | Leaf(h,l) -> foldr_list f l a
+ | Branch(p,b,l,r) -> foldr f l (foldr f r a) in
+ foldr;;
+
+(* ------------------------------------------------------------------------- *)
+(* Redefinition and combination. *)
+(* ------------------------------------------------------------------------- *)
+
+let (|->),combine =
+ let ldb x y = let z = x lxor y in z land (-z) in
+ let newbranch p1 t1 p2 t2 =
+ let b = ldb p1 p2 in
+ let p = p1 land (b - 1) in
+ if p1 land b = 0 then Branch(p,b,t1,t2)
+ else Branch(p,b,t2,t1) in
+ let rec define_list (x,y as xy) l =
+ match l with
+ (a,b as ab)::t ->
+ if x =? a then xy::t
+ else if x <? a then xy::l
+ else ab::(define_list xy t)
+ | [] -> [xy]
+ and combine_list op z l1 l2 =
+ match (l1,l2) with
+ [],_ -> l2
+ | _,[] -> l1
+ | ((x1,y1 as xy1)::t1,(x2,y2 as xy2)::t2) ->
+ if x1 <? x2 then xy1::(combine_list op z t1 l2)
+ else if x2 <? x1 then xy2::(combine_list op z l1 t2) else
+ let y = op y1 y2 and l = combine_list op z t1 t2 in
+ if z(y) then l else (x1,y)::l in
+ let (|->) x y =
+ let k = Hashtbl.hash x in
+ let rec upd t =
+ match t with
+ Empty -> Leaf (k,[x,y])
+ | Leaf(h,l) ->
+ if h = k then Leaf(h,define_list (x,y) l)
+ else newbranch h t k (Leaf(k,[x,y]))
+ | Branch(p,b,l,r) ->
+ if k land (b - 1) <> p then newbranch p t k (Leaf(k,[x,y]))
+ else if k land b = 0 then Branch(p,b,upd l,r)
+ else Branch(p,b,l,upd r) in
+ upd in
+ let rec combine op z t1 t2 =
+ match (t1,t2) with
+ Empty,_ -> t2
+ | _,Empty -> t1
+ | Leaf(h1,l1),Leaf(h2,l2) ->
+ if h1 = h2 then
+ let l = combine_list op z l1 l2 in
+ if l = [] then Empty else Leaf(h1,l)
+ else newbranch h1 t1 h2 t2
+ | (Leaf(k,lis) as lf),(Branch(p,b,l,r) as br) |
+ (Branch(p,b,l,r) as br),(Leaf(k,lis) as lf) ->
+ if k land (b - 1) = p then
+ if k land b = 0 then
+ let l' = combine op z lf l in
+ if is_undefined l' then r else Branch(p,b,l',r)
+ else
+ let r' = combine op z lf r in
+ if is_undefined r' then l else Branch(p,b,l,r')
+ else
+ newbranch k lf p br
+ | Branch(p1,b1,l1,r1),Branch(p2,b2,l2,r2) ->
+ if b1 < b2 then
+ if p2 land (b1 - 1) <> p1 then newbranch p1 t1 p2 t2
+ else if p2 land b1 = 0 then
+ let l = combine op z l1 t2 in
+ if is_undefined l then r1 else Branch(p1,b1,l,r1)
+ else
+ let r = combine op z r1 t2 in
+ if is_undefined r then l1 else Branch(p1,b1,l1,r)
+ else if b2 < b1 then
+ if p1 land (b2 - 1) <> p2 then newbranch p1 t1 p2 t2
+ else if p1 land b2 = 0 then
+ let l = combine op z t1 l2 in
+ if is_undefined l then r2 else Branch(p2,b2,l,r2)
+ else
+ let r = combine op z t1 r2 in
+ if is_undefined r then l2 else Branch(p2,b2,l2,r)
+ else if p1 = p2 then
+ let l = combine op z l1 l2 and r = combine op z r1 r2 in
+ if is_undefined l then r
+ else if is_undefined r then l else Branch(p1,b1,l,r)
+ else
+ newbranch p1 t1 p2 t2 in
+ (|->),combine;;
+
+(* ------------------------------------------------------------------------- *)
+(* Special case of point function. *)
+(* ------------------------------------------------------------------------- *)
+
+let (|=>) = fun x y -> (x |-> y) undefined;;
+
+
+(* ------------------------------------------------------------------------- *)
+(* Grab an arbitrary element. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec choose t =
+ match t with
+ Empty -> failwith "choose: completely undefined function"
+ | Leaf(h,l) -> hd l
+ | Branch(b,p,t1,t2) -> choose t1;;
+
+(* ------------------------------------------------------------------------- *)
+(* Application. *)
+(* ------------------------------------------------------------------------- *)
+
+let applyd =
+ let rec apply_listd l d x =
+ match l with
+ (a,b)::t -> if x =? a then b
+ else if x >? a then apply_listd t d x else d x
+ | [] -> d x in
+ fun f d x ->
+ let k = Hashtbl.hash x in
+ let rec look t =
+ match t with
+ Leaf(h,l) when h = k -> apply_listd l d x
+ | Branch(p,b,l,r) -> look (if k land b = 0 then l else r)
+ | _ -> d x in
+ look f;;
+
+let apply f = applyd f (fun x -> failwith "apply");;
+
+let tryapplyd f a d = applyd f (fun x -> d) a;;
+
+let defined f x = try apply f x; true with Failure _ -> false;;
+
+(* ------------------------------------------------------------------------- *)
+(* Undefinition. *)
+(* ------------------------------------------------------------------------- *)
+
+let undefine =
+ let rec undefine_list x l =
+ match l with
+ (a,b as ab)::t ->
+ if x =? a then t
+ else if x <? a then l else
+ let t' = undefine_list x t in
+ if t' == t then l else ab::t'
+ | [] -> [] in
+ fun x ->
+ let k = Hashtbl.hash x in
+ let rec und t =
+ match t with
+ Leaf(h,l) when h = k ->
+ let l' = undefine_list x l in
+ if l' == l then t
+ else if l' = [] then Empty
+ else Leaf(h,l')
+ | Branch(p,b,l,r) when k land (b - 1) = p ->
+ if k land b = 0 then
+ let l' = und l in
+ if l' == l then t
+ else if is_undefined l' then r
+ else Branch(p,b,l',r)
+ else
+ let r' = und r in
+ if r' == r then t
+ else if is_undefined r' then l
+ else Branch(p,b,l,r')
+ | _ -> t in
+ und;;
+
+
+(* ------------------------------------------------------------------------- *)
+(* Mapping to sorted-list representation of the graph, domain and range. *)
+(* ------------------------------------------------------------------------- *)
+
+let graph f = setify (foldl (fun a x y -> (x,y)::a) [] f);;
+
+let dom f = setify(foldl (fun a x y -> x::a) [] f);;
+
+let ran f = setify(foldl (fun a x y -> y::a) [] f);;
+
+(* ------------------------------------------------------------------------- *)
+(* Turn a rational into a decimal string with d sig digits. *)
+(* ------------------------------------------------------------------------- *)
+
+let decimalize =
+ let rec normalize y =
+ if abs_num y </ Int 1 // Int 10 then normalize (Int 10 */ y) - 1
+ else if abs_num y >=/ Int 1 then normalize (y // Int 10) + 1
+ else 0 in
+ fun d x ->
+ if x =/ Int 0 then "0.0" else
+ let y = abs_num x in
+ let e = normalize y in
+ let z = pow10(-e) */ y +/ Int 1 in
+ let k = round_num(pow10 d */ z) in
+ (if x </ Int 0 then "-0." else "0.") ^
+ implode(tl(explode(string_of_num k))) ^
+ (if e = 0 then "" else "e"^string_of_int e);;
+
+
+(* ------------------------------------------------------------------------- *)
+(* Iterations over numbers, and lists indexed by numbers. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec itern k l f a =
+ match l with
+ [] -> a
+ | h::t -> itern (k + 1) t f (f h k a);;
+
+let rec iter (m,n) f a =
+ if n < m then a
+ else iter (m+1,n) f (f m a);;
+
+(* ------------------------------------------------------------------------- *)
+(* The main types. *)
+(* ------------------------------------------------------------------------- *)
+
+type vector = int*(int,num)func;;
+
+type matrix = (int*int)*(int*int,num)func;;
+
+type monomial = (vname,int)func;;
+
+type poly = (monomial,num)func;;
+
+(* ------------------------------------------------------------------------- *)
+(* Assignment avoiding zeros. *)
+(* ------------------------------------------------------------------------- *)
+
+let (|-->) x y a = if y =/ Int 0 then a else (x |-> y) a;;
+
+(* ------------------------------------------------------------------------- *)
+(* This can be generic. *)
+(* ------------------------------------------------------------------------- *)
+
+let element (d,v) i = tryapplyd v i (Int 0);;
+
+let mapa f (d,v) =
+ d,foldl (fun a i c -> (i |--> f(c)) a) undefined v;;
+
+let is_zero (d,v) =
+ match v with
+ Empty -> true
+ | _ -> false;;
+
+(* ------------------------------------------------------------------------- *)
+(* Vectors. Conventionally indexed 1..n. *)
+(* ------------------------------------------------------------------------- *)
+
+let vector_0 n = (n,undefined:vector);;
+
+let dim (v:vector) = fst v;;
+
+let vector_const c n =
+ if c =/ Int 0 then vector_0 n
+ else (n,itlist (fun k -> k |-> c) (1--n) undefined :vector);;
+
+let vector_1 = vector_const (Int 1);;
+
+let vector_cmul c (v:vector) =
+ let n = dim v in
+ if c =/ Int 0 then vector_0 n
+ else n,mapf (fun x -> c */ x) (snd v);;
+
+let vector_neg (v:vector) = (fst v,mapf minus_num (snd v) :vector);;
+
+let vector_add (v1:vector) (v2:vector) =
+ let m = dim v1 and n = dim v2 in
+ if m <> n then failwith "vector_add: incompatible dimensions" else
+ (n,combine (+/) (fun x -> x =/ Int 0) (snd v1) (snd v2) :vector);;
+
+let vector_sub v1 v2 = vector_add v1 (vector_neg v2);;
+
+let vector_of_list l =
+ let n = length l in
+ (n,itlist2 (|->) (1--n) l undefined :vector);;
+
+(* ------------------------------------------------------------------------- *)
+(* Matrices; again rows and columns indexed from 1. *)
+(* ------------------------------------------------------------------------- *)
+
+let matrix_0 (m,n) = ((m,n),undefined:matrix);;
+
+let dimensions (m:matrix) = fst m;;
+
+let matrix_const c (m,n as mn) =
+ if m <> n then failwith "matrix_const: needs to be square"
+ else if c =/ Int 0 then matrix_0 mn
+ else (mn,itlist (fun k -> (k,k) |-> c) (1--n) undefined :matrix);;
+
+let matrix_1 = matrix_const (Int 1);;
+
+let matrix_cmul c (m:matrix) =
+ let (i,j) = dimensions m in
+ if c =/ Int 0 then matrix_0 (i,j)
+ else (i,j),mapf (fun x -> c */ x) (snd m);;
+
+let matrix_neg (m:matrix) = (dimensions m,mapf minus_num (snd m) :matrix);;
+
+let matrix_add (m1:matrix) (m2:matrix) =
+ let d1 = dimensions m1 and d2 = dimensions m2 in
+ if d1 <> d2 then failwith "matrix_add: incompatible dimensions"
+ else (d1,combine (+/) (fun x -> x =/ Int 0) (snd m1) (snd m2) :matrix);;
+
+let matrix_sub m1 m2 = matrix_add m1 (matrix_neg m2);;
+
+let row k (m:matrix) =
+ let i,j = dimensions m in
+ (j,
+ foldl (fun a (i,j) c -> if i = k then (j |-> c) a else a) undefined (snd m)
+ : vector);;
+
+let column k (m:matrix) =
+ let i,j = dimensions m in
+ (i,
+ foldl (fun a (i,j) c -> if j = k then (i |-> c) a else a) undefined (snd m)
+ : vector);;
+
+let transp (m:matrix) =
+ let i,j = dimensions m in
+ ((j,i),foldl (fun a (i,j) c -> ((j,i) |-> c) a) undefined (snd m) :matrix);;
+
+let diagonal (v:vector) =
+ let n = dim v in
+ ((n,n),foldl (fun a i c -> ((i,i) |-> c) a) undefined (snd v) : matrix);;
+
+let matrix_of_list l =
+ let m = length l in
+ if m = 0 then matrix_0 (0,0) else
+ let n = length (hd l) in
+ (m,n),itern 1 l (fun v i -> itern 1 v (fun c j -> (i,j) |-> c)) undefined;;
+
+(* ------------------------------------------------------------------------- *)
+(* Monomials. *)
+(* ------------------------------------------------------------------------- *)
+
+let monomial_eval assig (m:monomial) =
+ foldl (fun a x k -> a */ power_num (apply assig x) (Int k))
+ (Int 1) m;;
+
+let monomial_1 = (undefined:monomial);;
+
+let monomial_var x = (x |=> 1 :monomial);;
+
+let (monomial_mul:monomial->monomial->monomial) =
+ combine (+) (fun x -> false);;
+
+let monomial_pow (m:monomial) k =
+ if k = 0 then monomial_1
+ else mapf (fun x -> k * x) m;;
+
+let monomial_divides (m1:monomial) (m2:monomial) =
+ foldl (fun a x k -> tryapplyd m2 x 0 >= k & a) true m1;;
+
+let monomial_div (m1:monomial) (m2:monomial) =
+ let m = combine (+) (fun x -> x = 0) m1 (mapf (fun x -> -x) m2) in
+ if foldl (fun a x k -> k >= 0 & a) true m then m
+ else failwith "monomial_div: non-divisible";;
+
+let monomial_degree x (m:monomial) = tryapplyd m x 0;;
+
+let monomial_lcm (m1:monomial) (m2:monomial) =
+ (itlist (fun x -> x |-> max (monomial_degree x m1) (monomial_degree x m2))
+ (union (dom m1) (dom m2)) undefined :monomial);;
+
+let monomial_multidegree (m:monomial) = foldl (fun a x k -> k + a) 0 m;;
+
+let monomial_variables m = dom m;;
+
+(* ------------------------------------------------------------------------- *)
+(* Polynomials. *)
+(* ------------------------------------------------------------------------- *)
+
+let eval assig (p:poly) =
+ foldl (fun a m c -> a +/ c */ monomial_eval assig m) (Int 0) p;;
+
+let poly_0 = (undefined:poly);;
+
+let poly_isconst (p:poly) = foldl (fun a m c -> m = monomial_1 & a) true p;;
+
+let poly_var x = ((monomial_var x) |=> Int 1 :poly);;
+
+let poly_const c =
+ if c =/ Int 0 then poly_0 else (monomial_1 |=> c);;
+
+let poly_cmul c (p:poly) =
+ if c =/ Int 0 then poly_0
+ else mapf (fun x -> c */ x) p;;
+
+let poly_neg (p:poly) = (mapf minus_num p :poly);;
+
+let poly_add (p1:poly) (p2:poly) =
+ (combine (+/) (fun x -> x =/ Int 0) p1 p2 :poly);;
+
+let poly_sub p1 p2 = poly_add p1 (poly_neg p2);;
+
+let poly_cmmul (c,m) (p:poly) =
+ if c =/ Int 0 then poly_0
+ else if m = monomial_1 then mapf (fun d -> c */ d) p
+ else foldl (fun a m' d -> (monomial_mul m m' |-> c */ d) a) poly_0 p;;
+
+let poly_mul (p1:poly) (p2:poly) =
+ foldl (fun a m c -> poly_add (poly_cmmul (c,m) p2) a) poly_0 p1;;
+
+let poly_div (p1:poly) (p2:poly) =
+ if not(poly_isconst p2) then failwith "poly_div: non-constant" else
+ let c = eval undefined p2 in
+ if c =/ Int 0 then failwith "poly_div: division by zero"
+ else poly_cmul (Int 1 // c) p1;;
+
+let poly_square p = poly_mul p p;;
+
+let rec poly_pow p k =
+ if k = 0 then poly_const (Int 1)
+ else if k = 1 then p
+ else let q = poly_square(poly_pow p (k / 2)) in
+ if k mod 2 = 1 then poly_mul p q else q;;
+
+let poly_exp p1 p2 =
+ if not(poly_isconst p2) then failwith "poly_exp: not a constant" else
+ poly_pow p1 (Num.int_of_num (eval undefined p2));;
+
+let degree x (p:poly) = foldl (fun a m c -> max (monomial_degree x m) a) 0 p;;
+
+let multidegree (p:poly) =
+ foldl (fun a m c -> max (monomial_multidegree m) a) 0 p;;
+
+let poly_variables (p:poly) =
+ foldr (fun m c -> union (monomial_variables m)) p [];;
+
+(* ------------------------------------------------------------------------- *)
+(* Order monomials for human presentation. *)
+(* ------------------------------------------------------------------------- *)
+
+let humanorder_varpow (x1,k1) (x2,k2) = x1 < x2 or (x1 = x2 & k1 > k2);;
+
+let humanorder_monomial =
+ let rec ord l1 l2 = match (l1,l2) with
+ _,[] -> true
+ | [],_ -> false
+ | h1::t1,h2::t2 -> humanorder_varpow h1 h2 or (h1 = h2 & ord t1 t2) in
+ fun m1 m2 -> m1 = m2 or
+ ord (sort humanorder_varpow (graph m1))
+ (sort humanorder_varpow (graph m2));;
+
+(* ------------------------------------------------------------------------- *)
+(* Conversions to strings. *)
+(* ------------------------------------------------------------------------- *)
+
+let string_of_vector min_size max_size (v:vector) =
+ let n_raw = dim v in
+ if n_raw = 0 then "[]" else
+ let n = max min_size (min n_raw max_size) in
+ let xs = map ((o) string_of_num (element v)) (1--n) in
+ "[" ^ end_itlist (fun s t -> s ^ ", " ^ t) xs ^
+ (if n_raw > max_size then ", ...]" else "]");;
+
+let string_of_matrix max_size (m:matrix) =
+ let i_raw,j_raw = dimensions m in
+ let i = min max_size i_raw and j = min max_size j_raw in
+ let rstr = map (fun k -> string_of_vector j j (row k m)) (1--i) in
+ "["^end_itlist(fun s t -> s^";\n "^t) rstr ^
+ (if j > max_size then "\n ...]" else "]");;
+
+let string_of_vname (v:vname): string = (v: string);;
+
+let rec string_of_term t =
+ match t with
+ Opp t1 -> "(- " ^ string_of_term t1 ^ ")"
+| Add (t1, t2) ->
+ "(" ^ (string_of_term t1) ^ " + " ^ (string_of_term t2) ^ ")"
+| Sub (t1, t2) ->
+ "(" ^ (string_of_term t1) ^ " - " ^ (string_of_term t2) ^ ")"
+| Mul (t1, t2) ->
+ "(" ^ (string_of_term t1) ^ " * " ^ (string_of_term t2) ^ ")"
+| Inv t1 -> "(/ " ^ string_of_term t1 ^ ")"
+| Div (t1, t2) ->
+ "(" ^ (string_of_term t1) ^ " / " ^ (string_of_term t2) ^ ")"
+| Pow (t1, n1) ->
+ "(" ^ (string_of_term t1) ^ " ^ " ^ (string_of_int n1) ^ ")"
+| Zero -> "0"
+| Var v -> "x" ^ (string_of_vname v)
+| Const x -> string_of_num x;;
+
+
+let string_of_varpow x k =
+ if k = 1 then string_of_vname x else string_of_vname x^"^"^string_of_int k;;
+
+let string_of_monomial m =
+ if m = monomial_1 then "1" else
+ let vps = List.fold_right (fun (x,k) a -> string_of_varpow x k :: a)
+ (sort humanorder_varpow (graph m)) [] in
+ end_itlist (fun s t -> s^"*"^t) vps;;
+
+let string_of_cmonomial (c,m) =
+ if m = monomial_1 then string_of_num c
+ else if c =/ Int 1 then string_of_monomial m
+ else string_of_num c ^ "*" ^ string_of_monomial m;;
+
+let string_of_poly (p:poly) =
+ if p = poly_0 then "<<0>>" else
+ let cms = sort (fun (m1,_) (m2,_) -> humanorder_monomial m1 m2) (graph p) in
+ let s =
+ List.fold_left (fun a (m,c) ->
+ if c </ Int 0 then a ^ " - " ^ string_of_cmonomial(minus_num c,m)
+ else a ^ " + " ^ string_of_cmonomial(c,m))
+ "" cms in
+ let s1 = String.sub s 0 3
+ and s2 = String.sub s 3 (String.length s - 3) in
+ "<<" ^(if s1 = " + " then s2 else "-"^s2)^">>";;
+
+(* ------------------------------------------------------------------------- *)
+(* Printers. *)
+(* ------------------------------------------------------------------------- *)
+
+let print_vector v = Format.print_string(string_of_vector 0 20 v);;
+
+let print_matrix m = Format.print_string(string_of_matrix 20 m);;
+
+let print_monomial m = Format.print_string(string_of_monomial m);;
+
+let print_poly m = Format.print_string(string_of_poly m);;
+
+(*
+#install_printer print_vector;;
+#install_printer print_matrix;;
+#install_printer print_monomial;;
+#install_printer print_poly;;
+*)
+
+(* ------------------------------------------------------------------------- *)
+(* Conversion from term. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec poly_of_term t = match t with
+ Zero -> poly_0
+| Const n -> poly_const n
+| Var x -> poly_var x
+| Opp t1 -> poly_neg (poly_of_term t1)
+| Inv t1 ->
+ let p = poly_of_term t1 in
+ if poly_isconst p then poly_const(Int 1 // eval undefined p)
+ else failwith "poly_of_term: inverse of non-constant polyomial"
+| Add (l, r) -> poly_add (poly_of_term l) (poly_of_term r)
+| Sub (l, r) -> poly_sub (poly_of_term l) (poly_of_term r)
+| Mul (l, r) -> poly_mul (poly_of_term l) (poly_of_term r)
+| Div (l, r) ->
+ let p = poly_of_term l and q = poly_of_term r in
+ if poly_isconst q then poly_cmul (Int 1 // eval undefined q) p
+ else failwith "poly_of_term: division by non-constant polynomial"
+| Pow (t, n) ->
+ poly_pow (poly_of_term t) n;;
+
+(* ------------------------------------------------------------------------- *)
+(* String of vector (just a list of space-separated numbers). *)
+(* ------------------------------------------------------------------------- *)
+
+let sdpa_of_vector (v:vector) =
+ let n = dim v in
+ let strs = map (o (decimalize 20) (element v)) (1--n) in
+ end_itlist (fun x y -> x ^ " " ^ y) strs ^ "\n";;
+
+(* ------------------------------------------------------------------------- *)
+(* String for block diagonal matrix numbered k. *)
+(* ------------------------------------------------------------------------- *)
+
+let sdpa_of_blockdiagonal k m =
+ let pfx = string_of_int k ^" " in
+ let ents =
+ foldl (fun a (b,i,j) c -> if i > j then a else ((b,i,j),c)::a) [] m in
+ let entss = sort (increasing fst) ents in
+ itlist (fun ((b,i,j),c) a ->
+ pfx ^ string_of_int b ^ " " ^ string_of_int i ^ " " ^ string_of_int j ^
+ " " ^ decimalize 20 c ^ "\n" ^ a) entss "";;
+
+(* ------------------------------------------------------------------------- *)
+(* String for a matrix numbered k, in SDPA sparse format. *)
+(* ------------------------------------------------------------------------- *)
+
+let sdpa_of_matrix k (m:matrix) =
+ let pfx = string_of_int k ^ " 1 " in
+ let ms = foldr (fun (i,j) c a -> if i > j then a else ((i,j),c)::a)
+ (snd m) [] in
+ let mss = sort (increasing fst) ms in
+ itlist (fun ((i,j),c) a ->
+ pfx ^ string_of_int i ^ " " ^ string_of_int j ^
+ " " ^ decimalize 20 c ^ "\n" ^ a) mss "";;
+
+(* ------------------------------------------------------------------------- *)
+(* String in SDPA sparse format for standard SDP problem: *)
+(* *)
+(* X = v_1 * [M_1] + ... + v_m * [M_m] - [M_0] must be PSD *)
+(* Minimize obj_1 * v_1 + ... obj_m * v_m *)
+(* ------------------------------------------------------------------------- *)
+
+let sdpa_of_problem comment obj mats =
+ let m = length mats - 1
+ and n,_ = dimensions (hd mats) in
+ "\"" ^ comment ^ "\"\n" ^
+ string_of_int m ^ "\n" ^
+ "1\n" ^
+ string_of_int n ^ "\n" ^
+ sdpa_of_vector obj ^
+ itlist2 (fun k m a -> sdpa_of_matrix (k - 1) m ^ a)
+ (1--length mats) mats "";;
+
+(* ------------------------------------------------------------------------- *)
+(* More parser basics. *)
+(* ------------------------------------------------------------------------- *)
+
+exception Noparse;;
+
+
+let isspace,issep,isbra,issymb,isalpha,isnum,isalnum =
+ let charcode s = Char.code(String.get s 0) in
+ let spaces = " \t\n\r"
+ and separators = ",;"
+ and brackets = "()[]{}"
+ and symbs = "\\!@#$%^&*-+|\\<=>/?~.:"
+ and alphas = "'abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ and nums = "0123456789" in
+ let allchars = spaces^separators^brackets^symbs^alphas^nums in
+ let csetsize = itlist ((o) max charcode) (explode allchars) 256 in
+ let ctable = Array.make csetsize 0 in
+ do_list (fun c -> Array.set ctable (charcode c) 1) (explode spaces);
+ do_list (fun c -> Array.set ctable (charcode c) 2) (explode separators);
+ do_list (fun c -> Array.set ctable (charcode c) 4) (explode brackets);
+ do_list (fun c -> Array.set ctable (charcode c) 8) (explode symbs);
+ do_list (fun c -> Array.set ctable (charcode c) 16) (explode alphas);
+ do_list (fun c -> Array.set ctable (charcode c) 32) (explode nums);
+ let isspace c = Array.get ctable (charcode c) = 1
+ and issep c = Array.get ctable (charcode c) = 2
+ and isbra c = Array.get ctable (charcode c) = 4
+ and issymb c = Array.get ctable (charcode c) = 8
+ and isalpha c = Array.get ctable (charcode c) = 16
+ and isnum c = Array.get ctable (charcode c) = 32
+ and isalnum c = Array.get ctable (charcode c) >= 16 in
+ isspace,issep,isbra,issymb,isalpha,isnum,isalnum;;
+
+let (||) parser1 parser2 input =
+ try parser1 input
+ with Noparse -> parser2 input;;
+
+let (++) parser1 parser2 input =
+ let result1,rest1 = parser1 input in
+ let result2,rest2 = parser2 rest1 in
+ (result1,result2),rest2;;
+
+let rec many prs input =
+ try let result,next = prs input in
+ let results,rest = many prs next in
+ (result::results),rest
+ with Noparse -> [],input;;
+
+let (>>) prs treatment input =
+ let result,rest = prs input in
+ treatment(result),rest;;
+
+let fix err prs input =
+ try prs input
+ with Noparse -> failwith (err ^ " expected");;
+
+let rec listof prs sep err =
+ prs ++ many (sep ++ fix err prs >> snd) >> (fun (h,t) -> h::t);;
+
+let possibly prs input =
+ try let x,rest = prs input in [x],rest
+ with Noparse -> [],input;;
+
+let some p =
+ function
+ [] -> raise Noparse
+ | (h::t) -> if p h then (h,t) else raise Noparse;;
+
+let a tok = some (fun item -> item = tok);;
+
+let rec atleast n prs i =
+ (if n <= 0 then many prs
+ else prs ++ atleast (n - 1) prs >> (fun (h,t) -> h::t)) i;;
+
+let finished input =
+ if input = [] then 0,input else failwith "Unparsed input";;
+
+let word s =
+ end_itlist (fun p1 p2 -> (p1 ++ p2) >> (fun (s,t) -> s^t))
+ (map a (explode s));;
+
+let token s =
+ many (some isspace) ++ word s ++ many (some isspace)
+ >> (fun ((_,t),_) -> t);;
+
+let decimal =
+ let numeral = some isnum in
+ let decimalint = atleast 1 numeral >> ((o) Num.num_of_string implode) in
+ let decimalfrac = atleast 1 numeral
+ >> (fun s -> Num.num_of_string(implode s) // pow10 (length s)) in
+ let decimalsig =
+ decimalint ++ possibly (a "." ++ decimalfrac >> snd)
+ >> (function (h,[]) -> h | (h,[x]) -> h +/ x | _ -> failwith "decimalsig") in
+ let signed prs =
+ a "-" ++ prs >> ((o) minus_num snd)
+ || a "+" ++ prs >> snd
+ || prs in
+ let exponent = (a "e" || a "E") ++ signed decimalint >> snd in
+ signed decimalsig ++ possibly exponent
+ >> (function (h,[]) -> h | (h,[x]) -> h */ power_num (Int 10) x | _ ->
+ failwith "exponent");;
+
+let mkparser p s =
+ let x,rst = p(explode s) in
+ if rst = [] then x else failwith "mkparser: unparsed input";;
+
+let parse_decimal = mkparser decimal;;
+
+(* ------------------------------------------------------------------------- *)
+(* Parse back a vector. *)
+(* ------------------------------------------------------------------------- *)
+
+let parse_csdpoutput =
+ let rec skipupto dscr prs inp =
+ (dscr ++ prs >> snd
+ || some (fun c -> true) ++ skipupto dscr prs >> snd) inp in
+ let ignore inp = (),[] in
+ let csdpoutput =
+ (decimal ++ many(a " " ++ decimal >> snd) >> (fun (h,t) -> h::t)) ++
+ (a " " ++ a "\n" ++ ignore) >> ((o) vector_of_list fst) in
+ mkparser csdpoutput;;
+
+(* ------------------------------------------------------------------------- *)
+(* CSDP parameters; so far I'm sticking with the defaults. *)
+(* ------------------------------------------------------------------------- *)
+
+let csdp_default_parameters =
+"axtol=1.0e-8
+atytol=1.0e-8
+objtol=1.0e-8
+pinftol=1.0e8
+dinftol=1.0e8
+maxiter=100
+minstepfrac=0.9
+maxstepfrac=0.97
+minstepp=1.0e-8
+minstepd=1.0e-8
+usexzgap=1
+tweakgap=0
+affine=0
+printlevel=1
+";;
+
+let csdp_params = csdp_default_parameters;;
+
+(* ------------------------------------------------------------------------- *)
+(* The same thing with CSDP. *)
+(* Modified by the Coq development team to use a cache *)
+(* ------------------------------------------------------------------------- *)
+
+let buffer_add_line buff line =
+ Buffer.add_string buff line; Buffer.add_char buff '\n'
+
+let string_of_file filename =
+ let fd = open_in filename in
+ let buff = Buffer.create 16 in
+ try while true do buffer_add_line buff (input_line fd) done; failwith ""
+ with End_of_file -> (close_in fd; Buffer.contents buff)
+
+let file_of_string filename s =
+ let fd = Pervasives.open_out filename in
+ output_string fd s; close_out fd
+
+let request_mark = "*** REQUEST ***"
+let answer_mark = "*** ANSWER ***"
+let end_mark = "*** END ***"
+let infeasible_mark = "Infeasible\n"
+let failure_mark = "Failure\n"
+
+let cache_name = "csdp.cache"
+
+let look_in_cache string_problem =
+ let n = String.length string_problem in
+ try
+ let inch = open_in cache_name in
+ let rec search () =
+ while input_line inch <> request_mark do () done;
+ let i = ref 0 in
+ while !i < n & string_problem.[!i] = input_char inch do incr i done;
+ if !i < n or input_line inch <> answer_mark then
+ search ()
+ else begin
+ let buff = Buffer.create 16 in
+ let line = ref (input_line inch) in
+ while (!line <> end_mark) do
+ buffer_add_line buff !line; line := input_line inch
+ done;
+ close_in inch;
+ Buffer.contents buff
+ end in
+ try search () with End_of_file -> close_in inch; raise Not_found
+ with Sys_error _ -> raise Not_found
+
+let flush_to_cache string_problem string_result =
+ try
+ let flags = [Open_append;Open_text;Open_creat] in
+ let outch = open_out_gen flags 0o666 cache_name in
+ begin
+ try
+ Printf.fprintf outch "%s\n" request_mark;
+ Printf.fprintf outch "%s" string_problem;
+ Printf.fprintf outch "%s\n" answer_mark;
+ Printf.fprintf outch "%s" string_result;
+ Printf.fprintf outch "%s\n" end_mark;
+ with Sys_error _ as e -> close_out outch; raise e
+ end;
+ close_out outch
+ with Sys_error _ ->
+ print_endline "Warning: Could not open or write to csdp cache"
+
+exception CsdpInfeasible
+
+let run_csdp dbg string_problem =
+ try
+ let res = look_in_cache string_problem in
+ if res = infeasible_mark then raise CsdpInfeasible;
+ if res = failure_mark then failwith "csdp error";
+ res
+ with Not_found ->
+ let input_file = Filename.temp_file "sos" ".dat-s" in
+ let output_file = Filename.temp_file "sos" ".dat-s" in
+ let temp_path = Filename.dirname input_file in
+ let params_file = Filename.concat temp_path "param.csdp" in
+ file_of_string input_file string_problem;
+ file_of_string params_file csdp_params;
+ let rv = Sys.command("cd "^temp_path^"; csdp "^input_file^" "^output_file^
+ (if dbg then "" else "> /dev/null")) in
+ if rv = 1 or rv = 2 then
+ (flush_to_cache string_problem infeasible_mark; raise CsdpInfeasible);
+ if rv = 127 then
+ (print_string "csdp not found, exiting..."; exit 1);
+ if rv <> 0 & rv <> 3 (* reduced accuracy *) then
+ (flush_to_cache string_problem failure_mark;
+ failwith("csdp: error "^string_of_int rv));
+ let string_result = string_of_file output_file in
+ flush_to_cache string_problem string_result;
+ if not dbg then
+ (Sys.remove input_file; Sys.remove output_file; Sys.remove params_file);
+ string_result
+
+let csdp obj mats =
+ try parse_csdpoutput (run_csdp !debugging (sdpa_of_problem "" obj mats))
+ with CsdpInfeasible -> failwith "csdp: Problem is infeasible"
+
+(* ------------------------------------------------------------------------- *)
+(* Try some apparently sensible scaling first. Note that this is purely to *)
+(* get a cleaner translation to floating-point, and doesn't affect any of *)
+(* the results, in principle. In practice it seems a lot better when there *)
+(* are extreme numbers in the original problem. *)
+(* ------------------------------------------------------------------------- *)
+
+let scale_then =
+ let common_denominator amat acc =
+ foldl (fun a m c -> lcm_num (denominator c) a) acc amat
+ and maximal_element amat acc =
+ foldl (fun maxa m c -> max_num maxa (abs_num c)) acc amat in
+ fun solver obj mats ->
+ let cd1 = itlist common_denominator mats (Int 1)
+ and cd2 = common_denominator (snd obj) (Int 1) in
+ let mats' = map (mapf (fun x -> cd1 */ x)) mats
+ and obj' = vector_cmul cd2 obj in
+ let max1 = itlist maximal_element mats' (Int 0)
+ and max2 = maximal_element (snd obj') (Int 0) in
+ let scal1 = pow2 (20-int_of_float(log(float_of_num max1) /. log 2.0))
+ and scal2 = pow2 (20-int_of_float(log(float_of_num max2) /. log 2.0)) in
+ let mats'' = map (mapf (fun x -> x */ scal1)) mats'
+ and obj'' = vector_cmul scal2 obj' in
+ solver obj'' mats'';;
+
+(* ------------------------------------------------------------------------- *)
+(* Round a vector to "nice" rationals. *)
+(* ------------------------------------------------------------------------- *)
+
+let nice_rational n x = round_num (n */ x) // n;;
+
+let nice_vector n = mapa (nice_rational n);;
+
+(* ------------------------------------------------------------------------- *)
+(* Reduce linear program to SDP (diagonal matrices) and test with CSDP. This *)
+(* one tests A [-1;x1;..;xn] >= 0 (i.e. left column is negated constants). *)
+(* ------------------------------------------------------------------------- *)
+
+let linear_program_basic a =
+ let m,n = dimensions a in
+ let mats = map (fun j -> diagonal (column j a)) (1--n)
+ and obj = vector_const (Int 1) m in
+ try ignore (run_csdp false (sdpa_of_problem "" obj mats)); true
+ with CsdpInfeasible -> false
+
+(* ------------------------------------------------------------------------- *)
+(* Test whether a point is in the convex hull of others. Rather than use *)
+(* computational geometry, express as linear inequalities and call CSDP. *)
+(* This is a bit lazy of me, but it's easy and not such a bottleneck so far. *)
+(* ------------------------------------------------------------------------- *)
+
+let in_convex_hull pts pt =
+ let pts1 = (1::pt) :: map (fun x -> 1::x) pts in
+ let pts2 = map (fun p -> map (fun x -> -x) p @ p) pts1 in
+ let n = length pts + 1
+ and v = 2 * (length pt + 1) in
+ let m = v + n - 1 in
+ let mat =
+ (m,n),
+ itern 1 pts2 (fun pts j -> itern 1 pts (fun x i -> (i,j) |-> Int x))
+ (iter (1,n) (fun i -> (v + i,i+1) |-> Int 1) undefined) in
+ linear_program_basic mat;;
+
+(* ------------------------------------------------------------------------- *)
+(* Filter down a set of points to a minimal set with the same convex hull. *)
+(* ------------------------------------------------------------------------- *)
+
+let minimal_convex_hull =
+ let augment1 = function (m::ms) -> if in_convex_hull ms m then ms else ms@[m]
+ | _ -> failwith "augment1"
+ in
+ let augment m ms = funpow 3 augment1 (m::ms) in
+ fun mons ->
+ let mons' = itlist augment (tl mons) [hd mons] in
+ funpow (length mons') augment1 mons';;
+
+(* ------------------------------------------------------------------------- *)
+(* Stuff for "equations" (generic A->num functions). *)
+(* ------------------------------------------------------------------------- *)
+
+let equation_cmul c eq =
+ if c =/ Int 0 then Empty else mapf (fun d -> c */ d) eq;;
+
+let equation_add eq1 eq2 = combine (+/) (fun x -> x =/ Int 0) eq1 eq2;;
+
+let equation_eval assig eq =
+ let value v = apply assig v in
+ foldl (fun a v c -> a +/ value(v) */ c) (Int 0) eq;;
+
+(* ------------------------------------------------------------------------- *)
+(* Eliminate among linear equations: return unconstrained variables and *)
+(* assignments for the others in terms of them. We give one pseudo-variable *)
+(* "one" that's used for a constant term. *)
+(* ------------------------------------------------------------------------- *)
+
+
+let eliminate_equations =
+ let rec extract_first p l =
+ match l with
+ [] -> failwith "extract_first"
+ | h::t -> if p(h) then h,t else
+ let k,s = extract_first p t in
+ k,h::s in
+ let rec eliminate vars dun eqs =
+ match vars with
+ [] -> if forall is_undefined eqs then dun
+ else (raise Unsolvable)
+ | v::vs ->
+ try let eq,oeqs = extract_first (fun e -> defined e v) eqs in
+ let a = apply eq v in
+ let eq' = equation_cmul (Int(-1) // a) (undefine v eq) in
+ let elim e =
+ let b = tryapplyd e v (Int 0) in
+ if b =/ Int 0 then e else
+ equation_add e (equation_cmul (minus_num b // a) eq) in
+ eliminate vs ((v |-> eq') (mapf elim dun)) (map elim oeqs)
+ with Failure _ -> eliminate vs dun eqs in
+ fun one vars eqs ->
+ let assig = eliminate vars undefined eqs in
+ let vs = foldl (fun a x f -> subtract (dom f) [one] @ a) [] assig in
+ setify vs,assig;;
+
+(* ------------------------------------------------------------------------- *)
+(* Eliminate all variables, in an essentially arbitrary order. *)
+(* ------------------------------------------------------------------------- *)
+
+let eliminate_all_equations one =
+ let choose_variable eq =
+ let (v,_) = choose eq in
+ if v = one then
+ let eq' = undefine v eq in
+ if is_undefined eq' then failwith "choose_variable" else
+ let (w,_) = choose eq' in w
+ else v in
+ let rec eliminate dun eqs =
+ match eqs with
+ [] -> dun
+ | eq::oeqs ->
+ if is_undefined eq then eliminate dun oeqs else
+ let v = choose_variable eq in
+ let a = apply eq v in
+ let eq' = equation_cmul (Int(-1) // a) (undefine v eq) in
+ let elim e =
+ let b = tryapplyd e v (Int 0) in
+ if b =/ Int 0 then e else
+ equation_add e (equation_cmul (minus_num b // a) eq) in
+ eliminate ((v |-> eq') (mapf elim dun)) (map elim oeqs) in
+ fun eqs ->
+ let assig = eliminate undefined eqs in
+ let vs = foldl (fun a x f -> subtract (dom f) [one] @ a) [] assig in
+ setify vs,assig;;
+
+(* ------------------------------------------------------------------------- *)
+(* Solve equations by assigning arbitrary numbers. *)
+(* ------------------------------------------------------------------------- *)
+
+let solve_equations one eqs =
+ let vars,assigs = eliminate_all_equations one eqs in
+ let vfn = itlist (fun v -> (v |-> Int 0)) vars (one |=> Int(-1)) in
+ let ass =
+ combine (+/) (fun c -> false) (mapf (equation_eval vfn) assigs) vfn in
+ if forall (fun e -> equation_eval ass e =/ Int 0) eqs
+ then undefine one ass else raise Sanity;;
+
+(* ------------------------------------------------------------------------- *)
+(* Hence produce the "relevant" monomials: those whose squares lie in the *)
+(* Newton polytope of the monomials in the input. (This is enough according *)
+(* to Reznik: "Extremal PSD forms with few terms", Duke Math. Journal, *)
+(* vol 45, pp. 363--374, 1978. *)
+(* *)
+(* These are ordered in sort of decreasing degree. In particular the *)
+(* constant monomial is last; this gives an order in diagonalization of the *)
+(* quadratic form that will tend to display constants. *)
+(* ------------------------------------------------------------------------- *)
+
+let newton_polytope pol =
+ let vars = poly_variables pol in
+ let mons = map (fun m -> map (fun x -> monomial_degree x m) vars) (dom pol)
+ and ds = map (fun x -> (degree x pol + 1) / 2) vars in
+ let all = itlist (fun n -> allpairs (fun h t -> h::t) (0--n)) ds [[]]
+ and mons' = minimal_convex_hull mons in
+ let all' =
+ filter (fun m -> in_convex_hull mons' (map (fun x -> 2 * x) m)) all in
+ map (fun m -> itlist2 (fun v i a -> if i = 0 then a else (v |-> i) a)
+ vars m monomial_1) (rev all');;
+
+(* ------------------------------------------------------------------------- *)
+(* Diagonalize (Cholesky/LDU) the matrix corresponding to a quadratic form. *)
+(* ------------------------------------------------------------------------- *)
+
+let diag m =
+ let nn = dimensions m in
+ let n = fst nn in
+ if snd nn <> n then failwith "diagonalize: non-square matrix" else
+ let rec diagonalize i m =
+ if is_zero m then [] else
+ let a11 = element m (i,i) in
+ if a11 </ Int 0 then failwith "diagonalize: not PSD"
+ else if a11 =/ Int 0 then
+ if is_zero(row i m) then diagonalize (i + 1) m
+ else failwith "diagonalize: not PSD"
+ else
+ let v = row i m in
+ let v' = mapa (fun a1k -> a1k // a11) v in
+ let m' =
+ (n,n),
+ iter (i+1,n) (fun j ->
+ iter (i+1,n) (fun k ->
+ ((j,k) |--> (element m (j,k) -/ element v j */ element v' k))))
+ undefined in
+ (a11,v')::diagonalize (i + 1) m' in
+ diagonalize 1 m;;
+
+(* ------------------------------------------------------------------------- *)
+(* Adjust a diagonalization to collect rationals at the start. *)
+(* ------------------------------------------------------------------------- *)
+
+let deration d =
+ if d = [] then Int 0,d else
+ let adj(c,l) =
+ let a = foldl (fun a i c -> lcm_num a (denominator c)) (Int 1) (snd l) //
+ foldl (fun a i c -> gcd_num a (numerator c)) (Int 0) (snd l) in
+ (c // (a */ a)),mapa (fun x -> a */ x) l in
+ let d' = map adj d in
+ let a = itlist ((o) lcm_num ((o) denominator fst)) d' (Int 1) //
+ itlist ((o) gcd_num ((o) numerator fst)) d' (Int 0) in
+ (Int 1 // a),map (fun (c,l) -> (a */ c,l)) d';;
+
+(* ------------------------------------------------------------------------- *)
+(* Enumeration of monomials with given multidegree bound. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec enumerate_monomials d vars =
+ if d < 0 then []
+ else if d = 0 then [undefined]
+ else if vars = [] then [monomial_1] else
+ let alts =
+ map (fun k -> let oths = enumerate_monomials (d - k) (tl vars) in
+ map (fun ks -> if k = 0 then ks else (hd vars |-> k) ks) oths)
+ (0--d) in
+ end_itlist (@) alts;;
+
+(* ------------------------------------------------------------------------- *)
+(* Enumerate products of distinct input polys with degree <= d. *)
+(* We ignore any constant input polynomials. *)
+(* Give the output polynomial and a record of how it was derived. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec enumerate_products d pols =
+ if d = 0 then [poly_const num_1,Rational_lt num_1] else if d < 0 then [] else
+ match pols with
+ [] -> [poly_const num_1,Rational_lt num_1]
+ | (p,b)::ps -> let e = multidegree p in
+ if e = 0 then enumerate_products d ps else
+ enumerate_products d ps @
+ map (fun (q,c) -> poly_mul p q,Product(b,c))
+ (enumerate_products (d - e) ps);;
+
+(* ------------------------------------------------------------------------- *)
+(* Multiply equation-parametrized poly by regular poly and add accumulator. *)
+(* ------------------------------------------------------------------------- *)
+
+let epoly_pmul p q acc =
+ foldl (fun a m1 c ->
+ foldl (fun b m2 e ->
+ let m = monomial_mul m1 m2 in
+ let es = tryapplyd b m undefined in
+ (m |-> equation_add (equation_cmul c e) es) b)
+ a q) acc p;;
+
+(* ------------------------------------------------------------------------- *)
+(* Usual operations on equation-parametrized poly. *)
+(* ------------------------------------------------------------------------- *)
+
+let epoly_cmul c l =
+ if c =/ Int 0 then undefined else mapf (equation_cmul c) l;;
+
+let epoly_neg x = epoly_cmul (Int(-1)) x;;
+
+let epoly_add x = combine equation_add is_undefined x;;
+
+let epoly_sub p q = epoly_add p (epoly_neg q);;
+
+(* ------------------------------------------------------------------------- *)
+(* Convert regular polynomial. Note that we treat (0,0,0) as -1. *)
+(* ------------------------------------------------------------------------- *)
+
+let epoly_of_poly p =
+ foldl (fun a m c -> (m |-> ((0,0,0) |=> minus_num c)) a) undefined p;;
+
+(* ------------------------------------------------------------------------- *)
+(* String for block diagonal matrix numbered k. *)
+(* ------------------------------------------------------------------------- *)
+
+let sdpa_of_blockdiagonal k m =
+ let pfx = string_of_int k ^" " in
+ let ents =
+ foldl (fun a (b,i,j) c -> if i > j then a else ((b,i,j),c)::a) [] m in
+ let entss = sort (increasing fst) ents in
+ itlist (fun ((b,i,j),c) a ->
+ pfx ^ string_of_int b ^ " " ^ string_of_int i ^ " " ^ string_of_int j ^
+ " " ^ decimalize 20 c ^ "\n" ^ a) entss "";;
+
+(* ------------------------------------------------------------------------- *)
+(* SDPA for problem using block diagonal (i.e. multiple SDPs) *)
+(* ------------------------------------------------------------------------- *)
+
+let sdpa_of_blockproblem comment nblocks blocksizes obj mats =
+ let m = length mats - 1 in
+ "\"" ^ comment ^ "\"\n" ^
+ string_of_int m ^ "\n" ^
+ string_of_int nblocks ^ "\n" ^
+ (end_itlist (fun s t -> s^" "^t) (map string_of_int blocksizes)) ^
+ "\n" ^
+ sdpa_of_vector obj ^
+ itlist2 (fun k m a -> sdpa_of_blockdiagonal (k - 1) m ^ a)
+ (1--length mats) mats "";;
+
+(* ------------------------------------------------------------------------- *)
+(* Hence run CSDP on a problem in block diagonal form. *)
+(* ------------------------------------------------------------------------- *)
+
+let csdp_blocks nblocks blocksizes obj mats =
+ let string_problem = sdpa_of_blockproblem "" nblocks blocksizes obj mats in
+ try parse_csdpoutput (run_csdp !debugging string_problem)
+ with CsdpInfeasible -> failwith "csdp: Problem is infeasible"
+
+(* ------------------------------------------------------------------------- *)
+(* 3D versions of matrix operations to consider blocks separately. *)
+(* ------------------------------------------------------------------------- *)
+
+let bmatrix_add = combine (+/) (fun x -> x =/ Int 0);;
+
+let bmatrix_cmul c bm =
+ if c =/ Int 0 then undefined
+ else mapf (fun x -> c */ x) bm;;
+
+let bmatrix_neg = bmatrix_cmul (Int(-1));;
+
+let bmatrix_sub m1 m2 = bmatrix_add m1 (bmatrix_neg m2);;
+
+(* ------------------------------------------------------------------------- *)
+(* Smash a block matrix into components. *)
+(* ------------------------------------------------------------------------- *)
+
+let blocks blocksizes bm =
+ map (fun (bs,b0) ->
+ let m = foldl
+ (fun a (b,i,j) c -> if b = b0 then ((i,j) |-> c) a else a)
+ undefined bm in
+ (*let d = foldl (fun a (i,j) c -> max a (max i j)) 0 m in*)
+ (((bs,bs),m):matrix))
+ (zip blocksizes (1--length blocksizes));;
+
+(* ------------------------------------------------------------------------- *)
+(* Positiv- and Nullstellensatz. Flag "linf" forces a linear representation. *)
+(* ------------------------------------------------------------------------- *)
+
+let real_positivnullstellensatz_general linf d eqs leqs pol
+ : poly list * (positivstellensatz * (num * poly) list) list =
+
+ let vars = itlist ((o) union poly_variables) (pol::eqs @ map fst leqs) [] in
+ let monoid =
+ if linf then
+ (poly_const num_1,Rational_lt num_1)::
+ (filter (fun (p,c) -> multidegree p <= d) leqs)
+ else enumerate_products d leqs in
+ let nblocks = length monoid in
+ let mk_idmultiplier k p =
+ let e = d - multidegree p in
+ let mons = enumerate_monomials e vars in
+ let nons = zip mons (1--length mons) in
+ mons,
+ itlist (fun (m,n) -> (m |-> ((-k,-n,n) |=> Int 1))) nons undefined in
+ let mk_sqmultiplier k (p,c) =
+ let e = (d - multidegree p) / 2 in
+ let mons = enumerate_monomials e vars in
+ let nons = zip mons (1--length mons) in
+ mons,
+ itlist (fun (m1,n1) ->
+ itlist (fun (m2,n2) a ->
+ let m = monomial_mul m1 m2 in
+ if n1 > n2 then a else
+ let c = if n1 = n2 then Int 1 else Int 2 in
+ let e = tryapplyd a m undefined in
+ (m |-> equation_add ((k,n1,n2) |=> c) e) a)
+ nons)
+ nons undefined in
+ let sqmonlist,sqs = unzip(map2 mk_sqmultiplier (1--length monoid) monoid)
+ and idmonlist,ids = unzip(map2 mk_idmultiplier (1--length eqs) eqs) in
+ let blocksizes = map length sqmonlist in
+ let bigsum =
+ itlist2 (fun p q a -> epoly_pmul p q a) eqs ids
+ (itlist2 (fun (p,c) s a -> epoly_pmul p s a) monoid sqs
+ (epoly_of_poly(poly_neg pol))) in
+ let eqns = foldl (fun a m e -> e::a) [] bigsum in
+ let pvs,assig = eliminate_all_equations (0,0,0) eqns in
+ let qvars = (0,0,0)::pvs in
+ let allassig = itlist (fun v -> (v |-> (v |=> Int 1))) pvs assig in
+ let mk_matrix v =
+ foldl (fun m (b,i,j) ass -> if b < 0 then m else
+ let c = tryapplyd ass v (Int 0) in
+ if c =/ Int 0 then m else
+ ((b,j,i) |-> c) (((b,i,j) |-> c) m))
+ undefined allassig in
+ let diagents = foldl
+ (fun a (b,i,j) e -> if b > 0 & i = j then equation_add e a else a)
+ undefined allassig in
+ let mats = map mk_matrix qvars
+ and obj = length pvs,
+ itern 1 pvs (fun v i -> (i |--> tryapplyd diagents v (Int 0)))
+ undefined in
+ let raw_vec = if pvs = [] then vector_0 0
+ else scale_then (csdp_blocks nblocks blocksizes) obj mats in
+ let find_rounding d =
+ (if !debugging then
+ (Format.print_string("Trying rounding with limit "^string_of_num d);
+ Format.print_newline())
+ else ());
+ let vec = nice_vector d raw_vec in
+ let blockmat = iter (1,dim vec)
+ (fun i a -> bmatrix_add (bmatrix_cmul (element vec i) (el i mats)) a)
+ (bmatrix_neg (el 0 mats)) in
+ let allmats = blocks blocksizes blockmat in
+ vec,map diag allmats in
+ let vec,ratdias =
+ if pvs = [] then find_rounding num_1
+ else tryfind find_rounding (map Num.num_of_int (1--31) @
+ map pow2 (5--66)) in
+ let newassigs =
+ itlist (fun k -> el (k - 1) pvs |-> element vec k)
+ (1--dim vec) ((0,0,0) |=> Int(-1)) in
+ let finalassigs =
+ foldl (fun a v e -> (v |-> equation_eval newassigs e) a) newassigs
+ allassig in
+ let poly_of_epoly p =
+ foldl (fun a v e -> (v |--> equation_eval finalassigs e) a)
+ undefined p in
+ let mk_sos mons =
+ let mk_sq (c,m) =
+ c,itlist (fun k a -> (el (k - 1) mons |--> element m k) a)
+ (1--length mons) undefined in
+ map mk_sq in
+ let sqs = map2 mk_sos sqmonlist ratdias
+ and cfs = map poly_of_epoly ids in
+ let msq = filter (fun (a,b) -> b <> []) (map2 (fun a b -> a,b) monoid sqs) in
+ let eval_sq sqs = itlist
+ (fun (c,q) -> poly_add (poly_cmul c (poly_mul q q))) sqs poly_0 in
+ let sanity =
+ itlist (fun ((p,c),s) -> poly_add (poly_mul p (eval_sq s))) msq
+ (itlist2 (fun p q -> poly_add (poly_mul p q)) cfs eqs
+ (poly_neg pol)) in
+ if not(is_undefined sanity) then raise Sanity else
+ cfs,map (fun (a,b) -> snd a,b) msq;;
+
+
+let term_of_monoid l1 m = itlist (fun i m -> Mul (nth l1 i,m)) m (Const num_1)
+
+let rec term_of_pos l1 x = match x with
+ Axiom_eq i -> failwith "term_of_pos"
+ | Axiom_le i -> nth l1 i
+ | Axiom_lt i -> nth l1 i
+ | Monoid m -> term_of_monoid l1 m
+ | Rational_eq n -> Const n
+ | Rational_le n -> Const n
+ | Rational_lt n -> Const n
+ | Square t -> Pow (t, 2)
+ | Eqmul (t, y) -> Mul (t, term_of_pos l1 y)
+ | Sum (y, z) -> Add (term_of_pos l1 y, term_of_pos l1 z)
+ | Product (y, z) -> Mul (term_of_pos l1 y, term_of_pos l1 z);;
+
+
+let dest_monomial mon = sort (increasing fst) (graph mon);;
+
+let monomial_order =
+ let rec lexorder l1 l2 =
+ match (l1,l2) with
+ [],[] -> true
+ | vps,[] -> false
+ | [],vps -> true
+ | ((x1,n1)::vs1),((x2,n2)::vs2) ->
+ if x1 < x2 then true
+ else if x2 < x1 then false
+ else if n1 < n2 then false
+ else if n2 < n1 then true
+ else lexorder vs1 vs2 in
+ fun m1 m2 ->
+ if m2 = monomial_1 then true else if m1 = monomial_1 then false else
+ let mon1 = dest_monomial m1 and mon2 = dest_monomial m2 in
+ let deg1 = itlist ((o) (+) snd) mon1 0
+ and deg2 = itlist ((o) (+) snd) mon2 0 in
+ if deg1 < deg2 then false else if deg1 > deg2 then true
+ else lexorder mon1 mon2;;
+
+let dest_poly p =
+ map (fun (m,c) -> c,dest_monomial m)
+ (sort (fun (m1,_) (m2,_) -> monomial_order m1 m2) (graph p));;
+
+(* ------------------------------------------------------------------------- *)
+(* Map back polynomials and their composites to term. *)
+(* ------------------------------------------------------------------------- *)
+
+let term_of_varpow =
+ fun x k ->
+ if k = 1 then Var x else Pow (Var x, k);;
+
+let term_of_monomial =
+ fun m -> if m = monomial_1 then Const num_1 else
+ let m' = dest_monomial m in
+ let vps = itlist (fun (x,k) a -> term_of_varpow x k :: a) m' [] in
+ end_itlist (fun s t -> Mul (s,t)) vps;;
+
+let term_of_cmonomial =
+ fun (m,c) ->
+ if m = monomial_1 then Const c
+ else if c =/ num_1 then term_of_monomial m
+ else Mul (Const c,term_of_monomial m);;
+
+let term_of_poly =
+ fun p ->
+ if p = poly_0 then Zero else
+ let cms = map term_of_cmonomial
+ (sort (fun (m1,_) (m2,_) -> monomial_order m1 m2) (graph p)) in
+ end_itlist (fun t1 t2 -> Add (t1,t2)) cms;;
+
+let term_of_sqterm (c,p) =
+ Product(Rational_lt c,Square(term_of_poly p));;
+
+let term_of_sos (pr,sqs) =
+ if sqs = [] then pr
+ else Product(pr,end_itlist (fun a b -> Sum(a,b)) (map term_of_sqterm sqs));;
+
+let rec deepen f n =
+ try (*print_string "Searching with depth limit ";
+ print_int n; print_newline();*) f n
+ with Failure _ -> deepen f (n + 1);;
+
+
+
+
+
+exception TooDeep
+
+let deepen_until limit f n =
+ match compare limit 0 with
+ | 0 -> raise TooDeep
+ | -1 -> deepen f n
+ | _ ->
+ let rec d_until f n =
+ try if !debugging
+ then (print_string "Searching with depth limit ";
+ print_int n; print_newline()) ; f n
+ with Failure x ->
+ if !debugging then (Printf.printf "solver error : %s\n" x) ;
+ if n = limit then raise TooDeep else d_until f (n + 1) in
+ d_until f n
+
+
+(* patch to remove zero polynomials from equalities.
+ In this case, hol light loops *)
+
+let real_nonlinear_prover depthmax eqs les lts =
+ let eq = map poly_of_term eqs
+ and le = map poly_of_term les
+ and lt = map poly_of_term lts in
+ let pol = itlist poly_mul lt (poly_const num_1)
+ and lep = map (fun (t,i) -> t,Axiom_le i) (zip le (0--(length le - 1)))
+ and ltp = map (fun (t,i) -> t,Axiom_lt i) (zip lt (0--(length lt - 1)))
+ and eqp = itlist2 (fun t i res ->
+ if t = undefined then res else (t,Axiom_eq i)::res) eq (0--(length eq - 1)) []
+ in
+
+ let proof =
+ let leq = lep @ ltp in
+ let eq = List.map fst eqp in
+ let tryall d =
+ let e = multidegree pol (*and pol' = poly_neg pol*) in
+ let k = if e = 0 then 1 else d / e in
+ tryfind (fun i -> d,i,
+ real_positivnullstellensatz_general false d eq leq
+ (poly_neg(poly_pow pol i)))
+ (0--k) in
+ let d,i,(cert_ideal,cert_cone) = deepen_until depthmax tryall 0 in
+ let proofs_ideal =
+ map2 (fun q i -> Eqmul(term_of_poly q,i))
+ cert_ideal (List.map snd eqp)
+ and proofs_cone = map term_of_sos cert_cone
+ and proof_ne =
+ if lt = [] then Rational_lt num_1 else
+ let p = end_itlist (fun s t -> Product(s,t)) (map snd ltp) in
+ funpow i (fun q -> Product(p,q)) (Rational_lt num_1) in
+ end_itlist (fun s t -> Sum(s,t)) (proof_ne :: proofs_ideal @ proofs_cone) in
+ if !debugging then (print_string("Translating proof certificate to Coq"); print_newline());
+ proof;;
+
+
+(* ------------------------------------------------------------------------- *)
+(* Now pure SOS stuff. *)
+(* ------------------------------------------------------------------------- *)
+
+(* ------------------------------------------------------------------------- *)
+(* Some combinatorial helper functions. *)
+(* ------------------------------------------------------------------------- *)
+
+let rec allpermutations l =
+ if l = [] then [[]] else
+ itlist (fun h acc -> map (fun t -> h::t)
+ (allpermutations (subtract l [h])) @ acc) l [];;
+
+let allvarorders l =
+ map (fun vlis x -> index x vlis) (allpermutations l);;
+
+let changevariables_monomial zoln (m:monomial) =
+ foldl (fun a x k -> (assoc x zoln |-> k) a) monomial_1 m;;
+
+let changevariables zoln pol =
+ foldl (fun a m c -> (changevariables_monomial zoln m |-> c) a)
+ poly_0 pol;;
+
+(* ------------------------------------------------------------------------- *)
+(* Sum-of-squares function with some lowbrow symmetry reductions. *)
+(* ------------------------------------------------------------------------- *)
+
+let sumofsquares_general_symmetry tool pol =
+ let vars = poly_variables pol
+ and lpps = newton_polytope pol in
+ let n = length lpps in
+ let sym_eqs =
+ let invariants = filter
+ (fun vars' ->
+ is_undefined(poly_sub pol (changevariables (zip vars vars') pol)))
+ (allpermutations vars) in
+(* let lpps2 = allpairs monomial_mul lpps lpps in*)
+(* let lpp2_classes =
+ setify(map (fun m ->
+ setify(map (fun vars' -> changevariables_monomial (zip vars vars') m)
+ invariants)) lpps2) in *)
+ let lpns = zip lpps (1--length lpps) in
+ let lppcs =
+ filter (fun (m,(n1,n2)) -> n1 <= n2)
+ (allpairs
+ (fun (m1,n1) (m2,n2) -> (m1,m2),(n1,n2)) lpns lpns) in
+ let clppcs = end_itlist (@)
+ (map (fun ((m1,m2),(n1,n2)) ->
+ map (fun vars' ->
+ (changevariables_monomial (zip vars vars') m1,
+ changevariables_monomial (zip vars vars') m2),(n1,n2))
+ invariants)
+ lppcs) in
+ let clppcs_dom = setify(map fst clppcs) in
+ let clppcs_cls = map (fun d -> filter (fun (e,_) -> e = d) clppcs)
+ clppcs_dom in
+ let eqvcls = map (o setify (map snd)) clppcs_cls in
+ let mk_eq cls acc =
+ match cls with
+ [] -> raise Sanity
+ | [h] -> acc
+ | h::t -> map (fun k -> (k |-> Int(-1)) (h |=> Int 1)) t @ acc in
+ itlist mk_eq eqvcls [] in
+ let eqs = foldl (fun a x y -> y::a) []
+ (itern 1 lpps (fun m1 n1 ->
+ itern 1 lpps (fun m2 n2 f ->
+ let m = monomial_mul m1 m2 in
+ if n1 > n2 then f else
+ let c = if n1 = n2 then Int 1 else Int 2 in
+ (m |-> ((n1,n2) |-> c) (tryapplyd f m undefined)) f))
+ (foldl (fun a m c -> (m |-> ((0,0)|=>c)) a)
+ undefined pol)) @
+ sym_eqs in
+ let pvs,assig = eliminate_all_equations (0,0) eqs in
+ let allassig = itlist (fun v -> (v |-> (v |=> Int 1))) pvs assig in
+ let qvars = (0,0)::pvs in
+ let diagents =
+ end_itlist equation_add (map (fun i -> apply allassig (i,i)) (1--n)) in
+ let mk_matrix v =
+ ((n,n),
+ foldl (fun m (i,j) ass -> let c = tryapplyd ass v (Int 0) in
+ if c =/ Int 0 then m else
+ ((j,i) |-> c) (((i,j) |-> c) m))
+ undefined allassig :matrix) in
+ let mats = map mk_matrix qvars
+ and obj = length pvs,
+ itern 1 pvs (fun v i -> (i |--> tryapplyd diagents v (Int 0)))
+ undefined in
+ let raw_vec = if pvs = [] then vector_0 0 else tool obj mats in
+ let find_rounding d =
+ (if !debugging then
+ (Format.print_string("Trying rounding with limit "^string_of_num d);
+ Format.print_newline())
+ else ());
+ let vec = nice_vector d raw_vec in
+ let mat = iter (1,dim vec)
+ (fun i a -> matrix_add (matrix_cmul (element vec i) (el i mats)) a)
+ (matrix_neg (el 0 mats)) in
+ deration(diag mat) in
+ let rat,dia =
+ if pvs = [] then
+ let mat = matrix_neg (el 0 mats) in
+ deration(diag mat)
+ else
+ tryfind find_rounding (map Num.num_of_int (1--31) @
+ map pow2 (5--66)) in
+ let poly_of_lin(d,v) =
+ d,foldl(fun a i c -> (el (i - 1) lpps |-> c) a) undefined (snd v) in
+ let lins = map poly_of_lin dia in
+ let sqs = map (fun (d,l) -> poly_mul (poly_const d) (poly_pow l 2)) lins in
+ let sos = poly_cmul rat (end_itlist poly_add sqs) in
+ if is_undefined(poly_sub sos pol) then rat,lins else raise Sanity;;
+
+let (sumofsquares: poly -> Num.num * (( Num.num * poly) list)) =
+sumofsquares_general_symmetry csdp;;
diff --git a/contrib/micromega/sos.mli b/contrib/micromega/sos.mli
new file mode 100644
index 000000000..31c9518c8
--- /dev/null
+++ b/contrib/micromega/sos.mli
@@ -0,0 +1,66 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+
+
+type vname = string;;
+
+type term =
+| Zero
+| Const of Num.num
+| Var of vname
+| Inv of term
+| Opp of term
+| Add of (term * term)
+| Sub of (term * term)
+| Mul of (term * term)
+| Div of (term * term)
+| Pow of (term * int)
+
+type positivstellensatz =
+ Axiom_eq of int
+ | Axiom_le of int
+ | Axiom_lt of int
+ | Rational_eq of Num.num
+ | Rational_le of Num.num
+ | Rational_lt of Num.num
+ | Square of term
+ | Monoid of int list
+ | Eqmul of term * positivstellensatz
+ | Sum of positivstellensatz * positivstellensatz
+ | Product of positivstellensatz * positivstellensatz
+
+type poly
+
+val poly_isconst : poly -> bool
+
+val poly_neg : poly -> poly
+
+val poly_mul : poly -> poly -> poly
+
+val poly_pow : poly -> int -> poly
+
+val poly_const : Num.num -> poly
+
+val poly_of_term : term -> poly
+
+val term_of_poly : poly -> term
+
+val term_of_sos : positivstellensatz * (Num.num * poly) list ->
+ positivstellensatz
+
+val string_of_poly : poly -> string
+
+exception TooDeep
+
+val deepen_until : int -> (int -> 'a) -> int -> 'a
+
+val real_positivnullstellensatz_general : bool -> int -> poly list ->
+ (poly * positivstellensatz) list ->
+ poly -> poly list * (positivstellensatz * (Num.num * poly) list) list
+
+val sumofsquares : poly -> Num.num * ( Num.num * poly) list
diff --git a/contrib/micromega/vector.ml b/contrib/micromega/vector.ml
new file mode 100644
index 000000000..fee4ebfc1
--- /dev/null
+++ b/contrib/micromega/vector.ml
@@ -0,0 +1,674 @@
+(************************************************************************)
+(* v * The Coq Proof Assistant / The Coq Development Team *)
+(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
+(* \VV/ **************************************************************)
+(* // * This file is distributed under the terms of the *)
+(* * GNU Lesser General Public License Version 2.1 *)
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+open Num
+
+module type S =
+sig
+ type t
+
+ val fresh : t -> int
+
+ val null : t
+
+ val is_null : t -> bool
+
+ val get : int -> t -> num
+
+ val update : int -> (num -> num) -> t -> t
+ (* behaviour is undef if index < 0 -- might loop*)
+
+ val set : int -> num -> t -> t
+
+ (*
+ For efficiency...
+
+ val get_update : int -> (num -> num) -> t -> num * t
+ *)
+
+ val mul : num -> t -> t
+
+ val uminus : t -> t
+
+ val add : t -> t -> t
+
+ val dotp : t -> t -> num
+
+ val lin_comb : num -> t -> num -> t -> t
+ (* lin_comb n1 t1 n2 t2 = (n1 * t1) + (n2 * t2) *)
+
+ val gcd : t -> Big_int.big_int
+
+ val normalise : t -> num * t
+
+ val hash : t -> int
+
+ val compare : t -> t -> int
+
+ type it
+
+ val iterator : t -> it
+ val element : it -> (num*it) option
+
+ val string : t -> string
+
+ type status = Pos | Neg
+
+ (* the result list is ordered by fst *)
+ val status : t -> (int * status) list
+
+ val from_list : num list -> t
+ val to_list : t -> num list
+
+end
+
+
+module type SystemS =
+sig
+
+ module Vect : S
+
+ module Cstr :
+ sig
+ type kind = Eq | Ge
+ val string_of_kind : kind -> string
+ type cstr = {coeffs : Vect.t ; op : kind ; cst : num}
+ val string_of_cstr : cstr -> string
+ val compare : cstr -> cstr -> int
+ end
+ open Cstr
+
+
+ module CstrBag :
+ sig
+ type t
+ exception Contradiction
+
+ val empty : t
+
+ val is_empty : t -> bool
+
+ val add : cstr -> t -> t
+ (* c can be deduced from add c t *)
+
+ val find : (cstr -> bool) -> t -> cstr option
+
+ val fold : (cstr -> 'a -> 'a) -> t -> 'a -> 'a
+
+ val status : t -> (int * (int list * int list)) list
+ (* aggregate of vector statuses *)
+
+ val remove : cstr -> t -> t
+
+ (* remove_list the ith element -- it is the ith element visited by 'fold' *)
+
+ val split : (cstr -> int) -> t -> (int -> t)
+
+ type it
+ val iterator : t -> it
+ val element : it -> (cstr*it) option
+
+ end
+
+end
+
+let zero_num = Int 0
+let unit_num = Int 1
+
+
+
+
+module Cstr(V:S) =
+struct
+ type kind = Eq | Ge
+ let string_of_kind = function Eq -> "Eq" | Ge -> "Ge"
+
+ type cstr = {coeffs : V.t ; op : kind ; cst : num}
+
+ let string_of_cstr {coeffs =a ; op = b ; cst =c} =
+ Printf.sprintf "{coeffs = %s;op=%s;cst=%s}" (V.string a) (string_of_kind b) (string_of_num c)
+
+ type t = cstr
+ let compare
+ {coeffs = v1 ; op = op1 ; cst = c1}
+ {coeffs = v2 ; op = op2 ; cst = c2} =
+ Mutils.Cmp.compare_lexical [
+ (fun () -> V.compare v1 v2);
+ (fun () -> Pervasives.compare op1 op2);
+ (fun () -> compare_num c1 c2)
+ ]
+
+
+end
+
+
+
+module VList : S with type t = num list =
+struct
+ type t = num list
+
+ let fresh l = failwith "not implemented"
+
+ let null = []
+
+ let is_null = List.for_all ((=/) zero_num)
+
+ let normalise l = failwith "Not implemented"
+ (*match l with (* Buggy : What if the first num is zero! *)
+ | [] -> (Int 0,[])
+ | [n] -> (n,[Int 1])
+ | n::l -> (n, (Int 1) :: List.map (fun x -> x // n) l)
+ *)
+
+
+ let get i l = try List.nth l i with _ -> zero_num
+
+ (* This is not tail-recursive *)
+ let rec update i f t =
+ match t with
+ | [] -> if i = 0 then [f zero_num] else (zero_num)::(update (i-1) f [])
+ | e::t -> if i = 0 then (f e)::t else e::(update (i-1) f t)
+
+ let rec set i n t =
+ match t with
+ | [] -> if i = 0 then [n] else (zero_num)::(set (i-1) n [])
+ | e::t -> if i = 0 then (n)::t else e::(set (i-1) n t)
+
+
+
+
+ let rec mul z t =
+ match z with
+ | Int 0 -> null
+ | Int 1 -> t
+ | _ -> List.map (mult_num z) t
+
+ let uminus t = mul (Int (-1)) t
+
+ let rec add t1 t2 =
+ match t1,t2 with
+ | [], _ -> t2
+ | _ , [] -> t1
+ | e1::t1,e2::t2 -> (e1 +/ e2 )::(add t1 t2)
+
+ let dotp t1 t2 =
+ let rec _dotp t1 t2 acc =
+ match t1, t2 with
+ | [] , _ -> acc
+ | _ , [] -> acc
+ | e1::t1,e2::t2 -> _dotp t1 t2 (acc +/ (e1 */ e2)) in
+ _dotp t1 t2 zero_num
+
+ let add_mul n t1 t2 =
+ match n with
+ | Int 0 -> t2
+ | Int 1 -> add t1 t2
+ | _ ->
+ let rec _add_mul t1 t2 =
+ match t1,t2 with
+ | [], _ -> t2
+ | _ , [] -> mul n t1
+ | e1::t1,e2::t2 -> ( (n */e1) +/ e2 )::(_add_mul t1 t2) in
+ _add_mul t1 t2
+
+ let lin_comb n1 t1 n2 t2 =
+ match n1,n2 with
+ | Int 0 , _ -> mul n2 t2
+ | Int 1 , _ -> add_mul n2 t2 t1
+ | _ , Int 0 -> mul n1 t1
+ | _ , Int 1 -> add_mul n1 t1 t2
+ | _ ->
+ let rec _lin_comb t1 t2 =
+ match t1,t2 with
+ | [], _ -> mul n2 t2
+ | _ , [] -> mul n1 t1
+ | e1::t1,e2::t2 -> ( (n1 */e1) +/ (n2 */ e2 ))::(_lin_comb t1 t2) in
+ _lin_comb t1 t2
+
+ (* could be computed on the fly *)
+ let gcd t =Mutils.gcd_list t
+
+
+
+
+ let hash = Mutils.Cmp.hash_list int_of_num
+
+ let compare = Mutils.Cmp.compare_list compare_num
+
+ type it = t
+ let iterator (x:t) : it = x
+ let element it =
+ match it with
+ | [] -> None
+ | e::l -> Some (e,l)
+
+ (* TODO: Buffer! *)
+ let string l = List.fold_right (fun n s -> (string_of_num n)^";"^s) l ""
+
+ type status = Pos | Neg
+
+ let status l =
+ let rec xstatus i l =
+ match l with
+ | [] -> []
+ | e::l ->
+ begin
+ match compare_num e (Int 0) with
+ | 1 -> (i,Pos):: (xstatus (i+1) l)
+ | 0 -> xstatus (i+1) l
+ | -1 -> (i,Neg) :: (xstatus (i+1) l)
+ | _ -> assert false
+ end in
+ xstatus 0 l
+
+ let from_list l = l
+ let to_list l = l
+
+end
+
+module VMap : S =
+struct
+ module Map = Map.Make(struct type t = int let compare (x:int) (y:int) = Pervasives.compare x y end)
+
+ type t = num Map.t
+
+ let null = Map.empty
+
+ let fresh m = failwith "not implemented"
+
+ let is_null = Map.is_empty
+
+ let normalise m = failwith "Not implemented"
+
+
+
+ let get i l = try Map.find i l with _ -> zero_num
+
+ let update i f t =
+ try
+ let res = f (Map.find i t) in
+ if res =/ zero_num
+ then Map.remove i t
+ else Map.add i res t
+ with
+ Not_found ->
+ let res = f zero_num in
+ if res =/ zero_num then t else Map.add i res t
+
+ let set i n t =
+ if n =/ zero_num then Map.remove i t
+ else Map.add i n t
+
+
+ let rec mul z t =
+ match z with
+ | Int 0 -> null
+ | Int 1 -> t
+ | _ -> Map.map (mult_num z) t
+
+ let uminus t = mul (Int (-1)) t
+
+
+ let map2 f m1 m2 =
+ let res,m2' =
+ Map.fold (fun k e (res,m2) ->
+ let v = f e (get k m2) in
+ if v =/ zero_num
+ then (res,Map.remove k m2)
+ else (Map.add k v res,Map.remove k m2)) m1 (Map.empty,m2) in
+ Map.fold (fun k e res ->
+ let v = f zero_num e in
+ if v =/ zero_num
+ then res else Map.add k v res) m2' res
+
+ let add t1 t2 = map2 (+/) t1 t2
+
+
+ let dotp t1 t2 =
+ Map.fold (fun k e res ->
+ res +/ (e */ get k t2)) t1 zero_num
+
+
+
+ let add_mul n t1 t2 =
+ match n with
+ | Int 0 -> t2
+ | Int 1 -> add t1 t2
+ | _ -> map2 (fun x y -> (n */ x) +/ y) t1 t2
+
+ let lin_comb n1 t1 n2 t2 =
+ match n1,n2 with
+ | Int 0 , _ -> mul n2 t2
+ | Int 1 , _ -> add_mul n2 t2 t1
+ | _ , Int 0 -> mul n1 t1
+ | _ , Int 1 -> add_mul n1 t1 t2
+ | _ -> map2 (fun x y -> (n1 */ x) +/ (n2 */ y)) t1 t2
+
+
+ let hash map = Map.fold (fun k e res -> k lxor (int_of_num e) lxor res) map 0
+
+ let compare = Map.compare compare_num
+
+ type it = t * int
+
+ let iterator (x:t) : it = (x,0)
+
+ let element (mp,id) =
+ try
+ Some (Map.find id mp, (mp, id+1))
+ with
+ Not_found -> None
+
+ (* TODO: Buffer! *)
+ type status = Pos | Neg
+
+ let status l = Map.fold (fun k e l ->
+ match compare_num e (Int 0) with
+ | 1 -> (k,Pos)::l
+ | 0 -> l
+ | -1 -> (k,Neg) :: l
+ | _ -> assert false) l []
+ let from_list l =
+ let rec from_list i l map =
+ match l with
+ | [] -> map
+ | e::l -> from_list (i+1) l (if e <>/ Int 0 then Map.add i e map else map) in
+ from_list 0 l Map.empty
+
+ let gcd m =
+ let res = Map.fold (fun _ e x -> Big_int.gcd_big_int x (Mutils.numerator e)) m Big_int.zero_big_int in
+ if Big_int.compare_big_int res Big_int.zero_big_int = 0
+ then Big_int.unit_big_int else res
+
+
+ let to_list m =
+ let l = List.rev (Map.fold (fun k e l -> (k,e)::l) m []) in
+ let rec xto_list i l =
+ match l with
+ | [] -> []
+ | (x,v)::l' -> if i = x then v::(xto_list (i+1) l') else zero_num ::(xto_list (i+1) l) in
+ xto_list 0 l
+
+ let string l = VList.string (to_list l)
+
+
+end
+
+
+module VSparse : S =
+struct
+
+ type t = (int*num) list
+
+ let null = []
+
+ let fresh l = List.fold_left (fun acc (i,_) -> max (i+1) acc) 0 l
+
+ let is_null l = l = []
+
+ let rec is_sorted l =
+ match l with
+ | [] -> true
+ | [e] -> true
+ | (i,_)::(j,x)::l -> i < j && is_sorted ((j,x)::l)
+
+
+ let check l = (List.for_all (fun (_,n) -> compare_num n (Int 0) <> 0) l) && (is_sorted l)
+
+ (* let get i t =
+ assert (check t);
+ try List.assoc i t with Not_found -> zero_num *)
+
+ let rec get (i:int) t =
+ match t with
+ | [] -> zero_num
+ | (j,n)::t ->
+ match compare i j with
+ | 0 -> n
+ | 1 -> get i t
+ | _ -> zero_num
+
+ let cons i v rst = if v =/ Int 0 then rst else (i,v)::rst
+
+ let rec update i f t =
+ match t with
+ | [] -> cons i (f zero_num) []
+ | (k,v)::l ->
+ match Pervasives.compare i k with
+ | 0 -> cons k (f v) l
+ | -1 -> cons i (f zero_num) t
+ | 1 -> (k,v) ::(update i f l)
+ | _ -> failwith "compare_num"
+
+ let update i f t =
+ assert (check t);
+ let res = update i f t in
+ assert (check t) ; res
+
+
+ let rec set i n t =
+ match t with
+ | [] -> cons i n []
+ | (k,v)::l ->
+ match Pervasives.compare i k with
+ | 0 -> cons k n l
+ | -1 -> cons i n t
+ | 1 -> (k,v) :: (set i n l)
+ | _ -> failwith "compare_num"
+
+
+ let rec map f l =
+ match l with
+ | [] -> []
+ | (i,e)::l -> cons i (f e) (map f l)
+
+ let rec mul z t =
+ match z with
+ | Int 0 -> null
+ | Int 1 -> t
+ | _ -> List.map (fun (i,n) -> (i, mult_num z n)) t
+
+ let mul z t =
+ assert (check t) ;
+ let res = mul z t in
+ assert (check res) ;
+ res
+
+ let uminus t = mul (Int (-1)) t
+
+
+ let normalise l =
+ match l with
+ | [] -> (Int 0,[])
+ | (i,n)::_ -> (n, mul ((Int 1) // n) l)
+
+
+ let rec map2 f m1 m2 =
+ match m1, m2 with
+ | [] , [] -> []
+ | l , [] -> map (fun x -> f x zero_num) l
+ | [] ,l -> map (f zero_num) l
+ | (i,e)::l1,(i',e')::l2 ->
+ match Pervasives.compare i i' with
+ | 0 -> cons i (f e e') (map2 f l1 l2)
+ | -1 -> cons i (f e zero_num) (map2 f l1 m2)
+ | 1 -> cons i' (f zero_num e') (map2 f m1 l2)
+ | _ -> assert false
+
+ (* let add t1 t2 = map2 (+/) t1 t2*)
+
+ let rec add (m1:t) (m2:t) =
+ match m1, m2 with
+ | [] , [] -> []
+ | l , [] -> l
+ | [] ,l -> l
+ | (i,e)::l1,(i',e')::l2 ->
+ match Pervasives.compare i i' with
+ | 0 -> cons i ( e +/ e') (add l1 l2)
+ | -1 -> (i,e) :: (add l1 m2)
+ | 1 -> (i', e') :: (add m1 l2)
+ | _ -> assert false
+
+
+
+
+ let add t1 t2 =
+ assert (check t1 && check t2);
+ let res = add t1 t2 in
+ assert (check res);
+ res
+
+
+ let rec dotp (t1:t) (t2:t) =
+ match t1, t2 with
+ | [] , _ -> zero_num
+ | _ , [] -> zero_num
+ | (i,e)::l1 , (i',e')::l2 ->
+ match Pervasives.compare i i' with
+ | 0 -> (e */ e') +/ (dotp l1 l2)
+ | -1 -> dotp l1 t2
+ | 1 -> dotp t1 l2
+ | _ -> assert false
+
+ let dotp t1 t2 =
+ assert (check t1 && check t2) ; dotp t1 t2
+
+ let add_mul n t1 t2 =
+ match n with
+ | Int 0 -> t2
+ | Int 1 -> add t1 t2
+ | _ -> map2 (fun x y -> (n */ x) +/ y) t1 t2
+
+ let add_mul n (t1:t) (t2:t) =
+ match n with
+ | Int 0 -> t2
+ | Int 1 -> add t1 t2
+ | _ ->
+ let rec xadd_mul m1 m2 =
+ match m1, m2 with
+ | [] , [] -> []
+ | _ , [] -> mul n m1
+ | [] , _ -> m2
+ | (i,e)::l1,(i',e')::l2 ->
+ match Pervasives.compare i i' with
+ | 0 -> cons i ( n */ e +/ e') (xadd_mul l1 l2)
+ | -1 -> (i,n */ e) :: (xadd_mul l1 m2)
+ | 1 -> (i', e') :: (xadd_mul m1 l2)
+ | _ -> assert false in
+ xadd_mul t1 t2
+
+
+
+
+ let lin_comb n1 t1 n2 t2 =
+ match n1,n2 with
+ | Int 0 , _ -> mul n2 t2
+ | Int 1 , _ -> add_mul n2 t2 t1
+ | _ , Int 0 -> mul n1 t1
+ | _ , Int 1 -> add_mul n1 t1 t2
+ | _ -> (*map2 (fun x y -> (n1 */ x) +/ (n2 */ y)) t1 t2*)
+ let rec xlin_comb m1 m2 =
+ match m1, m2 with
+ | [] , [] -> []
+ | _ , [] -> mul n1 m1
+ | [] , _ -> mul n2 m2
+ | (i,e)::l1,(i',e')::l2 ->
+ match Pervasives.compare i i' with
+ | 0 -> cons i ( n1 */ e +/ n2 */ e') (xlin_comb l1 l2)
+ | -1 -> (i,n1 */ e) :: (xlin_comb l1 m2)
+ | 1 -> (i', n2 */ e') :: (xlin_comb m1 l2)
+ | _ -> assert false in
+ xlin_comb t1 t2
+
+
+
+
+
+ let lin_comb n1 t1 n2 t2 =
+ assert (check t1 && check t2);
+ let res = lin_comb n1 t1 n2 t2 in
+ assert (check res); res
+
+ let hash = Mutils.Cmp.hash_list (fun (x,y) -> (Hashtbl.hash x) lxor (int_of_num y))
+
+
+ let compare = Mutils.Cmp.compare_list (fun x y -> Mutils.Cmp.compare_lexical
+ [
+ (fun () -> Pervasives.compare (fst x) (fst y));
+ (fun () -> compare_num (snd x) (snd y))])
+
+ (*
+ let compare (x:t) (y:t) =
+ let rec xcompare acc1 acc2 x y =
+ match x , y with
+ | [] , [] -> xcomp acc1 acc2
+ | [] , _ -> -1
+ | _ , [] -> 1
+ | (i,n1)::l1 , (j,n2)::l2 ->
+ match Pervasives.compare i j with
+ | 0 -> xcompare (n1::acc1) (n2::acc2) l1 l2
+ | c -> c
+ and xcomp acc1 acc2 = Mutils.Cmp.compare_list compare_num acc1 acc2 in
+ xcompare [] [] x y
+ *)
+
+ type it = t
+
+ let iterator (x:t) : it = x
+
+ let element l = failwith "Not_implemented"
+
+ (* TODO: Buffer! *)
+ type status = Pos | Neg
+
+ let status l = List.map (fun (i,e) ->
+ match compare_num e (Int 0) with
+ | 1 -> i,Pos
+ | -1 -> i,Neg
+ | _ -> assert false) l
+
+ let from_list (l: num list) =
+ let rec xfrom_list i l =
+ match l with
+ | [] -> []
+ | e::l ->
+ if e <>/ Int 0
+ then (i,e)::(xfrom_list (i+1) l)
+ else xfrom_list (i+1) l in
+
+ let res = xfrom_list 0 l in
+ assert (check res) ; res
+
+
+ let gcd m =
+ let res = List.fold_left (fun x (i,e) -> Big_int.gcd_big_int x (Mutils.numerator e)) Big_int.zero_big_int m in
+ if Big_int.compare_big_int res Big_int.zero_big_int = 0
+ then Big_int.unit_big_int else res
+
+ let to_list m =
+ let rec xto_list i l =
+ match l with
+ | [] -> []
+ | (x,v)::l' ->
+ if i = x then v::(xto_list (i+1) l') else zero_num ::(xto_list (i+1) l) in
+ xto_list 0 m
+
+ let to_list l =
+ assert (check l);
+ to_list l
+
+
+ let string l = VList.string (to_list l)
+
+end
diff --git a/scripts/coqmktop.ml b/scripts/coqmktop.ml
index bd155abfe..f6d4709fe 100644
--- a/scripts/coqmktop.ml
+++ b/scripts/coqmktop.ml
@@ -17,7 +17,7 @@ open Unix
(* Objects to link *)
(* 1. Core objects *)
-let ocamlobjs = ["unix.cma"]
+let ocamlobjs = ["unix.cma";"nums.cma"]
let dynobjs = ["dynlink.cma"]
let camlp4objs = ["gramlib.cma"]
let libobjs = ocamlobjs @ camlp4objs
diff --git a/test-suite/check b/test-suite/check
index 4c98f8ac2..f2307d405 100755
--- a/test-suite/check
+++ b/test-suite/check
@@ -248,6 +248,8 @@ echo "Parser tests"
test_parser parser
echo "Interactive tests"
test_interactive interactive
+echo "Micromega tests"
+test_success micromega
echo "Complexity tests"
test_complexity complexity
echo "Module tests"
diff --git a/test-suite/csdp.cache b/test-suite/csdp.cache
new file mode 100644
index 000000000..10196f5c4
--- /dev/null
+++ b/test-suite/csdp.cache
@@ -0,0 +1,13100 @@
+*** REQUEST ***
+""
+1
+3
+1 1 1
+0.10485760000000000000e7
+0 1 1 1 0.10485760000000000000e7
+1 2 1 1 0.10485760000000000000e7
+1 3 1 1 0.10485760000000000000e7
+*** ANSWER ***
+Infeasible
+*** END ***
+*** REQUEST ***
+""
+5
+5
+4 1 1 1 1
+0.52428800000000000000e6 0.10485760000000000000e7 -0.52428800000000000000e6 -0.15728640000000000000e7 0.10485760000000000000e7
+0 1 2 2 -0.52428800000000000000e6
+0 1 4 4 0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+0 4 1 1 0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 1 2 2 0.52428800000000000000e6
+1 1 4 4 -0.52428800000000000000e6
+1 2 1 1 0.52428800000000000000e6
+1 4 1 1 -0.52428800000000000000e6
+2 1 1 2 0.52428800000000000000e6
+2 1 1 4 -0.52428800000000000000e6
+2 4 1 1 0.10485760000000000000e7
+3 1 1 3 0.52428800000000000000e6
+3 1 1 4 -0.26214400000000000000e6
+3 1 4 4 -0.52428800000000000000e6
+4 1 2 2 -0.52428800000000000000e6
+4 1 2 4 0.52428800000000000000e6
+4 1 4 4 -0.52428800000000000000e6
+4 5 1 1 -0.52428800000000000000e6
+5 3 1 1 0.52428800000000000000e6
+5 4 1 1 0.52428800000000000000e6
+*** ANSWER ***
+Failure
+*** END ***
+*** REQUEST ***
+""
+20
+7
+4 1 4 1 4 1 1
+0.52428800000000000000e6 0.10485760000000000000e7 -0.52428800000000000000e6 0.0 -0.10485760000000000000e7 0.52428800000000000000e6 0.0 0.0 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.10485760000000000000e7 0.52428800000000000000e6
+0 1 1 2 -0.26214400000000000000e6
+0 1 1 4 0.26214400000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+0 3 1 2 -0.26214400000000000000e6
+0 5 1 4 0.26214400000000000000e6
+1 1 2 3 0.52428800000000000000e6
+1 1 3 4 -0.52428800000000000000e6
+1 5 1 4 0.26214400000000000000e6
+1 5 4 4 0.52428800000000000000e6
+2 1 1 1 0.52428800000000000000e6
+2 1 1 2 0.26214400000000000000e6
+2 1 1 4 -0.26214400000000000000e6
+2 2 1 1 0.52428800000000000000e6
+2 3 1 2 0.26214400000000000000e6
+2 5 1 4 -0.26214400000000000000e6
+3 1 1 3 0.52428800000000000000e6
+3 1 1 4 -0.26214400000000000000e6
+3 1 4 4 -0.52428800000000000000e6
+4 1 2 2 0.52428800000000000000e6
+4 1 4 4 -0.52428800000000000000e6
+4 3 1 2 -0.26214400000000000000e6
+4 5 1 4 0.26214400000000000000e6
+5 1 2 4 0.52428800000000000000e6
+5 1 4 4 -0.10485760000000000000e7
+5 5 1 4 0.52428800000000000000e6
+6 1 1 2 -0.26214400000000000000e6
+6 1 1 4 0.26214400000000000000e6
+6 3 1 1 0.52428800000000000000e6
+7 1 2 3 -0.52428800000000000000e6
+7 1 3 4 0.52428800000000000000e6
+7 3 1 3 0.52428800000000000000e6
+8 3 1 4 0.52428800000000000000e6
+8 5 1 4 0.52428800000000000000e6
+9 1 1 2 0.26214400000000000000e6
+9 1 1 4 -0.26214400000000000000e6
+9 1 2 3 -0.52428800000000000000e6
+9 1 3 4 0.52428800000000000000e6
+9 3 1 2 0.26214400000000000000e6
+9 3 2 2 0.52428800000000000000e6
+9 4 1 1 0.52428800000000000000e6
+10 3 3 3 0.52428800000000000000e6
+10 5 3 3 0.52428800000000000000e6
+11 3 4 4 0.52428800000000000000e6
+11 5 4 4 0.52428800000000000000e6
+12 1 1 2 0.26214400000000000000e6
+12 1 1 4 -0.26214400000000000000e6
+12 5 1 1 0.52428800000000000000e6
+13 3 1 2 0.52428800000000000000e6
+13 5 1 2 0.52428800000000000000e6
+14 1 2 3 0.52428800000000000000e6
+14 1 3 4 -0.52428800000000000000e6
+14 5 1 3 0.52428800000000000000e6
+15 1 1 2 -0.26214400000000000000e6
+15 1 1 4 0.26214400000000000000e6
+15 1 2 3 0.52428800000000000000e6
+15 1 3 4 -0.52428800000000000000e6
+15 3 1 2 -0.26214400000000000000e6
+15 4 1 1 -0.52428800000000000000e6
+15 5 2 2 0.52428800000000000000e6
+16 3 2 3 0.52428800000000000000e6
+16 5 2 3 0.52428800000000000000e6
+17 3 2 4 0.52428800000000000000e6
+17 5 2 4 0.52428800000000000000e6
+18 3 3 4 0.52428800000000000000e6
+18 5 3 4 0.52428800000000000000e6
+19 4 1 1 0.52428800000000000000e6
+19 6 1 1 0.52428800000000000000e6
+20 3 1 2 0.26214400000000000000e6
+20 5 1 4 0.26214400000000000000e6
+20 7 1 1 0.52428800000000000000e6
+*** ANSWER ***
+3.216324555313973399e-09 3.115755179085740881e-10 -3.324145964397584252e-13 5.224535444587893355e-10 -5.221424158161548355e-10 1.077350271294886586e+00 3.852719564190705860e-09 3.943375637517087529e-01 1.443375660692466089e-01 8.791397631563578409e-10 1.443375650484708950e-01 7.735027285744282277e-02 -1.056624343830985385e-01 -1.053741115158292411e-09 1.443375677592817763e-01 1.439267380244287369e-09 1.443375649633401314e-01 1.426488358509380043e-09 2.331632031590821230e-09 9.881736230754907151e-10
+1 1 1 1 1.633559363251345159e-04
+1 1 1 2 4.825975870957104676e-05
+1 1 1 3 -1.742809839382080653e-07
+1 1 1 4 -4.817262673172542853e-05
+1 1 2 2 2.739167551090937675e-04
+1 1 2 3 -5.294314360449444859e-08
+1 1 2 4 -2.737530029034201864e-04
+1 1 3 3 6.311918840049835004e-10
+1 1 3 4 5.294314360449444859e-08
+1 1 4 4 2.737647940654544120e-04
+1 2 1 1 5.242880001633558422e+05
+1 3 1 1 5.648418190366540803e+05
+1 3 1 2 2.067464533628847857e+05
+1 3 1 3 2.019934634870416794e-03
+1 3 1 4 2.067464526242558786e+05
+1 3 2 2 7.567445383931380638e+04
+1 3 2 3 7.545906162535169362e-04
+1 3 2 4 7.567445325949967082e+04
+1 3 3 3 4.609230593376041846e-04
+1 3 3 4 7.478907285061658439e-04
+1 3 4 4 7.567445330413333431e+04
+1 4 1 1 3.363821766207514231e-04
+1 5 1 1 4.055381985588361567e+04
+1 5 1 2 -5.539754639784596657e+04
+1 5 1 3 -5.524638217841108118e-04
+1 5 1 4 -5.539754649203269946e+04
+1 5 2 2 7.567445472537894966e+04
+1 5 2 3 7.545906162535169362e-04
+1 5 2 4 7.567445325949967082e+04
+1 5 3 3 4.609230593376041846e-04
+1 5 3 4 7.478907285061658439e-04
+1 5 4 4 7.567445499041370931e+04
+1 6 1 1 1.222447325770572614e-03
+1 7 1 1 5.180882036868869004e-04
+2 1 1 1 3.732050806382595010e+00
+2 1 1 2 -6.179638758954429933e-01
+2 1 1 3 2.173502292939227232e+02
+2 1 1 4 -4.061027961832257976e-02
+2 1 2 2 4.345863716571566329e+02
+2 1 2 3 -1.340893704428466435e+02
+2 1 2 4 4.341637204982362732e+02
+2 1 3 3 1.120378914265908825e+05
+2 1 3 4 -1.340893574103265280e+02
+2 1 4 4 4.357410688677019266e+02
+2 2 1 1 4.791248020457682800e-10
+2 3 1 1 4.226464037222666947e-01
+2 3 1 2 -5.773488410986552521e-01
+2 3 1 3 -1.303258997965981042e-05
+2 3 1 4 -5.773483694853425163e-01
+2 3 2 2 1.577313165222117730e+00
+2 3 2 3 3.625288361974805546e-03
+2 3 2 4 3.586260272353634649e-05
+2 3 3 3 9.862957222628374598e-01
+2 3 3 4 -3.610553616170663390e-03
+2 3 4 4 1.577322301575505570e+00
+2 4 1 1 1.577363207137071788e+00
+2 5 1 1 1.577353596277760506e+00
+2 5 1 2 5.773488410986552521e-01
+2 5 1 3 1.303264611002640555e-05
+2 5 1 4 5.773483694853421833e-01
+2 5 2 2 4.226868364632567210e-01
+2 5 2 3 -3.625288361974509776e-03
+2 5 2 4 -3.586260272318383849e-05
+2 5 3 3 1.013704277737162540e+00
+2 5 3 4 3.610553616170425733e-03
+2 5 4 4 4.226776984244937641e-01
+2 6 1 1 4.226367928629287118e-01
+2 7 1 1 1.000000471613313069e+00
+*** END ***
+*** REQUEST ***
+""
+5
+5
+4 1 1 1 1
+0.15728640000000000000e7 0.10485760000000000000e7 -0.52428800000000000000e6 -0.15728640000000000000e7 0.10485760000000000000e7
+0 1 2 2 0.52428800000000000000e6
+0 1 4 4 -0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+0 4 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 1 2 2 -0.52428800000000000000e6
+1 1 4 4 0.52428800000000000000e6
+1 2 1 1 0.52428800000000000000e6
+1 4 1 1 0.52428800000000000000e6
+2 1 1 2 0.52428800000000000000e6
+2 1 1 4 -0.52428800000000000000e6
+2 4 1 1 0.10485760000000000000e7
+3 1 1 3 0.52428800000000000000e6
+3 1 1 4 -0.26214400000000000000e6
+3 1 4 4 -0.52428800000000000000e6
+4 1 2 2 -0.52428800000000000000e6
+4 1 2 4 0.52428800000000000000e6
+4 1 4 4 -0.52428800000000000000e6
+4 5 1 1 -0.52428800000000000000e6
+5 3 1 1 0.52428800000000000000e6
+5 4 1 1 0.52428800000000000000e6
+*** ANSWER ***
+Failure
+*** END ***
+*** REQUEST ***
+""
+20
+7
+4 1 4 1 4 1 1
+0.52428800000000000000e6 0.10485760000000000000e7 -0.52428800000000000000e6 0.0 -0.10485760000000000000e7 0.52428800000000000000e6 0.0 0.0 0.0 0.10485760000000000000e7 0.10485760000000000000e7 0.52428800000000000000e6 0.0 0.0 0.10485760000000000000e7 0.0 0.0 0.0 0.10485760000000000000e7 0.52428800000000000000e6
+0 1 1 2 0.26214400000000000000e6
+0 1 1 4 -0.26214400000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+0 3 1 2 0.26214400000000000000e6
+0 5 1 4 -0.26214400000000000000e6
+1 1 2 3 0.52428800000000000000e6
+1 1 3 4 -0.52428800000000000000e6
+1 5 1 4 0.26214400000000000000e6
+1 5 4 4 0.52428800000000000000e6
+2 1 1 1 0.52428800000000000000e6
+2 1 1 2 -0.26214400000000000000e6
+2 1 1 4 0.26214400000000000000e6
+2 2 1 1 0.52428800000000000000e6
+2 3 1 2 -0.26214400000000000000e6
+2 5 1 4 0.26214400000000000000e6
+3 1 1 3 0.52428800000000000000e6
+3 1 1 4 -0.26214400000000000000e6
+3 1 4 4 -0.52428800000000000000e6
+4 1 2 2 0.52428800000000000000e6
+4 1 4 4 -0.52428800000000000000e6
+4 3 1 2 -0.26214400000000000000e6
+4 5 1 4 0.26214400000000000000e6
+5 1 2 4 0.52428800000000000000e6
+5 1 4 4 -0.10485760000000000000e7
+5 5 1 4 0.52428800000000000000e6
+6 1 1 2 -0.26214400000000000000e6
+6 1 1 4 0.26214400000000000000e6
+6 3 1 1 0.52428800000000000000e6
+7 1 2 3 -0.52428800000000000000e6
+7 1 3 4 0.52428800000000000000e6
+7 3 1 3 0.52428800000000000000e6
+8 3 1 4 0.52428800000000000000e6
+8 5 1 4 0.52428800000000000000e6
+9 1 1 2 -0.26214400000000000000e6
+9 1 1 4 0.26214400000000000000e6
+9 1 2 3 -0.52428800000000000000e6
+9 1 3 4 0.52428800000000000000e6
+9 3 1 2 0.26214400000000000000e6
+9 3 2 2 0.52428800000000000000e6
+9 4 1 1 -0.52428800000000000000e6
+10 3 3 3 0.52428800000000000000e6
+10 5 3 3 0.52428800000000000000e6
+11 3 4 4 0.52428800000000000000e6
+11 5 4 4 0.52428800000000000000e6
+12 1 1 2 0.26214400000000000000e6
+12 1 1 4 -0.26214400000000000000e6
+12 5 1 1 0.52428800000000000000e6
+13 3 1 2 0.52428800000000000000e6
+13 5 1 2 0.52428800000000000000e6
+14 1 2 3 0.52428800000000000000e6
+14 1 3 4 -0.52428800000000000000e6
+14 5 1 3 0.52428800000000000000e6
+15 1 1 2 0.26214400000000000000e6
+15 1 1 4 -0.26214400000000000000e6
+15 1 2 3 0.52428800000000000000e6
+15 1 3 4 -0.52428800000000000000e6
+15 3 1 2 -0.26214400000000000000e6
+15 4 1 1 0.52428800000000000000e6
+15 5 2 2 0.52428800000000000000e6
+16 3 2 3 0.52428800000000000000e6
+16 5 2 3 0.52428800000000000000e6
+17 3 2 4 0.52428800000000000000e6
+17 5 2 4 0.52428800000000000000e6
+18 3 3 4 0.52428800000000000000e6
+18 5 3 4 0.52428800000000000000e6
+19 4 1 1 0.52428800000000000000e6
+19 6 1 1 0.52428800000000000000e6
+20 3 1 2 0.26214400000000000000e6
+20 5 1 4 0.26214400000000000000e6
+20 7 1 1 0.52428800000000000000e6
+*** ANSWER ***
+-2.383868949298717141e-09 1.339230337975028206e-10 -1.554096679939493489e-13 2.248394946691001431e-10 -2.248297835432341409e-10 7.735027041131968539e-02 -3.465380614782425474e-10 -1.056624335885569255e-01 1.443375668010194179e-01 4.146098741655366720e-10 1.443375684724064745e-01 1.077350269708958752e+00 3.943375673759518252e-01 1.282342148333882059e-09 1.443375675560557292e-01 4.652808533053771065e-10 1.443375665686819631e-01 4.783976336776815147e-10 2.716615800832226185e-10 4.224315968550843865e-10
+1 1 1 1 7.021443402755951407e-05
+1 1 1 2 -2.129856342302162864e-05
+1 1 1 3 -8.147942401321171623e-08
+1 1 1 4 2.133929069373862881e-05
+1 1 2 2 1.178808434650075446e-04
+1 1 2 3 2.495390696842857382e-08
+1 1 2 4 -1.178755575543151413e-04
+1 1 3 3 1.944839343562424362e-10
+1 1 3 4 -2.495390696842857382e-08
+1 1 4 4 1.179521400355049458e-04
+1 2 1 1 5.242880000702143880e+05
+1 3 1 1 4.055381857341016439e+04
+1 3 1 2 -5.539754565683471446e+04
+1 3 1 3 -1.816857471763048287e-04
+1 3 1 4 -5.539754598127733334e+04
+1 3 2 2 7.567445422297307232e+04
+1 3 2 3 2.439411680177695524e-04
+1 3 2 4 7.567445410116112907e+04
+1 3 3 3 2.173751761904352459e-04
+1 3 3 4 2.508181385656042860e-04
+1 3 4 4 7.567445509926123486e+04
+1 4 1 1 5.382855815572736924e-04
+1 5 1 1 5.648418182051707990e+05
+1 5 1 2 2.067464545244030305e+05
+1 5 1 3 6.723166002656743570e-04
+1 5 1 4 2.067464534807155142e+05
+1 5 2 2 7.567445461882954987e+04
+1 5 2 3 2.439411680177695524e-04
+1 5 2 4 7.567445410116112907e+04
+1 5 3 3 2.173751761904352459e-04
+1 5 3 4 2.508181385656042860e-04
+1 5 4 4 7.567445384942734381e+04
+1 6 1 1 1.424291009826070026e-04
+1 7 1 1 2.214760115358928652e-04
+2 1 1 1 3.732050808051013746e+00
+2 1 1 2 -7.790750041344002286e-01
+2 1 1 3 3.555764798277332375e+02
+2 1 1 4 -1.356426125551885686e+00
+2 1 2 2 7.146640854680334769e+02
+2 1 2 3 -2.003686030421885675e+02
+2 1 2 4 7.130867332558476619e+02
+2 1 3 3 2.238259788805679127e+05
+2 1 3 4 -2.003686071014034269e+02
+2 1 4 4 7.135093857811625639e+02
+2 2 1 1 1.679813029941925011e-10
+2 3 1 1 1.577351121417085000e+00
+2 3 1 2 5.773522121529768292e-01
+2 3 1 3 4.059108102667487988e-06
+2 3 1 4 5.773474746499893673e-01
+2 3 2 2 4.226648699847483370e-01
+2 3 2 3 1.060364412893890183e-02
+2 3 2 4 -1.387677777909665390e-05
+2 3 3 3 9.991487651788666380e-01
+2 3 3 4 -1.060833220454195092e-02
+2 3 4 4 4.226606428567193929e-01
+2 4 1 1 4.226578412831504261e-01
+2 5 1 1 4.226488785856620245e-01
+2 5 1 2 -5.773522121529769402e-01
+2 5 1 3 -4.057157829829342777e-06
+2 5 1 4 -5.773474746499902555e-01
+2 5 2 2 1.577335136844963737e+00
+2 5 2 3 -1.060364412893840744e-02
+2 5 2 4 1.387677777914755719e-05
+2 5 3 3 1.000851234821132918e+00
+2 5 3 4 1.060833220454180346e-02
+2 5 4 4 1.577339357143281884e+00
+2 6 1 1 1.577342158716849241e+00
+2 7 1 1 9.999952624970135373e-01
+*** END ***
+*** REQUEST ***
+""
+2
+4
+1 1 1 1
+0.15728640000000000000e7 0.10485760000000000000e7
+0 2 1 1 -0.10485760000000000000e7
+0 4 1 1 -0.10485760000000000000e7
+1 1 1 1 0.10485760000000000000e7
+1 2 1 1 0.10485760000000000000e7
+1 4 1 1 0.10485760000000000000e7
+2 2 1 1 0.10485760000000000000e7
+2 3 1 1 0.10485760000000000000e7
+*** ANSWER ***
+1.481747076424031107e-35 9.158740256512039830e-35
+1 1 1 1 1.553724422408404842e-29
+1 2 1 1 1.048576000000000000e+06
+1 3 1 1 9.603635223212368677e-29
+1 4 1 1 1.048576000000000000e+06
+2 1 1 1 1.499999998989445027e+00
+2 2 1 1 2.162052517325988483e-12
+2 3 1 1 9.999999979853768650e-01
+2 4 1 1 2.162052536023870663e-12
+*** END ***
+*** REQUEST ***
+""
+1
+3
+1 1 1
+0.10485760000000000000e7
+0 1 1 1 0.10485760000000000000e7
+1 1 1 1 0.10485760000000000000e7
+1 2 1 1 -0.10485760000000000000e7
+1 3 1 1 0.10485760000000000000e7
+*** ANSWER ***
+Infeasible
+*** END ***
+*** REQUEST ***
+""
+5
+5
+4 1 1 1 1
+0.10485760000000000000e7 0.0 0.52428800000000000000e6 0.52428800000000000000e6 0.0
+0 2 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 2 1 1 0.52428800000000000000e6
+2 1 1 3 0.52428800000000000000e6
+2 1 1 4 -0.52428800000000000000e6
+2 2 1 1 -0.10485760000000000000e7
+2 4 1 1 0.10485760000000000000e7
+3 1 1 2 -0.52428800000000000000e6
+3 1 1 4 0.26214400000000000000e6
+3 1 3 3 0.52428800000000000000e6
+3 2 1 1 0.52428800000000000000e6
+3 4 1 1 -0.52428800000000000000e6
+4 2 1 1 0.52428800000000000000e6
+4 3 1 1 0.52428800000000000000e6
+4 4 1 1 -0.52428800000000000000e6
+5 1 1 2 -0.52428800000000000000e6
+5 1 1 4 0.26214400000000000000e6
+5 1 3 4 0.52428800000000000000e6
+5 1 4 4 -0.52428800000000000000e6
+5 5 1 1 0.52428800000000000000e6
+*** ANSWER ***
+3.195988761043818697e-15 2.434891739362865648e-17 1.131563150190301381e-17 1.866162834975372311e-17 -4.329478161627238877e-20
+1 1 1 1 1.675706186858708813e-09
+1 1 1 2 -5.909950874405706652e-12
+1 1 1 3 1.276584520247078105e-11
+1 1 1 4 -9.810869765267982652e-12
+1 1 2 2 8.763130856697872339e-14
+1 1 3 3 6.020281117436706900e-12
+1 1 3 4 -2.269893446403221816e-14
+1 1 4 4 1.103302430310100170e-13
+1 2 1 1 5.242880000000016298e+05
+1 3 1 1 9.871699112802661190e-12
+1 4 1 1 9.902604100403173178e-12
+1 5 1 1 6.493237410294658411e-14
+2 1 1 1 2.000000000000000444e+00
+2 1 1 2 4.699212565382836004e+01
+2 1 1 3 -6.572791315729037187e+00
+2 1 1 4 4.683623698014699954e+01
+2 1 2 2 2.873708491112125103e+03
+2 1 2 3 -9.253337481306272139e+01
+2 1 2 4 1.275243930522032770e+03
+2 1 3 3 1.015570426233858257e+02
+2 1 3 4 -9.553812723654185390e+01
+2 1 4 4 2.620606522151014815e+03
+2 2 1 1 5.422933505993135752e-16
+2 3 1 1 5.440902829587604117e+01
+2 4 1 1 5.340902829587604828e+01
+2 5 1 1 2.858830790951610652e+03
+*** END ***
+*** REQUEST ***
+""
+4
+2
+3 1
+-0.52428800000000000000e6 0.52428800000000000000e6 0.10485760000000000000e7 0.0
+0 1 2 2 0.10485760000000000000e7
+0 1 3 3 -0.10485760000000000000e7
+0 2 1 1 -0.10485760000000000000e7
+1 1 2 3 0.52428800000000000000e6
+1 1 3 3 -0.10485760000000000000e7
+2 1 2 2 0.10485760000000000000e7
+2 1 2 3 -0.52428800000000000000e6
+3 1 1 1 0.10485760000000000000e7
+3 1 2 2 -0.10485760000000000000e7
+3 1 3 3 0.10485760000000000000e7
+3 2 1 1 0.10485760000000000000e7
+4 1 1 2 -0.10485760000000000000e7
+4 1 1 3 0.10485760000000000000e7
+*** ANSWER ***
+Failure
+*** END ***
+*** REQUEST ***
+""
+22
+2
+6 3
+0.52428800000000000000e6 0.0 0.0 0.0 0.10485760000000000000e7 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 -0.10485760000000000000e7 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.10485760000000000000e7 0.0 0.0
+0 1 1 6 -0.26214400000000000000e6
+0 1 2 2 0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+1 1 1 6 0.26214400000000000000e6
+1 1 3 6 -0.26214400000000000000e6
+1 1 5 6 0.26214400000000000000e6
+1 2 3 3 0.52428800000000000000e6
+2 1 3 6 0.26214400000000000000e6
+2 1 5 6 -0.26214400000000000000e6
+3 1 1 4 0.26214400000000000000e6
+3 1 2 5 -0.26214400000000000000e6
+3 1 4 5 0.26214400000000000000e6
+3 2 1 3 0.26214400000000000000e6
+4 1 2 5 0.26214400000000000000e6
+4 1 4 5 -0.26214400000000000000e6
+5 1 2 2 0.52428800000000000000e6
+5 2 2 2 0.52428800000000000000e6
+6 1 2 3 0.26214400000000000000e6
+6 1 2 5 -0.26214400000000000000e6
+7 1 1 6 -0.26214400000000000000e6
+7 1 2 2 0.52428800000000000000e6
+8 1 1 2 0.26214400000000000000e6
+8 1 1 4 -0.26214400000000000000e6
+9 1 1 1 0.52428800000000000000e6
+9 1 1 6 0.26214400000000000000e6
+9 1 2 2 -0.52428800000000000000e6
+9 2 1 1 0.52428800000000000000e6
+10 1 1 3 0.52428800000000000000e6
+10 1 2 2 -0.10485760000000000000e7
+11 1 1 5 0.52428800000000000000e6
+11 1 1 6 -0.52428800000000000000e6
+12 1 1 6 -0.52428800000000000000e6
+12 1 2 4 0.52428800000000000000e6
+13 1 2 6 0.52428800000000000000e6
+13 1 4 5 -0.52428800000000000000e6
+14 1 2 2 -0.52428800000000000000e6
+14 1 3 3 0.52428800000000000000e6
+14 1 3 6 -0.26214400000000000000e6
+14 2 2 2 -0.52428800000000000000e6
+15 1 2 5 -0.52428800000000000000e6
+15 1 3 4 0.52428800000000000000e6
+16 1 3 5 0.52428800000000000000e6
+16 1 3 6 -0.52428800000000000000e6
+17 1 1 6 -0.26214400000000000000e6
+17 1 4 4 0.52428800000000000000e6
+18 1 1 4 0.52428800000000000000e6
+18 1 2 5 -0.52428800000000000000e6
+18 1 4 6 0.52428800000000000000e6
+18 2 1 3 0.52428800000000000000e6
+19 1 3 6 -0.26214400000000000000e6
+19 1 5 5 0.52428800000000000000e6
+20 1 1 6 0.26214400000000000000e6
+20 1 3 6 -0.26214400000000000000e6
+20 1 6 6 0.52428800000000000000e6
+20 2 3 3 0.52428800000000000000e6
+21 1 1 2 0.52428800000000000000e6
+21 1 2 3 -0.52428800000000000000e6
+21 1 4 5 0.52428800000000000000e6
+21 2 1 2 0.52428800000000000000e6
+22 1 1 6 0.52428800000000000000e6
+22 1 3 6 -0.52428800000000000000e6
+22 1 5 6 0.52428800000000000000e6
+22 2 2 3 0.52428800000000000000e6
+*** ANSWER ***
+5.839663417701494061e-11 1.751899025509651792e-10 0.000000000000000000e+00 0.000000000000000000e+00 2.919830601321844361e-10 0.000000000000000000e+00 1.000000000089372953e+00 0.000000000000000000e+00 8.937320947104160100e-11 3.021836269509507469e-21 -2.406433537995495362e-21 -2.767344573788207019e-17 0.000000000000000000e+00 1.167932129833722268e-10 0.000000000000000000e+00 -5.839660649248991323e-11 1.751897918094591794e-10 0.000000000000000000e+00 1.167932129807476085e-10 1.167932129797094193e-10 0.000000000000000000e+00 2.769847470999716913e-17
+1 1 1 1 4.685937281069181592e-05
+1 1 1 3 1.584312494068600652e-15
+1 1 1 5 -1.261664226768582272e-15
+1 1 1 6 -1.261817464964131011e-15
+1 1 2 2 9.185197712959358577e-05
+1 1 2 4 -1.450885551902271482e-11
+1 1 3 3 6.123535161216460149e-05
+1 1 3 5 -3.061664002473455163e-05
+1 1 3 6 -3.061664002391371571e-05
+1 1 4 4 9.185197713173607768e-05
+1 1 5 5 6.123535161078855920e-05
+1 1 5 6 -3.061664002264275294e-05
+1 1 6 6 6.123535161024423550e-05
+1 2 1 1 5.242880000468591461e+05
+1 2 2 2 9.185200614549551737e-05
+1 2 2 3 1.452197790875499581e-11
+1 2 3 3 9.185200614964305146e-05
+2 1 1 1 1.999999999955304864e+00
+2 1 1 3 5.387769727928047948e-09
+2 1 1 5 5.388585055015748998e-09
+2 1 1 6 5.388585193674560217e-09
+2 1 2 2 1.000000005386608048e+00
+2 1 2 4 5.387325250200841916e-09
+2 1 3 3 7.009433543058215719e+02
+2 1 3 5 6.999433543062098124e+02
+2 1 3 6 6.999433543060563352e+02
+2 1 4 4 1.000000005386422641e+00
+2 1 5 5 7.009433543066012362e+02
+2 1 5 6 6.999433543064428704e+02
+2 1 6 6 7.009433543062891658e+02
+2 2 1 1 4.523769502473800361e-11
+2 2 2 2 9.999999946133917295e-01
+2 2 2 3 -5.387302141143381380e-09
+2 2 3 3 9.999999946125661676e-01
+*** END ***
+*** REQUEST ***
+""
+4
+2
+3 1
+-0.52428800000000000000e6 0.52428800000000000000e6 0.10485760000000000000e7 0.0
+0 1 2 2 -0.10485760000000000000e7
+0 1 3 3 0.10485760000000000000e7
+0 2 1 1 -0.10485760000000000000e7
+1 1 2 3 0.52428800000000000000e6
+1 1 3 3 -0.10485760000000000000e7
+2 1 2 2 0.10485760000000000000e7
+2 1 2 3 -0.52428800000000000000e6
+3 1 1 1 0.10485760000000000000e7
+3 1 2 2 0.10485760000000000000e7
+3 1 3 3 -0.10485760000000000000e7
+3 2 1 1 0.10485760000000000000e7
+4 1 1 2 -0.10485760000000000000e7
+4 1 1 3 0.10485760000000000000e7
+*** ANSWER ***
+Failure
+*** END ***
+*** REQUEST ***
+""
+22
+2
+6 3
+-0.52428800000000000000e6 0.0 0.0 0.0 -0.10485760000000000000e7 0.0 0.52428800000000000000e6 0.0 0.15728640000000000000e7 -0.10485760000000000000e7 0.0 0.0 0.0 0.15728640000000000000e7 0.0 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.0 0.0 0.0
+0 1 1 6 0.26214400000000000000e6
+0 1 2 2 -0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+1 1 1 6 -0.26214400000000000000e6
+1 1 3 6 -0.26214400000000000000e6
+1 1 5 6 0.26214400000000000000e6
+1 2 3 3 -0.52428800000000000000e6
+2 1 3 6 0.26214400000000000000e6
+2 1 5 6 -0.26214400000000000000e6
+3 1 1 4 -0.26214400000000000000e6
+3 1 2 5 -0.26214400000000000000e6
+3 1 4 5 0.26214400000000000000e6
+3 2 1 3 -0.26214400000000000000e6
+4 1 2 5 0.26214400000000000000e6
+4 1 4 5 -0.26214400000000000000e6
+5 1 2 2 -0.52428800000000000000e6
+5 2 2 2 -0.52428800000000000000e6
+6 1 2 3 0.26214400000000000000e6
+6 1 2 5 -0.26214400000000000000e6
+7 1 1 6 -0.26214400000000000000e6
+7 1 2 2 0.52428800000000000000e6
+8 1 1 2 0.26214400000000000000e6
+8 1 1 4 -0.26214400000000000000e6
+9 1 1 1 0.52428800000000000000e6
+9 1 1 6 -0.26214400000000000000e6
+9 1 2 2 0.52428800000000000000e6
+9 2 1 1 0.52428800000000000000e6
+10 1 1 3 0.52428800000000000000e6
+10 1 2 2 -0.10485760000000000000e7
+11 1 1 5 0.52428800000000000000e6
+11 1 1 6 -0.52428800000000000000e6
+12 1 1 6 -0.52428800000000000000e6
+12 1 2 4 0.52428800000000000000e6
+13 1 2 6 0.52428800000000000000e6
+13 1 4 5 -0.52428800000000000000e6
+14 1 2 2 0.52428800000000000000e6
+14 1 3 3 0.52428800000000000000e6
+14 1 3 6 -0.26214400000000000000e6
+14 2 2 2 0.52428800000000000000e6
+15 1 2 5 -0.52428800000000000000e6
+15 1 3 4 0.52428800000000000000e6
+16 1 3 5 0.52428800000000000000e6
+16 1 3 6 -0.52428800000000000000e6
+17 1 1 6 -0.26214400000000000000e6
+17 1 4 4 0.52428800000000000000e6
+18 1 1 4 -0.52428800000000000000e6
+18 1 2 5 -0.52428800000000000000e6
+18 1 4 6 0.52428800000000000000e6
+18 2 1 3 -0.52428800000000000000e6
+19 1 3 6 -0.26214400000000000000e6
+19 1 5 5 0.52428800000000000000e6
+20 1 1 6 -0.26214400000000000000e6
+20 1 3 6 -0.26214400000000000000e6
+20 1 6 6 0.52428800000000000000e6
+20 2 3 3 -0.52428800000000000000e6
+21 1 1 2 0.52428800000000000000e6
+21 1 2 3 0.52428800000000000000e6
+21 1 4 5 -0.52428800000000000000e6
+21 2 1 2 0.52428800000000000000e6
+22 1 1 6 0.52428800000000000000e6
+22 1 3 6 0.52428800000000000000e6
+22 1 5 6 -0.52428800000000000000e6
+22 2 2 3 0.52428800000000000000e6
+*** ANSWER ***
+-5.533246032951339678e-10 -3.319947623005002454e-10 0.000000000000000000e+00 0.000000000000000000e+00 -1.106649207612376761e-10 0.000000000000000000e+00 -1.000000000170524705e+00 0.000000000000000000e+00 1.705258175543380218e-10 1.057734755428072669e-20 -5.293059538185577074e-21 -1.632153589543131659e-19 0.000000000000000000e+00 2.213298412512432947e-10 0.000000000000000000e+00 -1.106649206115995143e-10 3.319947616988976278e-10 0.000000000000000000e+00 2.213298412412285673e-10 2.213298412685045120e-10 0.000000000000000000e+00 1.319700611909645585e-19
+1 1 1 1 8.940978231941347130e-05
+1 1 1 3 5.545576394538733637e-15
+1 1 1 5 -2.775087599156239833e-15
+1 1 1 6 -2.774136184952193103e-15
+1 1 2 2 1.740660121040041427e-04
+1 1 2 4 -8.557185411543894110e-14
+1 1 3 3 1.160457222954165701e-04
+1 1 3 5 -5.802028989761428613e-05
+1 1 3 6 -5.802028991229537288e-05
+1 1 4 4 1.740660121070763380e-04
+1 1 5 5 1.160457222901659687e-04
+1 1 5 6 -5.802028990688761639e-05
+1 1 6 6 1.160457223044664192e-04
+1 2 1 1 5.242880000894092955e+05
+1 2 2 2 1.740660122714839694e-04
+1 2 2 3 6.919031944168842645e-14
+1 2 3 3 1.740660122789019452e-04
+2 1 1 1 1.999999999858774968e+00
+2 1 1 3 -2.970479961811703686e-10
+2 1 1 5 -2.936282527441688478e-10
+2 1 1 6 -2.936281769638408586e-10
+2 1 2 2 9.999999997035153854e-01
+2 1 2 4 -2.957768390142424244e-10
+2 1 3 3 5.487429195449051349e+02
+2 1 3 5 5.477429195445491814e+02
+2 1 3 6 5.477429195446867425e+02
+2 1 4 4 9.999999997034079158e-01
+2 1 5 5 5.487429195441944785e+02
+2 1 5 6 5.477429195443321532e+02
+2 1 6 6 5.487429195444678953e+02
+2 2 1 1 1.426518480281972949e-10
+2 2 2 2 1.000000000296484837e+00
+2 2 2 3 2.981765833679325180e-10
+2 2 3 3 1.000000000295827141e+00
+*** END ***
+*** REQUEST ***
+""
+4
+2
+3 1
+-0.52428800000000000000e6 -0.52428800000000000000e6 0.10485760000000000000e7 0.0
+0 1 2 2 0.10485760000000000000e7
+0 1 3 3 -0.10485760000000000000e7
+0 2 1 1 -0.10485760000000000000e7
+1 1 2 3 -0.52428800000000000000e6
+1 1 3 3 -0.10485760000000000000e7
+2 1 2 2 -0.10485760000000000000e7
+2 1 2 3 -0.52428800000000000000e6
+3 1 1 1 0.10485760000000000000e7
+3 1 2 2 -0.10485760000000000000e7
+3 1 3 3 0.10485760000000000000e7
+3 2 1 1 0.10485760000000000000e7
+4 1 1 2 0.10485760000000000000e7
+4 1 1 3 0.10485760000000000000e7
+*** ANSWER ***
+Failure
+*** END ***
+*** REQUEST ***
+""
+22
+2
+6 3
+0.52428800000000000000e6 0.0 0.0 0.0 -0.10485760000000000000e7 0.0 -0.52428800000000000000e6 0.0 0.52428800000000000000e6 -0.10485760000000000000e7 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.10485760000000000000e7 0.0 0.0
+0 1 1 6 -0.26214400000000000000e6
+0 1 2 2 0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+1 1 1 6 0.26214400000000000000e6
+1 1 3 6 -0.26214400000000000000e6
+1 1 5 6 -0.26214400000000000000e6
+1 2 3 3 0.52428800000000000000e6
+2 1 3 6 -0.26214400000000000000e6
+2 1 5 6 -0.26214400000000000000e6
+3 1 1 4 0.26214400000000000000e6
+3 1 2 5 -0.26214400000000000000e6
+3 1 4 5 -0.26214400000000000000e6
+3 2 1 3 0.26214400000000000000e6
+4 1 2 5 -0.26214400000000000000e6
+4 1 4 5 -0.26214400000000000000e6
+5 1 2 2 -0.52428800000000000000e6
+5 2 2 2 -0.52428800000000000000e6
+6 1 2 3 -0.26214400000000000000e6
+6 1 2 5 -0.26214400000000000000e6
+7 1 1 6 0.26214400000000000000e6
+7 1 2 2 -0.52428800000000000000e6
+8 1 1 2 -0.26214400000000000000e6
+8 1 1 4 -0.26214400000000000000e6
+9 1 1 1 0.52428800000000000000e6
+9 1 1 6 0.26214400000000000000e6
+9 1 2 2 -0.52428800000000000000e6
+9 2 1 1 0.52428800000000000000e6
+10 1 1 3 0.52428800000000000000e6
+10 1 2 2 -0.10485760000000000000e7
+11 1 1 5 0.52428800000000000000e6
+11 1 1 6 0.52428800000000000000e6
+12 1 1 6 0.52428800000000000000e6
+12 1 2 4 0.52428800000000000000e6
+13 1 2 6 0.52428800000000000000e6
+13 1 4 5 -0.52428800000000000000e6
+14 1 2 2 -0.52428800000000000000e6
+14 1 3 3 0.52428800000000000000e6
+14 1 3 6 -0.26214400000000000000e6
+14 2 2 2 -0.52428800000000000000e6
+15 1 2 5 -0.52428800000000000000e6
+15 1 3 4 0.52428800000000000000e6
+16 1 3 5 0.52428800000000000000e6
+16 1 3 6 0.52428800000000000000e6
+17 1 1 6 -0.26214400000000000000e6
+17 1 4 4 0.52428800000000000000e6
+18 1 1 4 0.52428800000000000000e6
+18 1 2 5 -0.52428800000000000000e6
+18 1 4 6 0.52428800000000000000e6
+18 2 1 3 0.52428800000000000000e6
+19 1 3 6 -0.26214400000000000000e6
+19 1 5 5 0.52428800000000000000e6
+20 1 1 6 0.26214400000000000000e6
+20 1 3 6 -0.26214400000000000000e6
+20 1 6 6 0.52428800000000000000e6
+20 2 3 3 0.52428800000000000000e6
+21 1 1 2 0.52428800000000000000e6
+21 1 2 3 -0.52428800000000000000e6
+21 1 4 5 0.52428800000000000000e6
+21 2 1 2 0.52428800000000000000e6
+22 1 1 6 -0.52428800000000000000e6
+22 1 3 6 0.52428800000000000000e6
+22 1 5 6 0.52428800000000000000e6
+22 2 2 3 0.52428800000000000000e6
+*** ANSWER ***
+7.548698962861986416e-11 -2.264609688252180512e-10 0.000000000000000000e+00 0.000000000000000000e+00 -3.774348944187179506e-10 0.000000000000000000e+00 -1.000000000115524479e+00 0.000000000000000000e+00 1.155250441890333197e-10 -7.998352600767041351e-22 3.424972480671279646e-23 1.343613141635847696e-17 0.000000000000000000e+00 1.509739523996826117e-10 0.000000000000000000e+00 7.548697620263761578e-11 2.264609151780252983e-10 0.000000000000000000e+00 1.509739523885083839e-10 1.509739523843468383e-10 0.000000000000000000e+00 -1.341197308937464188e-17
+1 1 1 1 6.057106735321764830e-05
+1 1 1 3 -4.193440288350950576e-16
+1 1 1 5 1.795671971946183863e-17
+1 1 1 6 -1.763237620174886966e-17
+1 1 2 2 1.187334132746289180e-04
+1 1 2 4 7.044402468019753166e-12
+1 1 3 3 7.915650454116255111e-05
+1 1 3 5 3.957691577932847030e-05
+1 1 3 6 -3.957691577653270592e-05
+1 1 4 4 1.187334132822942951e-04
+1 1 5 5 7.915650453530403757e-05
+1 1 5 6 3.957691577077671725e-05
+1 1 6 6 7.915650453312220267e-05
+1 2 1 1 5.242880000605707755e+05
+1 2 2 2 1.187334273547131845e-04
+1 2 2 3 -7.031736547082052244e-12
+1 2 3 3 1.187334273515322980e-04
+2 1 1 1 1.999999999901518333e+00
+2 1 1 3 2.543855882999511782e-09
+2 1 1 5 -2.543748268010374590e-09
+2 1 1 6 2.543748340207115766e-09
+2 1 2 2 1.000000002542948518e+00
+2 1 2 4 -2.543208478569798311e-09
+2 1 3 3 7.015782927587728182e+02
+2 1 3 5 -7.005782927584516528e+02
+2 1 3 6 7.005782927589060591e+02
+2 1 4 4 1.000000002542477784e+00
+2 1 5 5 7.015782927581306012e+02
+2 1 5 6 -7.005782927585830748e+02
+2 1 6 6 7.015782927590373674e+02
+2 2 1 1 9.718413219086408242e-11
+2 2 2 2 9.999999974570508154e-01
+2 2 2 3 2.538668335507870708e-09
+2 2 3 3 9.999999974599226293e-01
+*** END ***
+*** REQUEST ***
+""
+4
+2
+3 1
+-0.52428800000000000000e6 -0.52428800000000000000e6 0.10485760000000000000e7 0.0
+0 1 2 2 -0.10485760000000000000e7
+0 1 3 3 0.10485760000000000000e7
+0 2 1 1 -0.10485760000000000000e7
+1 1 2 3 -0.52428800000000000000e6
+1 1 3 3 -0.10485760000000000000e7
+2 1 2 2 -0.10485760000000000000e7
+2 1 2 3 -0.52428800000000000000e6
+3 1 1 1 0.10485760000000000000e7
+3 1 2 2 0.10485760000000000000e7
+3 1 3 3 -0.10485760000000000000e7
+3 2 1 1 0.10485760000000000000e7
+4 1 1 2 0.10485760000000000000e7
+4 1 1 3 0.10485760000000000000e7
+*** ANSWER ***
+Failure
+*** END ***
+*** REQUEST ***
+""
+22
+2
+6 3
+-0.52428800000000000000e6 0.0 0.0 0.0 0.10485760000000000000e7 0.0 -0.52428800000000000000e6 0.0 0.15728640000000000000e7 -0.10485760000000000000e7 0.0 0.0 0.0 0.15728640000000000000e7 0.0 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.0 0.0 0.0
+0 1 1 6 0.26214400000000000000e6
+0 1 2 2 -0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+1 1 1 6 -0.26214400000000000000e6
+1 1 3 6 -0.26214400000000000000e6
+1 1 5 6 -0.26214400000000000000e6
+1 2 3 3 -0.52428800000000000000e6
+2 1 3 6 -0.26214400000000000000e6
+2 1 5 6 -0.26214400000000000000e6
+3 1 1 4 -0.26214400000000000000e6
+3 1 2 5 -0.26214400000000000000e6
+3 1 4 5 -0.26214400000000000000e6
+3 2 1 3 -0.26214400000000000000e6
+4 1 2 5 -0.26214400000000000000e6
+4 1 4 5 -0.26214400000000000000e6
+5 1 2 2 0.52428800000000000000e6
+5 2 2 2 0.52428800000000000000e6
+6 1 2 3 -0.26214400000000000000e6
+6 1 2 5 -0.26214400000000000000e6
+7 1 1 6 0.26214400000000000000e6
+7 1 2 2 -0.52428800000000000000e6
+8 1 1 2 -0.26214400000000000000e6
+8 1 1 4 -0.26214400000000000000e6
+9 1 1 1 0.52428800000000000000e6
+9 1 1 6 -0.26214400000000000000e6
+9 1 2 2 0.52428800000000000000e6
+9 2 1 1 0.52428800000000000000e6
+10 1 1 3 0.52428800000000000000e6
+10 1 2 2 -0.10485760000000000000e7
+11 1 1 5 0.52428800000000000000e6
+11 1 1 6 0.52428800000000000000e6
+12 1 1 6 0.52428800000000000000e6
+12 1 2 4 0.52428800000000000000e6
+13 1 2 6 0.52428800000000000000e6
+13 1 4 5 -0.52428800000000000000e6
+14 1 2 2 0.52428800000000000000e6
+14 1 3 3 0.52428800000000000000e6
+14 1 3 6 -0.26214400000000000000e6
+14 2 2 2 0.52428800000000000000e6
+15 1 2 5 -0.52428800000000000000e6
+15 1 3 4 0.52428800000000000000e6
+16 1 3 5 0.52428800000000000000e6
+16 1 3 6 0.52428800000000000000e6
+17 1 1 6 -0.26214400000000000000e6
+17 1 4 4 0.52428800000000000000e6
+18 1 1 4 -0.52428800000000000000e6
+18 1 2 5 -0.52428800000000000000e6
+18 1 4 6 0.52428800000000000000e6
+18 2 1 3 -0.52428800000000000000e6
+19 1 3 6 -0.26214400000000000000e6
+19 1 5 5 0.52428800000000000000e6
+20 1 1 6 -0.26214400000000000000e6
+20 1 3 6 -0.26214400000000000000e6
+20 1 6 6 0.52428800000000000000e6
+20 2 3 3 -0.52428800000000000000e6
+21 1 1 2 0.52428800000000000000e6
+21 1 2 3 0.52428800000000000000e6
+21 1 4 5 -0.52428800000000000000e6
+21 2 1 2 0.52428800000000000000e6
+22 1 1 6 -0.52428800000000000000e6
+22 1 3 6 -0.52428800000000000000e6
+22 1 5 6 -0.52428800000000000000e6
+22 2 2 3 0.52428800000000000000e6
+*** ANSWER ***
+-3.997380461455545041e-10 2.398427690841104240e-10 0.000000000000000000e+00 0.000000000000000000e+00 7.994758968143922428e-11 0.000000000000000000e+00 1.000000000122418964e+00 0.000000000000000000e+00 1.224196357618671858e-10 2.560817591637394287e-22 -6.161666215447023732e-22 -2.442921478701863949e-17 0.000000000000000000e+00 1.598952281955126906e-10 0.000000000000000000e+00 7.994761407870257593e-11 2.398428667463938718e-10 0.000000000000000000e+00 1.598952281923594264e-10 1.598952282312554234e-10 0.000000000000000000e+00 2.441642442193318786e-17
+1 1 1 1 6.418581897977994452e-05
+1 1 1 3 1.342605933484386176e-16
+1 1 1 5 -3.230487656764289178e-16
+1 1 1 6 3.226223799277422342e-16
+1 1 2 2 1.257494098974095580e-04
+1 1 2 4 -1.280794416225642846e-11
+1 1 3 3 8.383382238563106539e-05
+1 1 3 5 4.191557469009481613e-05
+1 1 3 6 -4.191557470994484351e-05
+1 1 4 4 1.257494099061954446e-04
+1 1 5 5 8.383382238397784681e-05
+1 1 5 6 4.191557470875686286e-05
+1 1 6 6 8.383382240437055126e-05
+1 2 1 1 5.242880000641855877e+05
+1 2 2 2 1.257493842845328297e-04
+1 2 2 3 1.280123832732650720e-11
+1 2 3 3 1.257493843041132227e-04
+2 1 1 1 1.999999999897413616e+00
+2 1 1 3 -4.410425798738489538e-09
+2 1 1 5 4.409802390349250864e-09
+2 1 1 6 -4.409802495728068929e-09
+2 1 2 2 9.999999955892144854e-01
+2 1 2 4 4.409221088008103069e-09
+2 1 3 3 7.464333359699692210e+02
+2 1 3 5 -7.454333359699899120e+02
+2 1 3 6 7.454333359702302459e+02
+2 1 4 4 9.999999955891271108e-01
+2 1 5 5 7.464333359700135588e+02
+2 1 5 6 -7.454333359702501411e+02
+2 1 6 6 7.464333359704885424e+02
+2 2 1 1 1.029387417046826333e-10
+2 2 2 2 1.000000004410785959e+00
+2 2 2 3 -4.406291531390127149e-09
+2 2 3 3 1.000000004408885035e+00
+*** END ***
+*** REQUEST ***
+""
+1
+5
+1 1 1 1 1
+0.10485760000000000000e7
+0 1 1 1 0.10485760000000000000e7
+1 2 1 1 0.10485760000000000000e7
+1 4 1 1 0.10485760000000000000e7
+*** ANSWER ***
+Infeasible
+*** END ***
+*** REQUEST ***
+""
+13
+11
+5 1 1 1 1 1 1 1 1 1 1
+0.15728640000000000000e7 -0.10485760000000000000e7 -0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.0 0.10485760000000000000e7 0.10485760000000000000e7 0.0 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7
+0 1 1 1 0.52428800000000000000e6
+1 1 4 4 0.10485760000000000000e7
+1 6 1 1 0.52428800000000000000e6
+2 1 1 2 0.52428800000000000000e6
+2 1 2 3 0.52428800000000000000e6
+2 4 1 1 -0.10485760000000000000e7
+3 1 1 4 0.52428800000000000000e6
+3 8 1 1 -0.10485760000000000000e7
+4 1 2 2 0.52428800000000000000e6
+4 6 1 1 0.52428800000000000000e6
+5 1 2 4 0.52428800000000000000e6
+5 9 1 1 0.10485760000000000000e7
+6 1 3 3 0.52428800000000000000e6
+6 6 1 1 0.52428800000000000000e6
+7 1 4 4 -0.52428800000000000000e6
+7 1 5 5 0.52428800000000000000e6
+8 1 2 3 -0.26214400000000000000e6
+8 2 1 1 0.52428800000000000000e6
+8 4 1 1 0.52428800000000000000e6
+9 1 1 1 0.52428800000000000000e6
+9 1 1 3 0.26214400000000000000e6
+9 3 1 1 0.52428800000000000000e6
+10 1 2 3 0.26214400000000000000e6
+10 4 1 1 -0.52428800000000000000e6
+10 5 1 1 0.52428800000000000000e6
+11 4 1 1 0.52428800000000000000e6
+11 7 1 1 0.52428800000000000000e6
+12 1 3 4 0.26214400000000000000e6
+12 8 1 1 0.52428800000000000000e6
+12 10 1 1 0.52428800000000000000e6
+13 9 1 1 0.52428800000000000000e6
+13 11 1 1 0.52428800000000000000e6
+*** ANSWER ***
+1.402333343794533736e-09 -1.552307416644435207e-23 1.604266199290855281e-09 1.343624328966796008e-09 -6.063371200683696295e-24 1.170820376268658425e+00 1.856810394853954153e-09 3.064822680874087664e-09 1.447213615551183663e+00 3.064822680874067398e-09 3.064822680874108757e-09 5.527780141197477439e-09 3.064822680874105862e-09
+1 1 1 1 2.344687320700988639e+05
+1 1 1 2 -8.138561508576776457e-18
+1 1 1 3 3.793783660350494902e+05
+1 1 1 4 8.410975170938039336e-04
+1 1 2 2 7.044461121853435454e-04
+1 1 2 3 -1.105818050021102618e-17
+1 1 2 4 -3.178952760064053763e-18
+1 1 3 3 6.138470734331423882e+05
+1 1 3 4 1.449074397334071526e-03
+1 1 4 4 4.969496800055124043e-04
+1 1 5 5 9.735034082971899148e-04
+1 2 1 1 1.606849753710113673e-03
+1 3 1 1 7.587567320700989803e+05
+1 4 1 1 1.606849753710147067e-03
+1 5 1 1 1.606849753710103048e-03
+1 6 1 1 6.138470748728149338e+05
+1 7 1 1 1.606849753710124732e-03
+1 8 1 1 1.215953760480545810e-03
+1 9 1 1 1.606849753710118660e-03
+1 10 1 1 2.898148794668143052e-03
+1 11 1 1 1.606849753710123214e-03
+2 1 1 1 5.236067957170654985e+00
+2 1 1 2 6.637955912198244568e-16
+2 1 1 3 -3.236067961247948155e+00
+2 1 1 4 5.453112737744264527e-01
+2 1 2 2 1.999999992131578308e+00
+2 1 2 3 -4.101979258499907904e-16
+2 1 2 4 4.919435770790035810e-16
+2 1 3 3 1.999999992131579418e+00
+2 1 3 4 -3.370915430094725829e-01
+2 1 4 4 1.499999996065789265e+00
+2 1 5 5 1.499999996065788821e+00
+2 2 1 1 1.000000000000000444e+00
+2 3 1 1 4.077292770027088742e-09
+2 4 1 1 1.000000000000000444e+00
+2 5 1 1 1.000000000000000444e+00
+2 6 1 1 7.868421581455017743e-09
+2 7 1 1 9.999999999999998890e-01
+2 8 1 1 1.545311273774427452e+00
+2 9 1 1 9.999999999999994449e-01
+2 10 1 1 7.917802692350457416e-01
+2 11 1 1 1.000000000000000444e+00
+*** END ***
+*** REQUEST ***
+""
+1
+5
+1 1 1 1 1
+0.15728640000000000000e7
+0 1 1 1 0.10485760000000000000e7
+1 1 1 1 0.10485760000000000000e7
+1 2 1 1 0.10485760000000000000e7
+1 5 1 1 0.10485760000000000000e7
+*** ANSWER ***
+1.000000005357981392e+00
+1 1 1 1 5.618250780273614797e-03
+1 2 1 1 1.048576005618250696e+06
+1 3 1 1 8.122239242601498837e-11
+1 4 1 1 8.122239242601498837e-11
+1 5 1 1 1.048576005618250696e+06
+2 1 1 1 1.499999999999999556e+00
+2 2 1 1 1.236459417730440554e-16
+2 3 1 1 1.146570973783460818e+07
+2 4 1 1 1.146570973783460818e+07
+2 5 1 1 1.236459417730440554e-16
+*** END ***
+*** REQUEST ***
+""
+10
+8
+5 1 1 1 1 1 1 1
+0.26214400000000000000e6 0.78643200000000000000e6 -0.52428800000000000000e6 -0.52428800000000000000e6 0.0 -0.52428800000000000000e6 0.10485760000000000000e7 0.0 -0.26214400000000000000e6 0.52428800000000000000e6
+0 1 3 3 -0.10485760000000000000e7
+0 1 4 4 0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+1 1 3 3 0.10485760000000000000e7
+1 1 4 4 -0.52428800000000000000e6
+2 1 1 1 0.52428800000000000000e6
+2 1 3 3 0.10485760000000000000e7
+2 1 4 4 -0.52428800000000000000e6
+2 2 1 1 0.52428800000000000000e6
+3 1 1 2 0.52428800000000000000e6
+3 4 1 1 -0.10485760000000000000e7
+4 1 1 3 0.52428800000000000000e6
+4 6 1 1 -0.10485760000000000000e7
+5 1 2 2 0.52428800000000000000e6
+5 1 4 4 -0.52428800000000000000e6
+6 1 2 3 0.52428800000000000000e6
+6 8 1 1 -0.10485760000000000000e7
+7 1 2 4 0.52428800000000000000e6
+7 4 1 1 0.10485760000000000000e7
+7 5 1 1 0.10485760000000000000e7
+8 1 3 3 -0.52428800000000000000e6
+8 1 5 5 0.52428800000000000000e6
+9 1 1 4 0.26214400000000000000e6
+9 1 3 3 -0.10485760000000000000e7
+9 1 4 4 0.52428800000000000000e6
+9 2 1 1 -0.52428800000000000000e6
+9 3 1 1 0.52428800000000000000e6
+10 1 3 4 0.26214400000000000000e6
+10 6 1 1 0.52428800000000000000e6
+10 7 1 1 0.52428800000000000000e6
+*** ANSWER ***
+-1.000000001260698657e+00 1.272997840951505179e-09 -6.071624507107061208e-12 -8.373302285347945428e-12 -2.976157420808034464e-14 -2.694196303457895409e-14 5.028154957630146827e-15 -1.020526200179788434e-14 1.222103204680506058e-11 5.571813919773229819e-14
+1 1 1 1 6.675079446572142325e-04
+1 1 1 2 -3.183279869582146907e-06
+1 1 1 3 -4.390021908580503613e-06
+1 1 1 4 3.203670224877665800e-06
+1 1 2 2 7.484898421317940485e-08
+1 1 2 3 -1.412534791547333068e-08
+1 1 2 4 2.636201306425994420e-09
+1 1 3 3 1.578227075299173303e-07
+1 1 3 4 1.460617588185033558e-08
+1 1 4 4 7.509224596923756397e-08
+1 1 5 5 8.510212402718687551e-08
+1 2 1 1 5.242880006610907149e+05
+1 3 1 1 6.497793070186914256e-06
+1 4 1 1 6.462284762208718596e-06
+1 5 1 1 9.572502304443735608e-08
+1 6 1 1 8.899708789356296055e-06
+1 7 1 1 1.196649721952861037e-07
+1 8 1 1 1.187033162625319947e-07
+2 1 1 1 1.000000004105983997e+00
+2 1 1 2 2.000962487553242397e+01
+2 1 1 3 1.447213888640053803e+01
+2 1 1 4 -2.033189056803728789e+01
+2 1 2 2 9.557223179479771034e+02
+2 1 2 3 3.351160917930480991e+02
+2 1 2 4 -4.305866697331389901e+02
+2 1 3 3 4.781111589742900492e+02
+2 1 3 4 -3.450028293947015072e+02
+2 1 4 4 9.557223179502830135e+02
+2 1 5 5 4.781111589740242493e+02
+2 2 1 1 1.177925599224658722e-10
+2 3 1 1 2.033189056518945748e+01
+2 4 1 1 2.050962487553420388e+01
+2 5 1 1 4.110770448574061220e+02
+2 6 1 1 1.497213888639202750e+01
+2 7 1 1 3.310306905083069751e+02
+2 8 1 1 3.356160917931259746e+02
+*** END ***
+*** REQUEST ***
+""
+10
+8
+5 1 1 1 1 1 1 1
+0.26214400000000000000e6 0.26214400000000000000e6 -0.52428800000000000000e6 -0.52428800000000000000e6 0.0 -0.52428800000000000000e6 0.10485760000000000000e7 0.0 0.26214400000000000000e6 0.52428800000000000000e6
+0 1 3 3 0.10485760000000000000e7
+0 1 4 4 -0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+1 1 3 3 0.10485760000000000000e7
+1 1 4 4 -0.52428800000000000000e6
+2 1 1 1 0.52428800000000000000e6
+2 1 3 3 -0.10485760000000000000e7
+2 1 4 4 0.52428800000000000000e6
+2 2 1 1 0.52428800000000000000e6
+3 1 1 2 0.52428800000000000000e6
+3 4 1 1 -0.10485760000000000000e7
+4 1 1 3 0.52428800000000000000e6
+4 6 1 1 -0.10485760000000000000e7
+5 1 2 2 0.52428800000000000000e6
+5 1 4 4 -0.52428800000000000000e6
+6 1 2 3 0.52428800000000000000e6
+6 8 1 1 -0.10485760000000000000e7
+7 1 2 4 0.52428800000000000000e6
+7 4 1 1 0.10485760000000000000e7
+7 5 1 1 0.10485760000000000000e7
+8 1 3 3 -0.52428800000000000000e6
+8 1 5 5 0.52428800000000000000e6
+9 1 1 4 0.26214400000000000000e6
+9 1 3 3 0.10485760000000000000e7
+9 1 4 4 -0.52428800000000000000e6
+9 2 1 1 -0.52428800000000000000e6
+9 3 1 1 0.52428800000000000000e6
+10 1 3 4 0.26214400000000000000e6
+10 6 1 1 0.52428800000000000000e6
+10 7 1 1 0.52428800000000000000e6
+*** ANSWER ***
+1.000000001261144300e+00 1.273327614775283784e-09 -6.072847097869460078e-12 -8.374957741020938299e-12 -2.982374356006742620e-14 -2.692657132842880265e-14 5.016088016331483008e-15 -1.025952210899453636e-14 1.222344619435513675e-11 5.568582828826051022e-14
+1 1 1 1 6.676808650149701659e-04
+1 1 1 2 -3.183920859247783485e-06
+1 1 1 3 -4.390889844124385699e-06
+1 1 1 4 3.204303079173032967e-06
+1 1 2 2 7.484028880241731280e-08
+1 1 2 3 -1.411727822863928009e-08
+1 1 2 4 2.629874753906400563e-09
+1 1 3 3 1.578045307154488588e-07
+1 1 3 4 1.459770577079776319e-08
+1 1 4 4 7.508302482439042558e-08
+1 1 5 5 8.509757533855760549e-08
+1 2 1 1 5.242880006612623110e+05
+1 3 1 1 6.499082678012104325e-06
+1 4 1 1 6.463577987669431442e-06
+1 5 1 1 9.573626917384995306e-08
+1 6 1 1 8.901451619456421342e-06
+1 7 1 1 1.196719312076330034e-07
+1 8 1 1 1.187110761233159876e-07
+2 1 1 1 1.000000000222549090e+00
+2 1 1 2 2.000967842537094654e+01
+2 1 1 3 1.447218061045755100e+01
+2 1 1 4 -2.033194502945362103e+01
+2 1 2 2 9.557347238786567232e+02
+2 1 2 3 3.351188109512282267e+02
+2 1 2 4 -4.305891753700159370e+02
+2 1 3 3 4.781173619402901522e+02
+2 1 3 4 -3.450056509087434051e+02
+2 1 4 4 9.557347238778331757e+02
+2 1 5 5 4.781173619399913832e+02
+2 2 1 1 1.177924873948692789e-10
+2 3 1 1 2.033194502676432691e+01
+2 4 1 1 2.050967842536974217e+01
+2 5 1 1 4.110794969446048412e+02
+2 6 1 1 1.497218061045077064e+01
+2 7 1 1 3.310334702982946737e+02
+2 8 1 1 3.356188109513807376e+02
+*** END ***
+*** REQUEST ***
+""
+13
+11
+5 1 1 1 1 1 1 1 1 1 1
+0.15728640000000000000e7 -0.10485760000000000000e7 -0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.0 0.10485760000000000000e7 0.10485760000000000000e7 0.0 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7
+0 1 1 1 0.52428800000000000000e6
+1 1 4 4 0.10485760000000000000e7
+1 6 1 1 0.52428800000000000000e6
+2 1 1 2 0.52428800000000000000e6
+2 1 2 3 -0.52428800000000000000e6
+2 4 1 1 -0.10485760000000000000e7
+3 1 1 4 0.52428800000000000000e6
+3 8 1 1 -0.10485760000000000000e7
+4 1 2 2 0.52428800000000000000e6
+4 6 1 1 0.52428800000000000000e6
+5 1 2 4 0.52428800000000000000e6
+5 9 1 1 0.10485760000000000000e7
+6 1 3 3 0.52428800000000000000e6
+6 6 1 1 0.52428800000000000000e6
+7 1 4 4 -0.52428800000000000000e6
+7 1 5 5 0.52428800000000000000e6
+8 1 2 3 0.26214400000000000000e6
+8 2 1 1 0.52428800000000000000e6
+8 4 1 1 0.52428800000000000000e6
+9 1 1 1 0.52428800000000000000e6
+9 1 1 3 -0.26214400000000000000e6
+9 3 1 1 0.52428800000000000000e6
+10 1 2 3 -0.26214400000000000000e6
+10 4 1 1 -0.52428800000000000000e6
+10 5 1 1 0.52428800000000000000e6
+11 4 1 1 0.52428800000000000000e6
+11 7 1 1 0.52428800000000000000e6
+12 1 3 4 -0.26214400000000000000e6
+12 8 1 1 0.52428800000000000000e6
+12 10 1 1 0.52428800000000000000e6
+13 9 1 1 0.52428800000000000000e6
+13 11 1 1 0.52428800000000000000e6
+*** ANSWER ***
+1.402060991199688664e-09 -2.483883181138067524e-24 1.604502441709942906e-09 1.343505189877832168e-09 -4.530249279552842563e-24 1.170820376345740321e+00 1.856673489285015473e-09 3.064714009346125858e-09 1.447213615473736281e+00 3.064714009346132476e-09 3.064714009346106420e-09 5.528147447133072850e-09 3.064714009346072092e-09
+1 1 1 1 2.344687320294941310e+05
+1 1 1 2 -1.302270145272515146e-18
+1 1 1 3 -3.793783660147471237e+05
+1 1 1 4 8.412213761592225465e-04
+1 1 2 2 7.043836489906688718e-04
+1 1 2 3 -4.820193173964119005e-19
+1 1 2 4 -2.375155334278200722e-18
+1 1 3 3 6.138470734735555016e+05
+1 1 3 4 -1.449170684381252249e-03
+1 1 4 4 4.967358755579375602e-04
+1 1 5 5 9.734316303502621925e-04
+1 2 1 1 1.606792778532061634e-03
+1 3 1 1 7.587567320294942474e+05
+1 4 1 1 1.606792778532052310e-03
+1 5 1 1 1.606792778532065103e-03
+1 6 1 1 6.138470749130228069e+05
+1 7 1 1 1.606792778532051442e-03
+1 8 1 1 1.215898616444049864e-03
+1 9 1 1 1.606792778532033445e-03
+1 10 1 1 2.898341368762504498e-03
+1 11 1 1 1.606792778532033445e-03
+2 1 1 1 5.236067957167052533e+00
+2 1 1 2 -2.555060659457679553e-16
+2 1 1 3 3.236067961245047364e+00
+2 1 1 4 5.453178578751086691e-01
+2 1 2 2 1.999999992131747950e+00
+2 1 2 3 -1.580083499575556142e-16
+2 1 2 4 9.662184348129220661e-16
+2 1 3 3 1.999999992131747506e+00
+2 1 3 4 3.370956483817711957e-01
+2 1 4 4 1.499999996065872976e+00
+2 1 5 5 1.499999996065873420e+00
+2 2 1 1 1.000000000000000222e+00
+2 3 1 1 4.077995024035551088e-09
+2 4 1 1 9.999999999999997780e-01
+2 5 1 1 9.999999999999997780e-01
+2 6 1 1 7.868252170913466661e-09
+2 7 1 1 9.999999999999995559e-01
+2 8 1 1 1.545317857875109002e+00
+2 9 1 1 9.999999999999988898e-01
+2 10 1 1 7.917777905066630817e-01
+2 11 1 1 1.000000000000000444e+00
+*** END ***
+*** REQUEST ***
+""
+10
+8
+5 1 1 1 1 1 1 1
+0.26214400000000000000e6 0.78643200000000000000e6 -0.52428800000000000000e6 -0.52428800000000000000e6 0.0 -0.52428800000000000000e6 -0.10485760000000000000e7 0.0 -0.26214400000000000000e6 0.52428800000000000000e6
+0 1 3 3 -0.10485760000000000000e7
+0 1 4 4 0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+1 1 3 3 0.10485760000000000000e7
+1 1 4 4 -0.52428800000000000000e6
+2 1 1 1 0.52428800000000000000e6
+2 1 3 3 0.10485760000000000000e7
+2 1 4 4 -0.52428800000000000000e6
+2 2 1 1 0.52428800000000000000e6
+3 1 1 2 0.52428800000000000000e6
+3 4 1 1 -0.10485760000000000000e7
+4 1 1 3 0.52428800000000000000e6
+4 6 1 1 -0.10485760000000000000e7
+5 1 2 2 0.52428800000000000000e6
+5 1 4 4 -0.52428800000000000000e6
+6 1 2 3 0.52428800000000000000e6
+6 8 1 1 -0.10485760000000000000e7
+7 1 2 4 0.52428800000000000000e6
+7 4 1 1 -0.10485760000000000000e7
+7 5 1 1 -0.10485760000000000000e7
+8 1 3 3 -0.52428800000000000000e6
+8 1 5 5 0.52428800000000000000e6
+9 1 1 4 -0.26214400000000000000e6
+9 1 3 3 -0.10485760000000000000e7
+9 1 4 4 0.52428800000000000000e6
+9 2 1 1 -0.52428800000000000000e6
+9 3 1 1 0.52428800000000000000e6
+10 1 3 4 -0.26214400000000000000e6
+10 6 1 1 0.52428800000000000000e6
+10 7 1 1 0.52428800000000000000e6
+*** ANSWER ***
+-1.000000001255223259e+00 1.267468020168873510e-09 -6.044810283915911358e-12 -8.336279969166351627e-12 -2.966149009571424797e-14 -2.678696495272935225e-14 -4.981786850069985191e-15 -1.021178361537661619e-14 1.216694793804843487e-11 5.539710179627446917e-14
+1 1 1 1 6.646083160734969283e-04
+1 1 1 2 -3.169221494133705334e-06
+1 1 1 3 -4.370611552474288162e-06
+1 1 1 4 -3.189492400271768912e-06
+1 1 2 2 7.449155187929873714e-08
+1 1 2 3 -1.404408428113656663e-08
+1 1 2 4 -2.611891064049492396e-09
+1 1 3 3 1.570685861430560518e-07
+1 1 3 4 -1.452201785328257445e-08
+1 1 4 4 7.473295434804560324e-08
+1 1 5 5 8.468879959046224407e-08
+1 2 1 1 5.242880006582194474e+05
+1 3 1 1 6.469027515742138283e-06
+1 4 1 1 6.433709485594102465e-06
+1 5 1 1 9.526649732669977774e-08
+1 6 1 1 8.860309855853731672e-06
+1 7 1 1 1.190867509051651949e-07
+1 8 1 1 1.181308837608739998e-07
+2 1 1 1 1.000000000911399178e+00
+2 1 1 2 2.000549604416913496e+01
+2 1 1 3 1.446889040856889785e+01
+2 1 1 4 2.032659590972294694e+01
+2 1 2 2 9.554868020844579632e+02
+2 1 2 3 3.350487258132128545e+02
+2 1 2 4 4.304611304997952175e+02
+2 1 3 3 4.779934010415836383e+02
+2 1 3 4 3.449001113990725571e+02
+2 1 4 4 9.554868020823060988e+02
+2 1 5 5 4.779934010409390908e+02
+2 2 1 1 1.173652503640146472e-10
+2 3 1 1 2.032659590704920660e+01
+2 4 1 1 2.050549604416661609e+01
+2 5 1 1 4.109556344558071146e+02
+2 6 1 1 1.496889040855243636e+01
+2 7 1 1 3.309312209905145323e+02
+2 8 1 1 3.355487258131824433e+02
+*** END ***
+*** REQUEST ***
+""
+10
+8
+5 1 1 1 1 1 1 1
+0.26214400000000000000e6 0.26214400000000000000e6 -0.52428800000000000000e6 -0.52428800000000000000e6 0.0 -0.52428800000000000000e6 -0.10485760000000000000e7 0.0 0.26214400000000000000e6 0.52428800000000000000e6
+0 1 3 3 0.10485760000000000000e7
+0 1 4 4 -0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+1 1 3 3 0.10485760000000000000e7
+1 1 4 4 -0.52428800000000000000e6
+2 1 1 1 0.52428800000000000000e6
+2 1 3 3 -0.10485760000000000000e7
+2 1 4 4 0.52428800000000000000e6
+2 2 1 1 0.52428800000000000000e6
+3 1 1 2 0.52428800000000000000e6
+3 4 1 1 -0.10485760000000000000e7
+4 1 1 3 0.52428800000000000000e6
+4 6 1 1 -0.10485760000000000000e7
+5 1 2 2 0.52428800000000000000e6
+5 1 4 4 -0.52428800000000000000e6
+6 1 2 3 0.52428800000000000000e6
+6 8 1 1 -0.10485760000000000000e7
+7 1 2 4 0.52428800000000000000e6
+7 4 1 1 -0.10485760000000000000e7
+7 5 1 1 -0.10485760000000000000e7
+8 1 3 3 -0.52428800000000000000e6
+8 1 5 5 0.52428800000000000000e6
+9 1 1 4 -0.26214400000000000000e6
+9 1 3 3 0.10485760000000000000e7
+9 1 4 4 -0.52428800000000000000e6
+9 2 1 1 -0.52428800000000000000e6
+9 3 1 1 0.52428800000000000000e6
+10 1 3 4 -0.26214400000000000000e6
+10 6 1 1 0.52428800000000000000e6
+10 7 1 1 0.52428800000000000000e6
+*** ANSWER ***
+1.000000001255168192e+00 1.267293763581419573e-09 -6.044105779378328542e-12 -8.335319418073156169e-12 -2.963781190224006830e-14 -2.679132962591727316e-14 -4.985908279021202008e-15 -1.019181010909363138e-14 1.216554667291012868e-11 5.540629928084288642e-14
+1 1 1 1 6.645169428966527696e-04
+1 1 1 2 -3.168852130858705115e-06
+1 1 1 3 -4.370107947062738902e-06
+1 1 1 4 -3.189125067023352774e-06
+1 1 2 2 7.449142695091282828e-08
+1 1 2 3 -1.404637262691291531e-08
+1 1 2 4 -2.614051879791467958e-09
+1 1 3 3 1.570682662591977723e-07
+1 1 3 4 -1.452442891867727762e-08
+1 1 4 4 7.473300759368737514e-08
+1 1 5 5 8.468673233903780460e-08
+1 2 1 1 5.242880006581288762e+05
+1 3 1 1 6.468280310124216867e-06
+1 4 1 1 6.432962541554478388e-06
+1 5 1 1 9.525827983709759290e-08
+1 6 1 1 8.859294928040332590e-06
+1 7 1 1 1.190790339148690542e-07
+1 8 1 1 1.181229213313399491e-07
+2 1 1 1 9.999999982950379396e-01
+2 1 1 2 2.000547863553214967e+01
+2 1 1 3 1.446887684143138486e+01
+2 1 1 4 2.032657820528472570e+01
+2 1 2 2 9.554827697322816675e+02
+2 1 2 3 3.350478457791923574e+02
+2 1 2 4 4.304603230330404244e+02
+2 1 3 3 4.779913848659312521e+02
+2 1 3 4 3.448991980958476233e+02
+2 1 4 4 9.554827697345083379e+02
+2 1 5 5 4.779913848655970696e+02
+2 2 1 1 1.173653297509985344e-10
+2 3 1 1 2.032657820476820731e+01
+2 4 1 1 2.050547863553248362e+01
+2 5 1 1 4.109548443971845586e+02
+2 6 1 1 1.496887684146408048e+01
+2 7 1 1 3.309303212543836707e+02
+2 8 1 1 3.355478457795697977e+02
+*** END ***
+*** REQUEST ***
+""
+1
+4
+1 1 1 1
+0.10485760000000000000e7
+0 1 1 1 0.52428800000000000000e6
+1 1 1 1 0.10485760000000000000e7
+1 2 1 1 0.52428800000000000000e6
+1 3 1 1 0.52428800000000000000e6
+*** ANSWER ***
+5.000000014551048144e-01
+1 1 1 1 1.544610222759798968e-03
+1 2 1 1 2.621440007802954642e+05
+1 3 1 1 2.621440007802954642e+05
+1 4 1 1 1.740143951048130479e-05
+2 1 1 1 9.999999999999995559e-01
+2 2 1 1 5.202230325434514910e-16
+2 3 1 1 5.202230325434514910e-16
+2 4 1 1 4.287886701374642229e+01
+*** END ***
+*** REQUEST ***
+""
+1
+4
+1 1 1 1
+0.15728640000000000000e7
+0 1 1 1 0.10485760000000000000e7
+1 1 1 1 0.10485760000000000000e7
+1 2 1 1 0.52428800000000000000e6
+1 3 1 1 0.10485760000000000000e7
+1 4 1 1 -0.10485760000000000000e7
+*** ANSWER ***
+Infeasible
+*** END ***
+*** REQUEST ***
+""
+7
+7
+3 1 1 1 1 1 1
+0.10485760000000000000e7 0.52428800000000000000e6 0.26214400000000000000e6 0.10485760000000000000e7 0.13107200000000000000e7 0.52428800000000000000e6 0.52428800000000000000e6
+0 1 1 1 0.10485760000000000000e7
+1 1 2 3 0.52428800000000000000e6
+1 2 1 1 0.52428800000000000000e6
+1 4 1 1 0.52428800000000000000e6
+1 6 1 1 0.10485760000000000000e7
+2 1 1 2 -0.10485760000000000000e7
+2 1 1 3 0.10485760000000000000e7
+2 2 1 1 0.10485760000000000000e7
+3 1 2 2 0.10485760000000000000e7
+3 1 2 3 -0.52428800000000000000e6
+3 6 1 1 -0.52428800000000000000e6
+4 1 2 3 -0.52428800000000000000e6
+4 1 3 3 0.10485760000000000000e7
+4 2 1 1 0.52428800000000000000e6
+4 4 1 1 0.52428800000000000000e6
+5 1 1 1 0.10485760000000000000e7
+5 1 1 2 -0.52428800000000000000e6
+5 2 1 1 0.52428800000000000000e6
+5 3 1 1 0.10485760000000000000e7
+6 1 1 2 -0.52428800000000000000e6
+6 5 1 1 0.10485760000000000000e7
+7 1 1 2 0.52428800000000000000e6
+7 1 2 3 -0.52428800000000000000e6
+7 7 1 1 0.10485760000000000000e7
+*** ANSWER ***
+1.000000000705873582e+00 -2.045960686369595755e-10 7.924832100231817025e-10 3.022200793306051867e-10 1.000000000541151124e+00 2.587418279244411078e-10 9.999999995005985909e-01
+1 1 1 1 5.674380923163807470e-04
+1 1 1 2 -4.666699145296535718e-04
+1 1 1 3 -2.145345272670685238e-04
+1 1 2 2 8.309788744332677769e-04
+1 1 2 3 5.797144830422352796e-05
+1 1 3 3 3.169007219041686642e-04
+1 2 1 1 1.048576000597716076e+06
+1 3 1 1 1.048576000567438081e+06
+1 4 1 1 5.242880005285314983e+05
+1 5 1 1 2.713104709576987590e-04
+1 6 1 1 1.048576000324672787e+06
+1 7 1 1 1.048575999476339668e+06
+2 1 1 1 2.749999998446686966e+00
+2 1 1 2 1.499999998968473358e+00
+2 1 1 3 1.749999998806539114e+00
+2 1 2 2 1.249999999370027703e+00
+2 1 2 3 9.999999992261674464e-01
+2 1 3 3 1.999999998740054519e+00
+2 2 1 1 3.238682098779669515e-10
+2 3 1 1 3.598521421425696570e-10
+2 4 1 1 6.483565585491693585e-10
+2 5 1 1 1.999999998968473802e+00
+2 6 1 1 2.877200339276443111e-10
+2 7 1 1 2.576940442501448964e-10
+*** END ***
+*** REQUEST ***
+""
+1
+4
+1 1 1 1
+-0.10485760000000000000e7
+0 1 1 1 0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 2 1 1 -0.52428800000000000000e6
+1 3 1 1 0.52428800000000000000e6
+1 4 1 1 -0.10485760000000000000e7
+*** ANSWER ***
+Infeasible
+*** END ***
+*** REQUEST ***
+""
+7
+7
+3 1 1 1 1 1 1
+-0.15728640000000000000e7 0.52428800000000000000e6 -0.52428800000000000000e6 0.78643200000000000000e6 0.10485760000000000000e7 0.78643200000000000000e6 0.26214400000000000000e6
+0 1 1 1 0.10485760000000000000e7
+1 1 2 3 -0.52428800000000000000e6
+1 2 1 1 -0.10485760000000000000e7
+1 4 1 1 -0.10485760000000000000e7
+1 6 1 1 -0.10485760000000000000e7
+2 1 1 2 -0.52428800000000000000e6
+2 1 1 3 0.10485760000000000000e7
+2 2 1 1 0.10485760000000000000e7
+3 1 2 2 0.10485760000000000000e7
+3 1 2 3 -0.10485760000000000000e7
+3 2 1 1 -0.10485760000000000000e7
+3 4 1 1 -0.10485760000000000000e7
+4 1 2 3 -0.26214400000000000000e6
+4 1 3 3 0.10485760000000000000e7
+4 6 1 1 0.52428800000000000000e6
+5 1 1 1 0.10485760000000000000e7
+5 1 1 2 -0.52428800000000000000e6
+5 3 1 1 0.10485760000000000000e7
+6 1 1 2 -0.26214400000000000000e6
+6 2 1 1 0.52428800000000000000e6
+6 5 1 1 0.10485760000000000000e7
+7 1 1 2 0.26214400000000000000e6
+7 1 2 3 -0.52428800000000000000e6
+7 2 1 1 -0.52428800000000000000e6
+7 7 1 1 0.10485760000000000000e7
+*** ANSWER ***
+-2.122682931605306855e+00 7.752799720276692952e-02 1.165860635762879349e+00 9.815257583734828678e-03 1.612372277731500825e+00 9.994238642109199466e-10 8.079226242726201418e-09
+1 1 1 1 6.421188734945860924e+05
+1 1 1 2 -8.859944334888096200e+05
+1 1 1 3 8.129399719488853589e+04
+1 1 2 2 1.222493482005696977e+06
+1 1 2 3 -1.121693082800859265e+05
+1 1 3 3 1.029204353612233172e+04
+1 2 1 1 1.084594889168302296e+06
+1 3 1 1 1.690694873494586209e+06
+1 4 1 1 1.003300895685269032e+06
+1 5 1 1 1.047971877838829594e-03
+1 6 1 1 2.230940399459027220e+06
+1 7 1 1 8.471682736692869378e-03
+2 1 1 1 4.259591788484874186e+00
+2 1 1 2 3.259591789052942890e+00
+2 1 1 3 1.879795894064171691e+00
+2 1 2 2 2.499999996290436233e+00
+2 1 2 3 1.499999996792355184e+00
+2 1 3 3 1.499999998145202795e+00
+2 2 1 1 9.245035287456098323e-10
+2 3 1 1 5.680374703195812657e-10
+2 4 1 1 1.781200139772412850e-09
+2 5 1 1 2.379795894064223649e+00
+2 6 1 1 5.019469081845273553e-10
+2 7 1 1 1.202041027281383762e-01
+*** END ***
+*** REQUEST ***
+""
+1
+4
+1 1 1 1
+0.15728640000000000000e7
+0 1 1 1 0.52428800000000000000e6
+1 1 1 1 0.10485760000000000000e7
+1 2 1 1 0.52428800000000000000e6
+1 3 1 1 0.52428800000000000000e6
+1 4 1 1 -0.52428800000000000000e6
+*** ANSWER ***
+Infeasible
+*** END ***
+*** REQUEST ***
+""
+7
+7
+3 1 1 1 1 1 1
+0.10485760000000000000e7 0.10485760000000000000e7 0.78643200000000000000e6 0.52428800000000000000e6 -0.52428800000000000000e6 0.78643200000000000000e6 -0.26214400000000000000e6
+0 1 1 2 -0.39321600000000000000e6
+0 1 2 3 -0.13107200000000000000e6
+0 2 1 1 -0.78643200000000000000e6
+0 4 1 1 -0.26214400000000000000e6
+0 6 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 1 1 2 0.39321600000000000000e6
+1 1 2 3 0.13107200000000000000e6
+1 2 1 1 0.78643200000000000000e6
+1 4 1 1 0.26214400000000000000e6
+1 6 1 1 0.52428800000000000000e6
+2 1 1 2 0.26214400000000000000e6
+2 1 1 3 0.52428800000000000000e6
+2 1 2 3 0.26214400000000000000e6
+2 2 1 1 0.52428800000000000000e6
+2 4 1 1 0.52428800000000000000e6
+2 6 1 1 0.10485760000000000000e7
+3 1 1 2 0.26214400000000000000e6
+3 1 2 2 0.52428800000000000000e6
+3 1 2 3 -0.26214400000000000000e6
+3 2 1 1 0.52428800000000000000e6
+3 4 1 1 0.52428800000000000000e6
+4 1 1 2 0.13107200000000000000e6
+4 1 2 3 -0.13107200000000000000e6
+4 1 3 3 0.52428800000000000000e6
+4 2 1 1 0.26214400000000000000e6
+4 4 1 1 0.26214400000000000000e6
+5 1 1 2 -0.65536000000000000000e6
+5 1 2 3 -0.13107200000000000000e6
+5 2 1 1 -0.78643200000000000000e6
+5 3 1 1 0.52428800000000000000e6
+5 4 1 1 -0.26214400000000000000e6
+5 6 1 1 -0.52428800000000000000e6
+6 1 1 2 0.13107200000000000000e6
+6 1 2 3 0.13107200000000000000e6
+6 2 1 1 0.26214400000000000000e6
+6 4 1 1 0.26214400000000000000e6
+6 5 1 1 0.52428800000000000000e6
+6 6 1 1 0.52428800000000000000e6
+7 1 1 2 -0.13107200000000000000e6
+7 1 2 3 -0.39321600000000000000e6
+7 2 1 1 -0.26214400000000000000e6
+7 4 1 1 -0.26214400000000000000e6
+7 6 1 1 -0.52428800000000000000e6
+7 7 1 1 0.52428800000000000000e6
+*** ANSWER ***
+5.903058981601223648e-10 -2.184572009349524755e-10 1.973300667196124216e-10 5.096774878147903724e-10 5.714285719996095025e-01 2.322382768664171276e-10 1.428571425918901405e-01
+1 1 1 1 3.094902987345742344e-04
+1 1 1 2 -1.564451036551416774e-05
+1 1 1 3 -1.145344889637843635e-04
+1 1 2 2 1.034577860202921573e-04
+1 1 2 3 -3.853356493497662549e-05
+1 1 3 3 2.672177907314408148e-04
+1 2 1 1 2.995931431252422626e+05
+1 3 1 1 2.995931431565312669e+05
+1 4 1 1 7.489828597228313447e+04
+1 5 1 1 1.217597417017401030e-04
+1 6 1 1 1.497965714704329439e+05
+1 7 1 1 7.489828557521689800e+04
+2 1 1 1 1.357142856178165102e+00
+2 1 1 2 3.571428564608609690e-01
+2 1 1 3 7.142857129259727600e-01
+2 1 2 2 1.357142854846152158e+00
+2 1 2 3 2.142857139726029037e-01
+2 1 3 3 9.285714274230765231e-01
+2 2 1 1 2.869472882751067396e-10
+2 3 1 1 2.826951072248493682e-10
+2 4 1 1 2.378641678314248517e-09
+2 5 1 1 1.214285712925973204e+00
+2 6 1 1 5.245009816462727640e-10
+2 7 1 1 1.046630460345233254e-09
+*** END ***
+*** REQUEST ***
+""
+5
+5
+3 1 1 1 1
+0.10485760000000000000e7 -0.10485760000000000000e7 -0.52428800000000000000e6 0.0 0.10485760000000000000e7
+0 2 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 2 1 1 0.52428800000000000000e6
+2 1 1 2 0.52428800000000000000e6
+2 4 1 1 -0.10485760000000000000e7
+3 1 2 2 -0.10485760000000000000e7
+3 1 3 3 0.52428800000000000000e6
+4 1 1 3 -0.26214400000000000000e6
+4 2 1 1 -0.52428800000000000000e6
+4 3 1 1 0.52428800000000000000e6
+5 1 2 3 -0.26214400000000000000e6
+5 4 1 1 0.52428800000000000000e6
+5 5 1 1 0.52428800000000000000e6
+*** ANSWER ***
+1.506710087973945430e-15 -1.502730211901189099e-17 -9.706111672358592842e-20 2.145065614622134004e-17 2.059684481769621228e-19
+1 1 1 1 7.901533611063818646e-10
+1 1 1 2 -7.878634173372506303e-12
+1 1 1 3 -5.623160804795046962e-12
+1 1 2 2 3.051184602274949299e-13
+1 1 2 3 -5.399339287890155872e-14
+1 1 3 3 1.524545239331687038e-13
+1 2 1 1 5.242880000000008149e+05
+1 3 1 1 1.144966411228804734e-11
+1 4 1 1 1.606859763520075239e-11
+1 5 1 1 3.113292884557458962e-13
+2 1 1 1 1.999999999999999334e+00
+2 1 1 2 1.920412171343920349e+01
+2 1 1 3 2.772488039363634726e+01
+2 1 2 2 4.974516755779263235e+02
+2 1 2 3 3.423236123876088755e+02
+2 1 3 3 9.939033511558531018e+02
+2 2 1 1 2.414464203176402792e-16
+2 3 1 1 2.772488039363634726e+01
+2 4 1 1 2.020412171343918573e+01
+2 5 1 1 3.241194906741699242e+02
+*** END ***
+*** REQUEST ***
+""
+1
+2
+2 1
+0.10485760000000000000e7
+0 1 1 2 -0.39321600000000000000e6
+0 1 2 2 -0.10485760000000000000e7
+0 2 1 1 -0.26214400000000000000e6
+1 1 1 1 0.78643200000000000000e6
+1 1 1 2 0.39321600000000000000e6
+1 1 2 2 0.10485760000000000000e7
+1 2 1 1 0.26214400000000000000e6
+*** ANSWER ***
+2.307692307692307543e-01
+1 1 1 1 1.814843076923076878e+05
+1 1 1 2 4.839581538461538148e+05
+1 1 2 2 1.290555076923076995e+06
+1 2 1 1 3.226387692307692487e+05
+2 1 1 1 1.641025640075068459e+00
+2 1 1 2 -6.154038509302057758e-01
+2 1 2 2 2.307836578517253046e-01
+2 2 1 1 1.158509909295606053e-09
+*** END ***
+*** REQUEST ***
+""
+1
+2
+5 1
+0.15728640000000000000e7
+0 1 2 2 -0.52428800000000000000e6
+0 1 3 4 0.10485760000000000000e7
+0 2 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 1 2 2 0.52428800000000000000e6
+1 1 3 4 -0.10485760000000000000e7
+1 2 1 1 0.52428800000000000000e6
+*** ANSWER ***
+Infeasible
+*** END ***
+*** REQUEST ***
+""
+70
+2
+15 5
+0.0 0.0 0.13107200000000000000e6 0.0 0.0 0.39321600000000000000e6 -0.26214400000000000000e6 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.39321600000000000000e6 0.0 0.0 0.0 0.0 0.0 -0.26214400000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.13107200000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.26214400000000000000e6 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.13107200000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.39321600000000000000e6 0.0 0.0 0.13107200000000000000e6 0.13107200000000000000e6 0.0 0.0 -0.10485760000000000000e7 0.0
+0 1 2 2 -0.13107200000000000000e6
+0 1 4 7 0.26214400000000000000e6
+0 2 1 1 -0.13107200000000000000e6
+1 1 4 11 -0.65536000000000000000e5
+1 1 11 12 -0.65536000000000000000e5
+1 1 14 15 -0.65536000000000000000e5
+2 1 4 7 -0.65536000000000000000e5
+2 1 8 11 -0.65536000000000000000e5
+2 1 10 15 -0.65536000000000000000e5
+3 1 2 13 -0.65536000000000000000e5
+3 1 3 6 0.65536000000000000000e5
+3 1 6 9 -0.26214400000000000000e6
+3 1 13 14 -0.65536000000000000000e5
+3 2 3 3 0.13107200000000000000e6
+4 1 1 5 -0.65536000000000000000e5
+4 1 3 11 -0.65536000000000000000e5
+4 1 8 15 -0.65536000000000000000e5
+5 1 1 4 -0.65536000000000000000e5
+5 1 1 12 -0.65536000000000000000e5
+5 1 11 14 -0.65536000000000000000e5
+6 1 1 1 0.13107200000000000000e6
+6 1 2 2 0.13107200000000000000e6
+6 1 4 7 -0.26214400000000000000e6
+6 2 1 1 0.13107200000000000000e6
+7 1 1 3 0.13107200000000000000e6
+7 1 2 2 -0.26214400000000000000e6
+8 1 1 6 0.13107200000000000000e6
+8 1 3 6 0.13107200000000000000e6
+8 1 6 9 -0.52428800000000000000e6
+8 2 3 3 0.26214400000000000000e6
+9 1 1 7 0.13107200000000000000e6
+9 1 3 7 0.13107200000000000000e6
+9 1 7 9 -0.52428800000000000000e6
+9 2 1 4 0.13107200000000000000e6
+10 1 1 9 0.13107200000000000000e6
+10 1 4 7 -0.13107200000000000000e6
+11 1 1 10 0.13107200000000000000e6
+11 1 3 10 0.13107200000000000000e6
+11 1 9 10 -0.52428800000000000000e6
+11 2 4 4 0.26214400000000000000e6
+12 1 1 11 0.13107200000000000000e6
+12 1 3 11 0.13107200000000000000e6
+12 1 9 11 -0.52428800000000000000e6
+12 2 1 5 0.13107200000000000000e6
+13 1 1 13 0.13107200000000000000e6
+13 1 4 11 -0.13107200000000000000e6
+14 1 1 15 0.13107200000000000000e6
+14 1 12 12 0.26214400000000000000e6
+14 1 13 14 -0.52428800000000000000e6
+14 2 5 5 0.26214400000000000000e6
+15 1 1 5 -0.13107200000000000000e6
+15 1 2 4 0.13107200000000000000e6
+16 1 2 6 0.13107200000000000000e6
+16 1 4 5 -0.13107200000000000000e6
+17 1 1 8 -0.13107200000000000000e6
+17 1 2 7 0.13107200000000000000e6
+18 1 2 8 0.13107200000000000000e6
+18 1 3 7 -0.13107200000000000000e6
+19 1 2 10 0.13107200000000000000e6
+19 1 7 8 -0.13107200000000000000e6
+20 1 1 12 -0.13107200000000000000e6
+20 1 2 11 0.13107200000000000000e6
+21 1 2 12 0.13107200000000000000e6
+21 1 3 11 -0.13107200000000000000e6
+22 1 2 14 0.13107200000000000000e6
+22 1 8 11 -0.13107200000000000000e6
+23 1 2 15 0.13107200000000000000e6
+23 1 11 12 -0.13107200000000000000e6
+24 1 2 2 0.13107200000000000000e6
+24 1 3 3 0.13107200000000000000e6
+24 1 5 8 -0.26214400000000000000e6
+24 2 2 2 0.13107200000000000000e6
+25 1 2 5 -0.13107200000000000000e6
+25 1 3 4 0.13107200000000000000e6
+26 1 1 5 0.13107200000000000000e6
+26 1 3 5 0.13107200000000000000e6
+26 1 5 9 -0.52428800000000000000e6
+26 2 2 3 0.13107200000000000000e6
+27 1 1 8 0.13107200000000000000e6
+27 1 3 8 0.13107200000000000000e6
+27 1 8 9 -0.52428800000000000000e6
+27 2 2 4 0.13107200000000000000e6
+28 1 3 9 0.13107200000000000000e6
+28 1 5 8 -0.13107200000000000000e6
+29 1 3 13 0.13107200000000000000e6
+29 1 5 12 -0.13107200000000000000e6
+30 1 3 15 0.13107200000000000000e6
+30 1 12 12 -0.26214400000000000000e6
+31 1 3 6 0.65536000000000000000e5
+31 1 4 4 0.13107200000000000000e6
+31 1 6 9 -0.26214400000000000000e6
+31 2 3 3 0.13107200000000000000e6
+32 1 2 9 -0.13107200000000000000e6
+32 1 4 8 0.13107200000000000000e6
+33 1 1 4 -0.32768000000000000000e5
+33 1 2 5 -0.32768000000000000000e5
+33 1 4 9 0.13107200000000000000e6
+33 2 1 3 -0.32768000000000000000e5
+34 1 4 10 0.13107200000000000000e6
+34 1 7 9 -0.13107200000000000000e6
+35 1 2 13 -0.13107200000000000000e6
+35 1 4 12 0.13107200000000000000e6
+36 1 4 14 0.13107200000000000000e6
+36 1 9 11 -0.13107200000000000000e6
+37 1 3 6 -0.65536000000000000000e5
+37 1 5 5 0.13107200000000000000e6
+38 1 2 9 -0.13107200000000000000e6
+38 1 5 7 0.13107200000000000000e6
+39 1 5 10 0.13107200000000000000e6
+39 1 8 9 -0.13107200000000000000e6
+40 1 2 13 -0.13107200000000000000e6
+40 1 5 11 0.13107200000000000000e6
+41 1 5 14 0.13107200000000000000e6
+41 1 9 12 -0.13107200000000000000e6
+42 1 5 15 0.13107200000000000000e6
+42 1 12 13 -0.13107200000000000000e6
+43 1 1 4 -0.32768000000000000000e5
+43 1 2 5 -0.32768000000000000000e5
+43 1 6 7 0.13107200000000000000e6
+43 2 1 3 -0.32768000000000000000e5
+44 1 5 9 -0.13107200000000000000e6
+44 1 6 8 0.13107200000000000000e6
+45 1 6 10 0.13107200000000000000e6
+45 1 9 9 -0.26214400000000000000e6
+46 1 4 13 -0.13107200000000000000e6
+46 1 6 11 0.13107200000000000000e6
+47 1 5 13 -0.13107200000000000000e6
+47 1 6 12 0.13107200000000000000e6
+48 1 4 11 -0.32768000000000000000e5
+48 1 5 12 -0.32768000000000000000e5
+48 1 6 14 0.13107200000000000000e6
+48 2 3 5 -0.32768000000000000000e5
+49 1 3 10 0.65536000000000000000e5
+49 1 7 7 0.13107200000000000000e6
+49 1 9 10 -0.26214400000000000000e6
+49 2 4 4 0.13107200000000000000e6
+50 1 1 14 -0.13107200000000000000e6
+50 1 7 11 0.13107200000000000000e6
+51 1 7 12 0.13107200000000000000e6
+51 1 8 11 -0.13107200000000000000e6
+52 1 7 13 0.13107200000000000000e6
+52 1 9 11 -0.13107200000000000000e6
+53 1 7 15 0.13107200000000000000e6
+53 1 11 14 -0.13107200000000000000e6
+54 1 3 10 -0.65536000000000000000e5
+54 1 8 8 0.13107200000000000000e6
+55 1 3 14 -0.13107200000000000000e6
+55 1 8 12 0.13107200000000000000e6
+56 1 8 13 0.13107200000000000000e6
+56 1 9 12 -0.13107200000000000000e6
+57 1 8 14 0.13107200000000000000e6
+57 1 10 12 -0.13107200000000000000e6
+58 1 4 11 -0.32768000000000000000e5
+58 1 5 12 -0.32768000000000000000e5
+58 1 9 13 0.13107200000000000000e6
+58 2 3 5 -0.32768000000000000000e5
+59 1 9 14 0.13107200000000000000e6
+59 1 10 13 -0.13107200000000000000e6
+60 1 9 15 0.13107200000000000000e6
+60 1 13 14 -0.13107200000000000000e6
+61 1 7 14 -0.13107200000000000000e6
+61 1 10 11 0.13107200000000000000e6
+62 1 11 11 0.13107200000000000000e6
+62 1 12 12 0.13107200000000000000e6
+62 1 13 14 -0.26214400000000000000e6
+62 2 5 5 0.13107200000000000000e6
+63 1 4 15 -0.13107200000000000000e6
+63 1 11 13 0.13107200000000000000e6
+64 1 8 15 -0.13107200000000000000e6
+64 1 12 14 0.13107200000000000000e6
+65 1 6 15 -0.65536000000000000000e5
+65 1 13 13 0.13107200000000000000e6
+66 1 10 15 -0.65536000000000000000e5
+66 1 14 14 0.13107200000000000000e6
+67 1 1 2 0.13107200000000000000e6
+67 1 2 3 0.13107200000000000000e6
+67 1 2 9 -0.52428800000000000000e6
+67 2 1 2 0.13107200000000000000e6
+68 1 1 12 0.13107200000000000000e6
+68 1 3 12 0.13107200000000000000e6
+68 1 9 12 -0.52428800000000000000e6
+68 2 2 5 0.13107200000000000000e6
+69 1 4 7 0.13107200000000000000e6
+69 1 5 8 0.13107200000000000000e6
+69 1 9 9 -0.10485760000000000000e7
+69 2 3 4 0.13107200000000000000e6
+70 1 1 14 0.13107200000000000000e6
+70 1 3 14 0.13107200000000000000e6
+70 1 10 13 -0.52428800000000000000e6
+70 2 4 5 0.13107200000000000000e6
+*** ANSWER ***
+0.000000000000000000e+00 -4.000000008219539716e+00 -1.626696996759951048e-08 0.000000000000000000e+00 0.000000000000000000e+00 2.054105933263203857e-09 -2.195587655310348187e-11 -3.783448377923664089e-12 0.000000000000000000e+00 4.513413253962158409e-11 -1.935481745718091672e-11 0.000000000000000000e+00 0.000000000000000000e+00 1.833319471353512612e-12 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.000000004103052564e+00 0.000000000000000000e+00 4.398143443828900072e-13 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 -1.316380924635316969e-12 0.000000000000000000e+00 4.752055715176363872e-14 1.627502509157708936e-08 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 8.207549978738838012e-09 0.000000000000000000e+00 6.929780893380672635e-13 0.000000000000000000e+00 0.000000000000000000e+00 4.085917635979081295e-11 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.934025336806523434e-13 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.924568498974845068e-11 0.000000000000000000e+00 -7.298876377766578283e-12 0.000000000000000000e+00 0.000000000000000000e+00 4.087028406752592388e-13 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.125721992290935041e-13 0.000000000000000000e+00 4.178517676685460160e-09 0.000000000000000000e+00 0.000000000000000000e+00 4.869460006578796758e-13 4.000000008219695147e+00 0.000000000000000000e+00 0.000000000000000000e+00 -7.847447234584896039e-13 0.000000000000000000e+00
+1 1 1 1 2.693094200654143843e-04
+1 1 1 3 -2.877800651568379575e-06
+1 1 1 6 -4.959041457912104995e-07
+1 1 1 9 5.915821020233280269e-06
+1 1 1 10 -2.536874633747617116e-06
+1 1 1 15 2.402968497492476050e-07
+1 1 2 2 1.310720002751187421e+05
+1 1 2 13 -1.506334098048564745e-05
+1 1 2 14 2.621440005377953057e+05
+1 1 3 3 1.312945264867690162e-07
+1 1 3 6 -1.341855286130198525e-08
+1 1 3 9 -1.725406805538002658e-07
+1 1 3 10 8.345828374049271913e-09
+1 1 3 15 6.228614466995963654e-09
+1 1 4 4 2.133273735983931985e-03
+1 1 4 7 -5.806605775485331992e-06
+1 1 4 12 1.075779990813256976e-03
+1 1 5 5 1.644772048655347374e-07
+1 1 5 8 -4.561207133325963174e-08
+1 1 5 11 5.355493963830501435e-06
+1 1 6 6 7.364718073981517478e-08
+1 1 6 9 -1.279858368062302909e-07
+1 1 6 10 2.534965689459046395e-08
+1 1 6 15 -3.191249309911480243e-08
+1 1 7 7 5.217657603716123665e-06
+1 1 7 12 -9.566783245866209487e-07
+1 1 8 8 1.272166794728021118e-07
+1 1 8 11 1.837125504206683593e-06
+1 1 9 9 8.458123500958395838e-07
+1 1 9 10 -1.405223109621714912e-07
+1 1 9 15 5.407666329735574377e-08
+1 1 10 10 7.364718073981517478e-08
+1 1 10 15 -1.016221865139396774e-08
+1 1 11 11 5.477603160992565792e-04
+1 1 12 12 5.482284525698225431e-04
+1 1 13 13 1.374721669380450179e-07
+1 1 13 14 -3.031645810271878965e-05
+1 1 14 14 5.242880010774454568e+05
+1 1 15 15 7.364718073981517478e-08
+1 2 1 1 1.310720002693054848e+05
+1 2 2 2 1.312945264867690162e-07
+1 2 3 3 1.376400991429302938e-07
+1 2 3 4 -1.028580603931511494e-07
+1 2 4 4 1.439083362209010792e-07
+1 2 5 5 5.482409097987525799e-04
+2 1 1 1 6.999999934400971568e+00
+2 1 1 3 6.948424500534821391e+01
+2 1 1 6 2.311317680788180695e+01
+2 1 1 9 1.862106123529171597e+01
+2 1 1 10 1.030822840521553445e+02
+2 1 1 15 2.179200397295933289e+00
+2 1 2 2 7.048424500531612580e+01
+2 1 2 13 -4.622630088193899667e+01
+2 1 2 14 -3.524212954233729533e+01
+2 1 3 3 3.221950001658869951e+03
+2 1 3 6 2.033153754250909515e+03
+2 1 3 9 1.122335808120787078e+03
+2 1 3 10 1.948945524434609979e+03
+2 1 3 15 8.939733366530029457e+01
+2 1 4 4 2.411317683785500066e+01
+2 1 4 7 1.862106123534876900e+01
+2 1 4 12 -4.622630088193801612e+01
+2 1 5 5 2.034153754268944567e+03
+2 1 5 8 1.122335808122381877e+03
+2 1 5 11 -4.622630088196878262e+01
+2 1 6 6 4.905539490360964010e+03
+2 1 6 9 1.158446847249523898e+03
+2 1 6 10 7.384082765327642619e+02
+2 1 6 15 1.194321344941354710e+03
+2 1 7 7 1.040822840807773701e+02
+2 1 7 12 -3.524212954233689032e+01
+2 1 8 8 1.949945524436131336e+03
+2 1 8 11 -3.524212954233161810e+01
+2 1 9 9 7.394082765328795404e+02
+2 1 9 10 1.126521032411771102e+03
+2 1 9 15 2.311312411193178917e+01
+2 1 10 10 5.281651907860218671e+03
+2 1 10 15 1.662106830514752431e+01
+2 1 11 11 3.179200397186649596e+00
+2 1 12 12 9.039733366615116950e+01
+2 1 13 13 1.195321344941005236e+03
+2 1 13 14 2.311312411259981658e+01
+2 1 14 14 1.762106829142757647e+01
+2 1 15 15 2.639514455061399076e+03
+2 2 1 1 1.677127534204969476e-09
+2 2 2 2 1.199908985817291068e+03
+2 2 3 3 2.578520457945327962e+03
+2 2 3 4 1.812676236783254126e+03
+2 2 4 4 2.455056321159295294e+03
+2 2 5 5 1.875962386991638642e+00
+*** END ***
+*** REQUEST ***
+""
+4
+5
+3 1 1 1 1
+0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.52428800000000000000e6
+0 1 2 2 -0.52428800000000000000e6
+0 1 3 3 0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 1 2 2 0.52428800000000000000e6
+1 1 3 3 -0.52428800000000000000e6
+1 2 1 1 0.52428800000000000000e6
+2 1 1 2 -0.52428800000000000000e6
+2 1 1 3 0.52428800000000000000e6
+2 4 1 1 0.10485760000000000000e7
+3 1 1 2 -0.52428800000000000000e6
+3 3 1 1 0.52428800000000000000e6
+3 4 1 1 0.52428800000000000000e6
+4 1 2 2 -0.52428800000000000000e6
+4 1 3 3 0.52428800000000000000e6
+4 5 1 1 0.52428800000000000000e6
+*** ANSWER ***
+3.688816407825064671e-09 -2.545670542169063449e-22 6.409981054771744599e-11 1.000000003688357841e+00
+1 1 1 1 1.934708496420738111e-03
+1 1 1 2 -3.360676147230818515e-05
+1 1 1 3 -1.334664517212733938e-16
+1 1 2 2 8.805845224991386818e-07
+1 1 3 3 5.320474754362635804e-07
+1 2 1 1 5.242880019346424378e+05
+1 3 1 1 3.431308106739220780e-05
+1 4 1 1 3.431308106712560249e-05
+1 5 1 1 5.242880019344681641e+05
+2 1 1 1 2.999999999937367434e+00
+2 1 1 2 3.309346246829942828e+01
+2 1 1 3 2.064133156674809766e-11
+2 1 2 2 7.420905716092686362e+02
+2 1 2 3 1.392040788087768876e-10
+2 1 3 3 7.430905716090659325e+02
+2 2 1 1 1.233960145694648361e-09
+2 3 1 1 3.409346246826586224e+01
+2 4 1 1 3.409346246827828963e+01
+2 5 1 1 1.233960145583976145e-09
+*** END ***
+*** REQUEST ***
+""
+1
+2
+3 1
+-0.10485760000000000000e7
+0 1 1 1 0.52428800000000000000e6
+1 1 1 2 0.52428800000000000000e6
+1 1 1 3 0.52428800000000000000e6
+1 2 1 1 -0.10485760000000000000e7
+*** ANSWER ***
+Infeasible
+*** END ***
+*** REQUEST ***
+""
+4
+3
+3 1 3
+0.26214400000000000000e6 0.26214400000000000000e6 -0.52428800000000000000e6 0.10485760000000000000e7
+0 1 1 1 0.52428800000000000000e6
+1 1 2 2 0.52428800000000000000e6
+1 1 2 3 0.26214400000000000000e6
+1 3 1 2 -0.26214400000000000000e6
+2 1 1 2 -0.26214400000000000000e6
+2 1 1 3 -0.26214400000000000000e6
+2 3 1 1 0.52428800000000000000e6
+3 1 2 3 -0.52428800000000000000e6
+3 1 3 3 -0.10485760000000000000e7
+3 3 1 3 0.52428800000000000000e6
+4 1 1 1 0.52428800000000000000e6
+4 2 1 1 0.52428800000000000000e6
+4 3 2 2 0.52428800000000000000e6
+4 3 2 3 0.52428800000000000000e6
+4 3 3 3 0.52428800000000000000e6
+*** ANSWER ***
+9.816323171432449480e-09 7.354944345306220668e-09 -4.908161585716204888e-09 1.000000006097659933e+00
+1 1 1 1 3.196951374351744007e-03
+1 1 1 2 -1.928054530455953911e-03
+1 1 1 3 -1.928054530455953911e-03
+1 1 2 2 5.146600095779186972e-03
+1 1 2 3 5.146580442903951787e-03
+1 1 3 3 5.146600095779165288e-03
+1 2 1 1 5.242880031969496049e+05
+1 3 1 1 3.856128713787118287e-03
+1 3 1 2 -2.573290221451988036e-03
+1 3 1 3 -2.573290221451977628e-03
+1 3 2 2 5.242880031969496049e+05
+1 3 2 3 5.242880031969299307e+05
+1 3 3 3 5.242880031969496049e+05
+2 1 1 1 1.999999989357276853e+00
+2 1 1 2 2.611103560781098398e-01
+2 1 1 3 2.611103560669174595e-01
+2 1 2 2 3.576077728256120281e+03
+2 1 2 3 -3.575577752169025189e+03
+2 1 3 3 3.576077728256087084e+03
+2 2 1 1 5.354222767237307618e-09
+2 3 1 1 1.022220712145030630e+00
+2 3 1 2 -2.391295317446124266e-05
+2 3 1 3 -2.391296193497858879e-05
+2 3 2 2 3.575827687113156117e+03
+2 3 2 3 -3.575827687110479474e+03
+2 3 3 3 3.575827687113156571e+03
+*** END ***
+*** REQUEST ***
+""
+68
+13
+14 1 1 1 1 1 1 1 1 1 1 1 1
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.10485760000000000000e7 -0.10485760000000000000e7 0.10485760000000000000e7 0.0 0.10485760000000000000e7 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6
+0 1 4 5 -0.52428800000000000000e6
+0 1 5 6 0.52428800000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+0 4 1 1 -0.52428800000000000000e6
+0 10 1 1 0.52428800000000000000e6
+2 1 3 14 -0.52428800000000000000e6
+3 1 2 7 0.52428800000000000000e6
+3 1 7 8 0.52428800000000000000e6
+3 1 13 14 -0.52428800000000000000e6
+4 1 3 12 -0.52428800000000000000e6
+5 1 3 11 -0.52428800000000000000e6
+6 1 3 10 -0.52428800000000000000e6
+7 1 7 9 0.52428800000000000000e6
+7 1 9 14 -0.52428800000000000000e6
+8 1 2 3 0.52428800000000000000e6
+8 1 2 7 0.52428800000000000000e6
+8 1 7 8 0.52428800000000000000e6
+8 1 13 14 -0.52428800000000000000e6
+9 1 7 7 0.10485760000000000000e7
+9 1 7 14 -0.52428800000000000000e6
+10 1 3 6 -0.52428800000000000000e6
+11 1 3 5 -0.52428800000000000000e6
+12 1 3 4 -0.52428800000000000000e6
+13 1 3 14 -0.52428800000000000000e6
+13 1 7 7 -0.10485760000000000000e7
+13 1 7 14 0.52428800000000000000e6
+14 1 2 3 -0.52428800000000000000e6
+15 1 1 2 -0.52428800000000000000e6
+15 4 1 1 -0.10485760000000000000e7
+15 10 1 1 0.10485760000000000000e7
+16 1 2 3 -0.52428800000000000000e6
+16 1 2 7 -0.52428800000000000000e6
+17 1 2 13 -0.52428800000000000000e6
+18 1 8 12 0.52428800000000000000e6
+18 1 12 13 -0.52428800000000000000e6
+19 1 2 11 -0.52428800000000000000e6
+20 1 2 10 -0.52428800000000000000e6
+21 1 2 9 -0.52428800000000000000e6
+22 1 8 8 0.10485760000000000000e7
+22 1 8 13 -0.52428800000000000000e6
+23 1 2 7 -0.52428800000000000000e6
+24 1 2 6 -0.52428800000000000000e6
+25 1 2 5 -0.52428800000000000000e6
+26 1 4 8 0.52428800000000000000e6
+26 1 4 13 -0.52428800000000000000e6
+27 1 2 3 -0.52428800000000000000e6
+28 1 2 13 -0.52428800000000000000e6
+28 1 8 8 -0.10485760000000000000e7
+28 1 8 13 0.52428800000000000000e6
+29 1 1 2 -0.52428800000000000000e6
+30 1 1 1 0.52428800000000000000e6
+30 1 4 5 0.52428800000000000000e6
+30 1 5 6 -0.52428800000000000000e6
+30 2 1 1 0.52428800000000000000e6
+30 4 1 1 0.52428800000000000000e6
+30 10 1 1 -0.52428800000000000000e6
+31 1 1 2 -0.52428800000000000000e6
+31 1 1 3 0.52428800000000000000e6
+31 4 1 1 -0.10485760000000000000e7
+31 10 1 1 0.10485760000000000000e7
+32 1 1 4 -0.52428800000000000000e6
+32 1 1 6 0.52428800000000000000e6
+32 12 1 1 0.10485760000000000000e7
+33 1 1 7 0.52428800000000000000e6
+33 1 1 8 -0.52428800000000000000e6
+33 1 4 5 -0.52428800000000000000e6
+33 1 5 6 0.52428800000000000000e6
+33 4 1 1 0.10485760000000000000e7
+33 12 1 1 0.10485760000000000000e7
+34 1 1 9 0.52428800000000000000e6
+34 1 1 10 -0.52428800000000000000e6
+34 1 4 5 0.52428800000000000000e6
+34 1 5 6 -0.52428800000000000000e6
+34 6 1 1 -0.10485760000000000000e7
+34 12 1 1 -0.10485760000000000000e7
+35 1 1 11 0.52428800000000000000e6
+35 1 1 12 -0.52428800000000000000e6
+35 1 4 5 -0.52428800000000000000e6
+35 1 5 6 0.52428800000000000000e6
+35 8 1 1 0.10485760000000000000e7
+35 12 1 1 0.10485760000000000000e7
+36 1 1 2 -0.52428800000000000000e6
+36 1 1 8 -0.52428800000000000000e6
+36 1 1 13 0.52428800000000000000e6
+37 1 1 2 -0.52428800000000000000e6
+37 1 1 8 -0.52428800000000000000e6
+37 1 1 14 0.52428800000000000000e6
+37 1 4 5 -0.52428800000000000000e6
+37 1 5 6 0.52428800000000000000e6
+37 10 1 1 0.10485760000000000000e7
+37 12 1 1 0.10485760000000000000e7
+38 1 2 2 0.52428800000000000000e6
+38 1 2 13 -0.26214400000000000000e6
+38 1 8 8 -0.52428800000000000000e6
+38 1 8 13 0.26214400000000000000e6
+39 1 2 4 0.52428800000000000000e6
+39 1 4 8 0.52428800000000000000e6
+39 1 4 13 -0.52428800000000000000e6
+40 1 2 8 0.52428800000000000000e6
+40 1 8 8 0.10485760000000000000e7
+40 1 8 13 -0.52428800000000000000e6
+41 1 2 12 0.52428800000000000000e6
+41 1 8 12 0.52428800000000000000e6
+41 1 12 13 -0.52428800000000000000e6
+42 1 2 3 -0.52428800000000000000e6
+42 1 2 7 -0.52428800000000000000e6
+42 1 2 14 0.52428800000000000000e6
+43 1 3 3 0.52428800000000000000e6
+43 1 3 14 -0.26214400000000000000e6
+43 1 7 7 -0.52428800000000000000e6
+43 1 7 14 0.26214400000000000000e6
+44 1 3 7 0.52428800000000000000e6
+44 1 7 7 0.10485760000000000000e7
+44 1 7 14 -0.52428800000000000000e6
+45 1 2 3 0.52428800000000000000e6
+45 1 2 7 0.52428800000000000000e6
+45 1 3 8 0.52428800000000000000e6
+45 1 7 8 0.52428800000000000000e6
+45 1 13 14 -0.52428800000000000000e6
+46 1 3 9 0.52428800000000000000e6
+46 1 7 9 0.52428800000000000000e6
+46 1 9 14 -0.52428800000000000000e6
+47 1 2 7 0.52428800000000000000e6
+47 1 3 13 0.52428800000000000000e6
+47 1 7 8 0.52428800000000000000e6
+47 1 13 14 -0.52428800000000000000e6
+48 1 3 4 -0.52428800000000000000e6
+48 1 4 7 -0.52428800000000000000e6
+48 1 4 14 0.52428800000000000000e6
+49 1 3 5 0.52428800000000000000e6
+49 1 5 7 0.52428800000000000000e6
+49 1 5 14 -0.52428800000000000000e6
+50 1 2 5 -0.52428800000000000000e6
+50 1 5 8 -0.52428800000000000000e6
+50 1 5 13 0.52428800000000000000e6
+51 1 2 6 0.52428800000000000000e6
+51 1 6 8 0.52428800000000000000e6
+51 1 6 13 -0.52428800000000000000e6
+52 1 3 6 -0.52428800000000000000e6
+52 1 6 7 -0.52428800000000000000e6
+52 1 6 14 0.52428800000000000000e6
+53 1 3 11 0.52428800000000000000e6
+53 1 7 11 0.52428800000000000000e6
+53 1 11 14 -0.52428800000000000000e6
+54 1 2 7 -0.52428800000000000000e6
+54 1 7 8 -0.52428800000000000000e6
+54 1 7 13 0.52428800000000000000e6
+55 1 2 10 0.52428800000000000000e6
+55 1 8 10 0.52428800000000000000e6
+55 1 10 13 -0.52428800000000000000e6
+56 1 2 3 0.52428800000000000000e6
+56 1 2 7 0.52428800000000000000e6
+56 1 8 14 0.52428800000000000000e6
+56 1 13 14 -0.52428800000000000000e6
+57 1 2 9 -0.52428800000000000000e6
+57 1 8 9 -0.52428800000000000000e6
+57 1 9 13 0.52428800000000000000e6
+58 1 3 10 -0.52428800000000000000e6
+58 1 7 10 -0.52428800000000000000e6
+58 1 10 14 0.52428800000000000000e6
+59 1 2 11 -0.52428800000000000000e6
+59 1 8 11 -0.52428800000000000000e6
+59 1 11 13 0.52428800000000000000e6
+60 1 3 12 -0.52428800000000000000e6
+60 1 7 12 -0.52428800000000000000e6
+60 1 12 14 0.52428800000000000000e6
+61 1 2 13 -0.26214400000000000000e6
+61 1 8 13 -0.26214400000000000000e6
+61 1 13 13 0.52428800000000000000e6
+62 1 3 14 -0.26214400000000000000e6
+62 1 7 14 -0.26214400000000000000e6
+62 1 14 14 0.52428800000000000000e6
+63 3 1 1 0.52428800000000000000e6
+63 4 1 1 0.52428800000000000000e6
+64 5 1 1 0.52428800000000000000e6
+64 6 1 1 0.52428800000000000000e6
+65 7 1 1 0.52428800000000000000e6
+65 8 1 1 0.52428800000000000000e6
+66 9 1 1 0.52428800000000000000e6
+66 10 1 1 0.52428800000000000000e6
+67 1 1 5 -0.26214400000000000000e6
+67 11 1 1 0.52428800000000000000e6
+68 1 4 5 -0.26214400000000000000e6
+68 1 5 6 0.26214400000000000000e6
+68 13 1 1 0.52428800000000000000e6
+*** ANSWER ***
+0.000000000000000000e+00 -4.358336930549132071e-01 2.446297394145675180e-02 2.503984933708786355e-18 -2.503988624849942218e-18 -2.503988360082919944e-18 2.503985419133262010e-18 -2.446297394145674833e-02 4.358336930549132071e-01 -3.625427227495561147e-18 8.653442016310112161e-18 3.625436842174291609e-18 4.358336916354477730e-01 -1.599455735344324121e-03 5.000000004067406412e-01 -2.111117255981957708e-02 -5.594504390341482614e-01 -1.837205820187493134e-18 1.837112289478419031e-18 1.837114511151533702e-18 -1.837114389321038021e-18 5.594504390341482614e-01 2.111117255981958055e-02 3.047976706967515578e-18 -6.570472937839315955e-18 -3.047726349125407372e-18 -1.752345646292848436e-03 5.594504376146828273e-01 -5.000000004067416404e-01 8.135003855470110151e-10 2.012444496608578497e-15 5.874231035970854750e-13 3.953330444083093306e-13 -3.973522450792528911e-13 3.973522221356724985e-13 -3.983549521107778119e-13 3.993714067743915609e-13 1.892614830098310365e-09 2.031644712738348266e-18 5.755964025946964231e-15 1.224623433758961236e-18 -1.225862393779024359e-18 1.892614836179683499e-09 5.752157101363380909e-15 -9.851579753722980021e-19 -1.224553032274562258e-18 -1.464082587315128079e-18 -1.593635582640449380e-18 4.273648630368601055e-18 2.190623187397488011e-18 1.016166739577850222e-18 1.593625935536946878e-18 -1.279434597485284426e-18 7.164589230421748882e-19 6.125528465306849784e-19 -6.173749659207602092e-19 6.125528701563507179e-19 1.279434277906083312e-18 -6.125508714231513745e-19 -1.279431003265877783e-18 9.463275463336735396e-10 9.463275493438998008e-10 1.892246791079996709e-09 1.892251903497905420e-09 1.892251903520837761e-09 1.892257016296770093e-09 2.751290983450438606e-12 2.000000001623820634e+00
+1 1 1 1 4.265121747698074977e-04
+1 1 1 2 -1.055101941311302298e-09
+1 1 1 3 1.055100500237918403e-09
+1 1 1 4 -3.079788841387087495e-07
+1 1 1 5 -7.212344235656317780e-07
+1 1 1 6 3.079788841387087495e-07
+1 1 1 7 2.072683711867436823e-07
+1 1 1 8 -2.078012861694199576e-07
+1 1 1 9 -2.083270138681113398e-07
+1 1 1 10 2.083270138681113398e-07
+1 1 1 11 2.083270018390674629e-07
+1 1 1 12 -2.083270018390674629e-07
+1 1 1 13 -2.088527211322554774e-07
+1 1 1 14 2.093856361149322027e-07
+1 1 2 2 9.922789286747192398e-04
+1 1 2 3 7.850428075071750054e-16
+1 1 2 4 1.065166943152163136e-12
+1 1 2 5 2.296302665959645897e-12
+1 1 2 6 -1.065253584182792467e-12
+1 1 2 7 -6.413408842498694213e-13
+1 1 2 8 3.017782867235681983e-09
+1 1 2 9 6.420229097598153746e-13
+1 1 2 10 -6.420229860207359395e-13
+1 1 2 11 -6.420228567493593611e-13
+1 1 2 12 6.420553708386182683e-13
+1 1 2 13 -3.016498788180539173e-09
+1 1 2 14 -6.427049427096171229e-13
+1 1 3 3 9.922789318631101974e-04
+1 1 3 4 -1.065249018758479378e-12
+1 1 3 5 -2.296273114728501763e-12
+1 1 3 6 1.065249035758397049e-12
+1 1 3 7 3.015786942359604250e-09
+1 1 3 8 -5.165065045919913749e-13
+1 1 3 9 -6.420184601851656971e-13
+1 1 3 10 6.420190106363294250e-13
+1 1 3 11 6.420189818989616035e-13
+1 1 3 12 -6.420189310840511444e-13
+1 1 3 13 -7.676009315382738704e-13
+1 1 3 14 -3.014502906611474700e-09
+1 1 4 4 3.684632136133815247e-09
+1 1 4 5 -6.077664602194459602e-11
+1 1 4 7 8.355240123513959247e-13
+1 1 4 8 -5.327194089780987475e-13
+1 1 4 13 5.327194089780987475e-13
+1 1 4 14 -8.355240123513959247e-13
+1 1 5 5 3.684632136133815247e-09
+1 1 5 6 6.077664602194459602e-11
+1 1 5 7 2.240622693118693110e-12
+1 1 5 8 -1.148517449674254194e-12
+1 1 5 13 1.148517449674254194e-12
+1 1 5 14 -2.240622693118693110e-12
+1 1 6 6 3.684632136133815247e-09
+1 1 6 7 -8.355189544907948050e-13
+1 1 6 8 5.327640275597919370e-13
+1 1 6 13 -5.327640275597919370e-13
+1 1 6 14 8.355189544907948050e-13
+1 1 7 7 4.961518602328536054e-04
+1 1 7 8 9.658452821925851030e-13
+1 1 7 9 6.707910472413758939e-13
+1 1 7 10 -6.707920386948246074e-13
+1 1 7 11 -6.707922062463648013e-13
+1 1 7 12 6.707903218402605310e-13
+1 1 7 13 3.756308158439357878e-13
+1 1 7 14 -4.961481768955663041e-04
+1 1 8 8 4.961518600597709201e-04
+1 1 8 9 -3.211541191885328052e-13
+1 1 8 10 3.211541068018797659e-13
+1 1 8 11 3.211530712767011878e-13
+1 1 8 12 -3.211695942158421822e-13
+1 1 8 13 -4.961481760199111784e-04
+1 1 8 14 -3.236822861326635285e-13
+1 1 9 9 3.684632136133815247e-09
+1 1 9 13 3.211541191885328052e-13
+1 1 9 14 -6.707910472413758939e-13
+1 1 10 10 3.684632136133815247e-09
+1 1 10 13 -3.211541068018797659e-13
+1 1 10 14 6.707920386948246074e-13
+1 1 11 11 3.684632136133815247e-09
+1 1 11 13 -3.211530712767011878e-13
+1 1 11 14 6.707922062463648013e-13
+1 1 12 12 3.684632136133815247e-09
+1 1 12 13 3.211695942158421822e-13
+1 1 12 14 -6.707903218402605310e-13
+1 1 13 13 4.961518612443252194e-04
+1 1 13 14 -1.017793811903859887e-12
+1 1 14 14 4.961518628225506169e-04
+1 2 1 1 5.242880004265117459e+05
+1 3 1 1 9.920859702338853930e-04
+1 4 1 1 9.925079853196003277e-04
+1 5 1 1 9.920886506132459148e-04
+1 6 1 1 9.925053046409807074e-04
+1 7 1 1 9.920886506252695001e-04
+1 8 1 1 9.925053046289469307e-04
+1 9 1 1 9.920913311923372935e-04
+1 10 1 1 9.925026237794054400e-04
+1 11 1 1 1.446153479267397432e-06
+1 12 1 1 2.286258446431255668e-06
+1 13 1 1 1.048576000851353398e+06
+2 1 1 1 1.999999936650863175e+00
+2 1 1 2 2.375535726740049413e-09
+2 1 1 3 -2.375584168439393024e-09
+2 1 1 4 3.362401762409295003e+01
+2 1 1 5 1.074120562685367730e+02
+2 1 1 6 -3.362401762411580108e+01
+2 1 1 7 -3.387410201846827817e+01
+2 1 1 8 3.387410201166457568e+01
+2 1 1 9 3.387410201024017198e+01
+2 1 1 10 -3.387410201026396095e+01
+2 1 1 11 -3.387410201240677310e+01
+2 1 1 12 3.387410201243065444e+01
+2 1 1 13 3.387410201403746157e+01
+2 1 1 14 -3.387410201167422485e+01
+2 1 2 2 5.000000284743744139e-01
+2 1 2 3 -1.357525667946269681e-14
+2 1 2 4 3.500862342704890041e-14
+2 1 2 5 -1.750544055319940667e-14
+2 1 2 6 -2.388132374226035137e-16
+2 1 2 7 1.063253062853983258e-14
+2 1 2 8 -2.860551147216092594e-09
+2 1 2 9 4.590098843214195211e-15
+2 1 2 10 6.965030827016224489e-15
+2 1 2 11 -3.370981199440712589e-15
+2 1 2 12 -1.349387477094428829e-11
+2 1 2 13 2.846050058992552297e-09
+2 1 2 14 -2.974618304899300047e-15
+2 1 3 3 5.000000284602812428e-01
+2 1 3 4 -2.265502845399615353e-15
+2 1 3 5 1.035930690290081319e-14
+2 1 3 6 -2.068608249944723552e-15
+2 1 3 7 -2.845565787008367094e-09
+2 1 3 8 1.362782111033638897e-11
+2 1 3 9 4.134184188016176711e-14
+2 1 3 10 -3.601627304041364991e-15
+2 1 3 11 2.217922532619746220e-15
+2 1 3 12 -2.320546511927497260e-15
+2 1 3 13 1.409525851322583747e-11
+2 1 3 14 2.845848388345980519e-09
+2 1 4 4 1.843402247729965893e+04
+2 1 4 5 -2.500000113558413228e-01
+2 1 4 6 -1.563709682740319522e+03
+2 1 4 7 -1.028955291991132299e+03
+2 1 4 8 1.028955291850625827e+03
+2 1 4 9 1.028955303184453214e+03
+2 1 4 10 -1.028955303185259254e+03
+2 1 4 11 -1.028955282648252933e+03
+2 1 4 12 1.028955282648555340e+03
+2 1 4 13 1.028955291850580579e+03
+2 1 4 14 -1.028955291991112517e+03
+2 1 5 5 2.806943818053343421e+04
+2 1 5 6 2.500000093932423506e-01
+2 1 5 7 -3.169207482727565548e+03
+2 1 5 8 3.169207482228815024e+03
+2 1 5 9 3.169207526349637646e+03
+2 1 5 10 -3.169207526352013701e+03
+2 1 5 11 -3.169207459728382219e+03
+2 1 5 12 3.169207459729322181e+03
+2 1 5 13 3.169207482228662229e+03
+2 1 5 14 -3.169207482727457318e+03
+2 1 6 6 1.843402247730096497e+04
+2 1 6 7 1.028955291988542513e+03
+2 1 6 8 -1.028955291859548424e+03
+2 1 6 9 -1.028955303185056664e+03
+2 1 6 10 1.028955303185862476e+03
+2 1 6 11 1.028955282648857292e+03
+2 1 6 12 -1.028955282649160154e+03
+2 1 6 13 -1.028955291859502950e+03
+2 1 6 14 1.028955291988525005e+03
+2 1 7 7 9.408467952297351076e+03
+2 1 7 8 -9.730615548772358352e+02
+2 1 7 9 -9.730615683665855613e+02
+2 1 7 10 9.730615683777449476e+02
+2 1 7 11 9.730615481173399530e+02
+2 1 7 12 -9.730615481085150122e+02
+2 1 7 13 -9.730615548771879730e+02
+2 1 7 14 9.407967952294220595e+03
+2 1 8 8 9.408467950954956905e+03
+2 1 8 9 9.730615682392160579e+02
+2 1 8 10 -9.730615682354260798e+02
+2 1 8 11 -9.730615479639016030e+02
+2 1 8 12 9.730615479766042881e+02
+2 1 8 13 9.407967950951337116e+03
+2 1 8 14 -9.730615548771784233e+02
+2 1 9 9 1.784337437628251791e+04
+2 1 9 10 -9.730615817232558129e+02
+2 1 9 11 -9.730615614591540634e+02
+2 1 9 12 9.730615614594322551e+02
+2 1 9 13 9.730615682391455721e+02
+2 1 9 14 -9.730615683665523648e+02
+2 1 10 10 1.784337437628397674e+04
+2 1 10 11 9.730615614598762022e+02
+2 1 10 12 -9.730615614601556445e+02
+2 1 10 13 -9.730615682353555940e+02
+2 1 10 14 9.730615683777116374e+02
+2 1 11 11 1.784337433575577234e+04
+2 1 11 12 -9.730615411960549181e+02
+2 1 11 13 -9.730615479638314582e+02
+2 1 11 14 9.730615481173065291e+02
+2 1 12 12 1.784337433575631439e+04
+2 1 12 13 9.730615479765203872e+02
+2 1 12 14 -9.730615481084819294e+02
+2 1 13 13 9.408467950964812189e+03
+2 1 13 14 -9.730615548771303338e+02
+2 1 14 14 9.408467952308163149e+03
+2 2 1 1 2.052422334158917781e-10
+2 3 1 1 4.998312530039574209e-01
+2 4 1 1 5.001687697628741658e-01
+2 5 1 1 4.998312505503125225e-01
+2 6 1 1 5.001687722168101091e-01
+2 7 1 1 4.998312505507167547e-01
+2 8 1 1 5.001687722164057659e-01
+2 9 1 1 4.998312482533635026e-01
+2 10 1 1 5.001687745140502850e-01
+2 11 1 1 1.079120562685676106e+02
+2 12 1 1 6.774803524816414324e+01
+2 13 1 1 1.026211167094881673e-10
+*** END ***
+*** REQUEST ***
+""
+57
+16
+14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+-0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.52428800000000000000e6 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 -0.10485760000000000000e7 0.0 0.10485760000000000000e7 0.0 0.10485760000000000000e7 -0.10485760000000000000e7 0.10485760000000000000e7 0.0 0.10485760000000000000e7 0.0 0.0 0.10485760000000000000e7 0.0 0.0 0.0 0.10485760000000000000e7 -0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6
+0 1 1 2 -0.26214400000000000000e6
+0 4 1 1 -0.52428800000000000000e6
+0 10 1 1 0.52428800000000000000e6
+0 12 1 1 -0.52428800000000000000e6
+1 1 3 14 -0.26214400000000000000e6
+1 1 7 14 0.26214400000000000000e6
+1 1 14 14 -0.52428800000000000000e6
+2 1 2 3 -0.26214400000000000000e6
+2 1 2 7 0.26214400000000000000e6
+2 1 3 8 -0.26214400000000000000e6
+2 1 7 8 0.26214400000000000000e6
+2 1 13 14 -0.26214400000000000000e6
+3 1 3 11 -0.26214400000000000000e6
+3 1 7 11 0.26214400000000000000e6
+3 1 11 14 -0.26214400000000000000e6
+4 1 3 9 -0.26214400000000000000e6
+4 1 7 9 0.26214400000000000000e6
+4 1 9 14 -0.26214400000000000000e6
+5 1 2 3 -0.26214400000000000000e6
+5 1 2 7 0.26214400000000000000e6
+5 1 3 8 -0.26214400000000000000e6
+5 1 7 8 0.26214400000000000000e6
+5 1 13 14 -0.26214400000000000000e6
+6 1 3 7 -0.26214400000000000000e6
+6 1 7 7 0.52428800000000000000e6
+6 1 7 14 -0.26214400000000000000e6
+7 1 3 6 -0.26214400000000000000e6
+7 1 6 7 0.26214400000000000000e6
+7 1 6 14 -0.26214400000000000000e6
+8 1 1 5 0.26214400000000000000e6
+8 1 3 5 -0.26214400000000000000e6
+8 13 1 1 0.52428800000000000000e6
+9 1 1 4 0.26214400000000000000e6
+9 1 1 6 -0.26214400000000000000e6
+9 1 3 4 -0.26214400000000000000e6
+9 1 6 7 0.26214400000000000000e6
+9 1 6 14 -0.26214400000000000000e6
+9 16 1 1 0.52428800000000000000e6
+10 1 3 3 -0.52428800000000000000e6
+10 1 3 7 0.26214400000000000000e6
+10 1 3 14 -0.26214400000000000000e6
+11 1 1 2 -0.78643200000000000000e6
+11 1 4 5 0.52428800000000000000e6
+11 1 5 6 -0.52428800000000000000e6
+11 2 1 1 0.52428800000000000000e6
+11 4 1 1 -0.10485760000000000000e7
+11 10 1 1 0.10485760000000000000e7
+11 12 1 1 -0.52428800000000000000e6
+12 1 2 3 0.52428800000000000000e6
+12 1 2 7 -0.52428800000000000000e6
+13 1 2 13 -0.52428800000000000000e6
+14 1 8 12 0.52428800000000000000e6
+14 1 12 13 -0.52428800000000000000e6
+15 1 2 11 -0.52428800000000000000e6
+16 1 2 10 -0.52428800000000000000e6
+17 1 2 9 -0.52428800000000000000e6
+18 1 8 8 0.10485760000000000000e7
+18 1 8 13 -0.52428800000000000000e6
+19 1 2 7 -0.52428800000000000000e6
+20 1 2 6 -0.52428800000000000000e6
+21 1 2 5 -0.52428800000000000000e6
+22 1 4 8 0.52428800000000000000e6
+22 1 4 13 -0.52428800000000000000e6
+23 1 2 3 -0.52428800000000000000e6
+24 1 2 13 -0.52428800000000000000e6
+24 1 8 8 -0.10485760000000000000e7
+24 1 8 13 0.52428800000000000000e6
+25 1 1 2 -0.52428800000000000000e6
+26 1 1 1 0.52428800000000000000e6
+26 1 1 2 0.26214400000000000000e6
+26 4 1 1 0.52428800000000000000e6
+26 10 1 1 -0.52428800000000000000e6
+26 12 1 1 0.52428800000000000000e6
+27 1 1 2 -0.10485760000000000000e7
+27 1 1 3 0.52428800000000000000e6
+27 1 4 5 0.10485760000000000000e7
+27 1 5 6 -0.10485760000000000000e7
+27 2 1 1 0.10485760000000000000e7
+27 4 1 1 -0.10485760000000000000e7
+27 10 1 1 0.10485760000000000000e7
+27 12 1 1 -0.10485760000000000000e7
+28 1 1 4 0.52428800000000000000e6
+28 1 1 6 -0.52428800000000000000e6
+28 1 1 7 0.52428800000000000000e6
+28 1 1 8 -0.52428800000000000000e6
+28 1 4 5 -0.52428800000000000000e6
+28 1 5 6 0.52428800000000000000e6
+28 4 1 1 0.10485760000000000000e7
+29 1 1 4 -0.52428800000000000000e6
+29 1 1 6 0.52428800000000000000e6
+29 1 1 9 0.52428800000000000000e6
+29 1 1 10 -0.52428800000000000000e6
+29 1 4 5 0.52428800000000000000e6
+29 1 5 6 -0.52428800000000000000e6
+29 6 1 1 -0.10485760000000000000e7
+30 1 1 4 0.52428800000000000000e6
+30 1 1 6 -0.52428800000000000000e6
+30 1 1 11 0.52428800000000000000e6
+30 1 1 12 -0.52428800000000000000e6
+30 1 4 5 -0.52428800000000000000e6
+30 1 5 6 0.52428800000000000000e6
+30 8 1 1 0.10485760000000000000e7
+31 1 1 2 -0.52428800000000000000e6
+31 1 1 8 -0.52428800000000000000e6
+31 1 1 13 0.52428800000000000000e6
+32 1 1 2 -0.52428800000000000000e6
+32 1 1 4 0.52428800000000000000e6
+32 1 1 6 -0.52428800000000000000e6
+32 1 1 8 -0.52428800000000000000e6
+32 1 1 14 0.52428800000000000000e6
+32 1 4 5 -0.52428800000000000000e6
+32 1 5 6 0.52428800000000000000e6
+32 10 1 1 0.10485760000000000000e7
+33 1 2 2 0.52428800000000000000e6
+33 1 2 13 -0.26214400000000000000e6
+33 1 8 8 -0.52428800000000000000e6
+33 1 8 13 0.26214400000000000000e6
+34 1 2 4 0.52428800000000000000e6
+34 1 4 8 0.52428800000000000000e6
+34 1 4 13 -0.52428800000000000000e6
+35 1 2 8 0.52428800000000000000e6
+35 1 8 8 0.10485760000000000000e7
+35 1 8 13 -0.52428800000000000000e6
+36 1 2 12 0.52428800000000000000e6
+36 1 8 12 0.52428800000000000000e6
+36 1 12 13 -0.52428800000000000000e6
+37 1 2 3 0.52428800000000000000e6
+37 1 2 7 -0.52428800000000000000e6
+37 1 2 14 0.52428800000000000000e6
+38 1 2 3 -0.52428800000000000000e6
+38 1 3 8 -0.52428800000000000000e6
+38 1 3 13 0.52428800000000000000e6
+39 1 1 4 0.52428800000000000000e6
+39 1 1 6 -0.52428800000000000000e6
+39 1 4 7 -0.52428800000000000000e6
+39 1 4 14 0.52428800000000000000e6
+39 1 6 7 0.52428800000000000000e6
+39 1 6 14 -0.52428800000000000000e6
+39 16 1 1 0.10485760000000000000e7
+40 1 1 5 -0.52428800000000000000e6
+40 1 5 7 0.52428800000000000000e6
+40 1 5 14 -0.52428800000000000000e6
+40 13 1 1 -0.10485760000000000000e7
+41 1 2 5 -0.52428800000000000000e6
+41 1 5 8 -0.52428800000000000000e6
+41 1 5 13 0.52428800000000000000e6
+42 1 2 6 0.52428800000000000000e6
+42 1 6 8 0.52428800000000000000e6
+42 1 6 13 -0.52428800000000000000e6
+43 1 2 7 -0.52428800000000000000e6
+43 1 7 8 -0.52428800000000000000e6
+43 1 7 13 0.52428800000000000000e6
+44 1 2 10 0.52428800000000000000e6
+44 1 8 10 0.52428800000000000000e6
+44 1 10 13 -0.52428800000000000000e6
+45 1 2 3 -0.52428800000000000000e6
+45 1 2 7 0.52428800000000000000e6
+45 1 8 14 0.52428800000000000000e6
+45 1 13 14 -0.52428800000000000000e6
+46 1 2 9 -0.52428800000000000000e6
+46 1 8 9 -0.52428800000000000000e6
+46 1 9 13 0.52428800000000000000e6
+47 1 3 10 0.52428800000000000000e6
+47 1 7 10 -0.52428800000000000000e6
+47 1 10 14 0.52428800000000000000e6
+48 1 2 11 -0.52428800000000000000e6
+48 1 8 11 -0.52428800000000000000e6
+48 1 11 13 0.52428800000000000000e6
+49 1 3 12 0.52428800000000000000e6
+49 1 7 12 -0.52428800000000000000e6
+49 1 12 14 0.52428800000000000000e6
+50 1 2 13 -0.26214400000000000000e6
+50 1 8 13 -0.26214400000000000000e6
+50 1 13 13 0.52428800000000000000e6
+51 3 1 1 0.52428800000000000000e6
+51 4 1 1 0.52428800000000000000e6
+52 5 1 1 0.52428800000000000000e6
+52 6 1 1 0.52428800000000000000e6
+53 7 1 1 0.52428800000000000000e6
+53 8 1 1 0.52428800000000000000e6
+54 9 1 1 0.52428800000000000000e6
+54 10 1 1 0.52428800000000000000e6
+55 1 1 5 -0.26214400000000000000e6
+55 11 1 1 0.52428800000000000000e6
+56 1 1 4 -0.26214400000000000000e6
+56 1 1 6 0.26214400000000000000e6
+56 14 1 1 0.52428800000000000000e6
+57 1 4 5 -0.26214400000000000000e6
+57 1 5 6 0.26214400000000000000e6
+57 15 1 1 0.52428800000000000000e6
+*** ANSWER ***
+-1.818845907517793481e-10 -1.660052411202117247e-03 -5.418356219798100263e-19 5.418357922911454706e-19 1.660052411202118331e-03 1.818845896673446603e-10 -2.276583770230513951e-15 3.821582681881245883e-15 2.276574436673946495e-15 -1.818845916544239064e-10 4.999999998136906987e-01 -2.565263139349548312e-03 -2.787293237470469531e+00 2.222461248684833636e-18 -2.222461752841106923e-18 -2.222461117335931102e-18 2.222461543396396879e-18 2.787293237470469531e+00 2.565263139349543541e-03 -4.147965001909044106e-18 8.203520056842852189e-18 4.147965398139292117e-18 -2.565263139349551781e-03 2.787293237061235107e+00 -2.499999995598727320e-01 3.223802495857886407e-10 3.487809630540785872e-13 3.649605182859184442e-13 -1.910872966542088906e-13 1.910872997596713700e-13 -1.900778989892255128e-13 1.721257820460496574e-14 5.456447481681318684e-10 -2.765213993211897970e-18 1.229092053981911148e-15 -1.481578684620154433e-18 1.664627305731170615e-19 1.036611378168996746e-18 5.683996304879641066e-16 -9.538993097792214049e-16 -2.734707549946192396e-18 -1.382751304713719317e-18 1.679375092088469107e-18 -7.408824092485472675e-19 -3.442238134904154866e-19 -7.408827797640691868e-19 2.709194754064584108e-19 7.408830329119172031e-19 -2.709192629386655329e-19 2.728266795039663332e-10 3.684870987072947969e-10 5.454679212818442806e-10 5.454679212787438008e-10 1.062784355493079248e-09 1.394096743081149780e-12 2.205101713849891858e-12 9.999999996272466163e-01
+1 1 1 1 1.690223370879423122e-04
+1 1 1 2 1.056044494672381750e-09
+1 1 1 3 1.828616735576967543e-07
+1 1 1 4 -1.764210650234066301e-07
+1 1 1 5 -3.639521736863790349e-07
+1 1 1 6 1.764210650234066301e-07
+1 1 1 7 1.913444202110876093e-07
+1 1 1 8 -1.007132069075601906e-07
+1 1 1 9 -1.001847765882418708e-07
+1 1 1 10 1.001847765882418708e-07
+1 1 1 11 1.001847782163985832e-07
+1 1 1 12 -1.001847782163985832e-07
+1 1 1 13 -9.965556150526306567e-08
+1 1 1 14 9.024348201735928276e-09
+1 1 2 2 2.860772345206818784e-04
+1 1 2 3 1.381208963315946764e-12
+1 1 2 4 -1.449768514073079563e-12
+1 1 2 5 -2.867232771615834960e-12
+1 1 2 6 1.449768358875143352e-12
+1 1 2 7 1.466265684593450609e-12
+1 1 2 8 6.443982147980682321e-10
+1 1 2 9 -7.767739668272662250e-13
+1 1 2 10 7.767739377057175385e-13
+1 1 2 11 7.767739439142355249e-13
+1 1 2 12 -7.767739254021315273e-13
+1 1 2 13 -6.459517542110974688e-10
+1 1 2 14 8.727441208671839793e-14
+1 1 3 3 9.536214958242293128e-05
+1 1 3 4 -5.967903291274550300e-10
+1 1 3 5 -1.001804970559077321e-09
+1 1 3 6 5.967927758633078492e-10
+1 1 3 7 -9.535990826841351620e-05
+1 1 3 8 -8.275471434386459761e-13
+1 1 3 9 -1.420390019343700382e-13
+1 1 3 10 1.420398299219012673e-13
+1 1 3 11 1.420389572882753195e-13
+1 1 3 12 -1.420397185275870749e-13
+1 1 3 13 5.434829062374669657e-13
+1 1 3 14 9.535990855269181371e-05
+1 1 4 4 2.240793108327409030e-09
+1 1 4 5 3.050484026666695147e-10
+1 1 4 7 -2.980051054692737255e-10
+1 1 4 8 7.249599685865732184e-13
+1 1 4 13 -7.249599685865732184e-13
+1 1 4 14 2.980051054692737255e-10
+1 1 5 5 2.240793108327409030e-09
+1 1 5 6 -3.050484026666695147e-10
+1 1 5 7 -5.001179613255284319e-10
+1 1 5 8 1.433774351946189319e-12
+1 1 5 13 -1.433774351946189319e-12
+1 1 5 14 5.001179613255284319e-10
+1 1 6 6 2.240793108327409030e-09
+1 1 6 7 2.980026587334181662e-10
+1 1 6 8 -7.249599160457464732e-13
+1 1 6 13 7.249599160457464732e-13
+1 1 6 14 -2.980026587334181662e-10
+1 1 7 7 9.536214854062112750e-05
+1 1 7 8 -5.964119710797005837e-13
+1 1 7 9 1.420390019343700382e-13
+1 1 7 10 -1.420398299219012673e-13
+1 1 7 11 -1.420389572882753195e-13
+1 1 7 12 1.420397185275870749e-13
+1 1 7 13 8.804762082808792911e-13
+1 1 7 14 -9.535990803179079662e-05
+1 1 8 8 1.430419965325353663e-04
+1 1 8 9 3.884359508369443058e-13
+1 1 8 10 -3.884357565801023498e-13
+1 1 8 11 -3.884360835593232466e-13
+1 1 8 12 3.884358377483426310e-13
+1 1 8 13 -1.430397549416011465e-04
+1 1 8 14 -1.804724147272629546e-13
+1 1 9 9 2.240793108327409030e-09
+1 1 9 13 -3.884359508369443058e-13
+1 1 9 14 -1.420390019343700382e-13
+1 1 10 10 2.240793108327409030e-09
+1 1 10 13 3.884357565801023498e-13
+1 1 10 14 1.420398299219012673e-13
+1 1 11 11 2.240793108327409030e-09
+1 1 11 13 3.884360835593232466e-13
+1 1 11 14 1.420389572882753195e-13
+1 1 12 12 2.240793108327409030e-09
+1 1 12 13 -3.884358377483426310e-13
+1 1 12 14 -1.420397185275870749e-13
+1 1 13 13 1.430419949368838311e-04
+1 1 13 14 -1.035918224739162324e-13
+1 1 14 14 9.536214910917722109e-05
+1 2 1 1 2.621439999026882288e+05
+1 3 1 1 1.931956048001585047e-04
+1 4 1 1 5.575919951665662001e-04
+1 5 1 1 2.859845263061239857e-04
+1 6 1 1 2.861848958593009502e-04
+1 7 1 1 2.859845263044983872e-04
+1 8 1 1 2.861848958609307229e-04
+1 9 1 1 5.572073249658638901e-04
+1 10 1 1 1.932117071619195072e-04
+1 11 1 1 7.331489863448571277e-07
+1 12 1 1 2.621440002663361374e+05
+1 13 1 1 5.244638972096611229e-09
+1 14 1 1 1.158349160459260222e-06
+1 15 1 1 5.242879998045720858e+05
+1 16 1 1 4.030383977520863439e-09
+2 1 1 1 2.999999964910252004e+00
+2 1 1 2 -1.057274050420849621e-08
+2 1 1 3 9.999999665660262993e-01
+2 1 1 4 3.753374984261114378e+01
+2 1 1 5 1.197960091434841701e+02
+2 1 1 6 -3.753374984260942426e+01
+2 1 1 7 -3.753340600284345641e+01
+2 1 1 8 3.803340599099050934e+01
+2 1 1 9 3.803282193395455835e+01
+2 1 1 10 -3.803282193395020983e+01
+2 1 1 11 -3.803282193565569713e+01
+2 1 1 12 3.803282193563102709e+01
+2 1 1 13 3.803340598041607734e+01
+2 1 1 14 -3.853340596981361443e+01
+2 1 2 2 1.000000030672290707e+00
+2 1 2 3 5.373784359220279162e-15
+2 1 2 4 1.083742550729897975e-13
+2 1 2 5 1.351688182377334113e-15
+2 1 2 6 9.195120471080661468e-16
+2 1 2 7 6.592186314967077886e-15
+2 1 2 8 -3.067123373620130692e-09
+2 1 2 9 -1.015235659348739608e-15
+2 1 2 10 7.506863001574777111e-15
+2 1 2 11 8.379924963823399556e-15
+2 1 2 12 -1.130830140328470411e-14
+2 1 2 13 3.067150392260980726e-09
+2 1 2 14 1.239238768105081383e-15
+2 1 3 3 1.472709913982655598e+04
+2 1 3 4 4.156844113453546015e+03
+2 1 3 5 6.814586708444385295e+03
+2 1 3 6 -4.156844113460887456e+03
+2 1 3 7 7.291931345734316892e+03
+2 1 3 8 7.111822412774779423e+01
+2 1 3 9 7.116320712720697372e+01
+2 1 3 10 -7.116320712528342085e+01
+2 1 3 11 -7.116320641780468748e+01
+2 1 3 12 7.116320641838120764e+01
+2 1 3 13 7.111822412773561553e+01
+2 1 3 14 -7.434167794084089110e+03
+2 1 4 4 1.798921371857177292e+04
+2 1 4 5 -4.999999856969779555e-01
+2 1 4 6 -3.094740392387911925e+03
+2 1 4 7 1.252160222625748474e+03
+2 1 4 8 8.262618340764327058e+02
+2 1 4 9 8.262505203845283859e+02
+2 1 4 10 -8.262505203839913293e+02
+2 1 4 11 -8.262505201321131381e+02
+2 1 4 12 8.262505201317975434e+02
+2 1 4 13 8.262618340764436198e+02
+2 1 4 14 -2.904683890827874620e+03
+2 1 5 5 2.871538735044614077e+04
+2 1 5 6 4.999999824680305127e-01
+2 1 5 7 7.321684112430647247e+02
+2 1 5 8 2.675124942919109799e+03
+2 1 5 9 2.675032798282890326e+03
+2 1 5 10 -2.675032798281933992e+03
+2 1 5 11 -2.675032799396220980e+03
+2 1 5 12 2.675032799394963149e+03
+2 1 5 13 2.675124942919179375e+03
+2 1 5 14 -6.082418297199908920e+03
+2 1 6 6 1.798921371857585109e+04
+2 1 6 7 -1.252160222627991288e+03
+2 1 6 8 -8.262618340746161039e+02
+2 1 6 9 -8.262505203845300912e+02
+2 1 6 10 8.262505203839922387e+02
+2 1 6 11 8.262505201321142749e+02
+2 1 6 12 -8.262505201317986803e+02
+2 1 6 13 -8.262618340746271315e+02
+2 1 6 14 2.904683890832901852e+03
+2 1 7 7 1.187639979377059353e+04
+2 1 7 8 -7.826974578469248627e+02
+2 1 7 9 -7.826395097730988937e+02
+2 1 7 10 7.826395097759638020e+02
+2 1 7 11 7.826395105956398766e+02
+2 1 7 12 -7.826395105943687440e+02
+2 1 7 13 -7.826974578469411199e+02
+2 1 7 14 4.583468448028047533e+03
+2 1 8 8 8.265993232776869263e+03
+2 1 8 9 8.182211133191731278e+02
+2 1 8 10 -8.182211133169153072e+02
+2 1 8 11 -8.182211137859801511e+02
+2 1 8 12 8.182211137816908604e+02
+2 1 8 13 8.264993232774015269e+03
+2 1 8 14 -8.538156819746645851e+02
+2 1 9 9 1.571265901502857923e+04
+2 1 9 10 -8.181856888426545993e+02
+2 1 9 11 -8.181856893070472552e+02
+2 1 9 12 8.181856893065764780e+02
+2 1 9 13 8.182211133191958652e+02
+2 1 9 14 -8.538027169003030394e+02
+2 1 10 10 1.571265901502850284e+04
+2 1 10 11 8.181856893070175829e+02
+2 1 10 12 -8.181856893065470331e+02
+2 1 10 13 -8.182211133169378172e+02
+2 1 10 14 8.538027169012425475e+02
+2 1 11 11 1.571265901595730975e+04
+2 1 11 12 -8.181856897709373015e+02
+2 1 11 13 -8.182211137860028884e+02
+2 1 11 14 8.538027170134419066e+02
+2 1 12 12 1.571265901595637115e+04
+2 1 12 13 8.182211137817134841e+02
+2 1 12 14 -8.538027170127454610e+02
+2 1 13 13 8.265993232789563990e+03
+2 1 13 14 -8.538156819746686779e+02
+2 1 14 14 1.201863624212029936e+04
+2 2 1 1 2.124174799178745306e-10
+2 3 1 1 1.500687660453044359e+00
+2 4 1 1 4.993123559081809049e-01
+2 5 1 1 1.001855804208190870e+00
+2 6 1 1 9.981442203269601521e-01
+2 7 1 1 1.001855804207636869e+00
+2 8 1 1 9.981442203275142644e-01
+2 9 1 1 5.006877520887782484e-01
+2 10 1 1 1.499312296966903268e+00
+2 11 1 1 1.207960091435130181e+02
+2 12 1 1 2.124174770029882796e-10
+2 13 1 1 6.695790699301136556e+03
+2 14 1 1 7.606749968525549832e+01
+2 15 1 1 1.062087399605518184e-10
+2 16 1 1 8.239620727230878401e+03
+*** END ***
+*** REQUEST ***
+""
+57
+16
+14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0.52428800000000000000e6 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.52428800000000000000e6 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 -0.10485760000000000000e7 0.0 0.10485760000000000000e7 0.0 0.10485760000000000000e7 -0.10485760000000000000e7 0.10485760000000000000e7 0.0 0.10485760000000000000e7 0.0 0.0 0.10485760000000000000e7 0.0 0.0 0.0 -0.10485760000000000000e7 0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6
+0 1 1 2 0.26214400000000000000e6
+0 4 1 1 0.52428800000000000000e6
+0 10 1 1 -0.52428800000000000000e6
+0 12 1 1 -0.52428800000000000000e6
+1 1 3 14 -0.26214400000000000000e6
+1 1 7 14 -0.26214400000000000000e6
+1 1 14 14 0.52428800000000000000e6
+2 1 2 3 -0.26214400000000000000e6
+2 1 2 7 -0.26214400000000000000e6
+2 1 3 8 -0.26214400000000000000e6
+2 1 7 8 -0.26214400000000000000e6
+2 1 13 14 0.26214400000000000000e6
+3 1 3 11 -0.26214400000000000000e6
+3 1 7 11 -0.26214400000000000000e6
+3 1 11 14 0.26214400000000000000e6
+4 1 3 9 -0.26214400000000000000e6
+4 1 7 9 -0.26214400000000000000e6
+4 1 9 14 0.26214400000000000000e6
+5 1 2 3 -0.26214400000000000000e6
+5 1 2 7 -0.26214400000000000000e6
+5 1 3 8 -0.26214400000000000000e6
+5 1 7 8 -0.26214400000000000000e6
+5 1 13 14 0.26214400000000000000e6
+6 1 3 7 -0.26214400000000000000e6
+6 1 7 7 -0.52428800000000000000e6
+6 1 7 14 0.26214400000000000000e6
+7 1 3 6 -0.26214400000000000000e6
+7 1 6 7 -0.26214400000000000000e6
+7 1 6 14 0.26214400000000000000e6
+8 1 1 5 0.26214400000000000000e6
+8 1 3 5 -0.26214400000000000000e6
+8 13 1 1 0.52428800000000000000e6
+9 1 1 4 0.26214400000000000000e6
+9 1 1 6 -0.26214400000000000000e6
+9 1 3 4 -0.26214400000000000000e6
+9 1 6 7 -0.26214400000000000000e6
+9 1 6 14 0.26214400000000000000e6
+9 16 1 1 0.52428800000000000000e6
+10 1 3 3 -0.52428800000000000000e6
+10 1 3 7 -0.26214400000000000000e6
+10 1 3 14 0.26214400000000000000e6
+11 1 1 2 0.26214400000000000000e6
+11 1 4 5 0.52428800000000000000e6
+11 1 5 6 -0.52428800000000000000e6
+11 2 1 1 0.52428800000000000000e6
+11 4 1 1 0.10485760000000000000e7
+11 10 1 1 -0.10485760000000000000e7
+11 12 1 1 -0.52428800000000000000e6
+12 1 2 3 -0.52428800000000000000e6
+12 1 2 7 -0.52428800000000000000e6
+13 1 2 13 -0.52428800000000000000e6
+14 1 8 12 0.52428800000000000000e6
+14 1 12 13 -0.52428800000000000000e6
+15 1 2 11 -0.52428800000000000000e6
+16 1 2 10 -0.52428800000000000000e6
+17 1 2 9 -0.52428800000000000000e6
+18 1 8 8 0.10485760000000000000e7
+18 1 8 13 -0.52428800000000000000e6
+19 1 2 7 -0.52428800000000000000e6
+20 1 2 6 -0.52428800000000000000e6
+21 1 2 5 -0.52428800000000000000e6
+22 1 4 8 0.52428800000000000000e6
+22 1 4 13 -0.52428800000000000000e6
+23 1 2 3 -0.52428800000000000000e6
+24 1 2 13 -0.52428800000000000000e6
+24 1 8 8 -0.10485760000000000000e7
+24 1 8 13 0.52428800000000000000e6
+25 1 1 2 -0.52428800000000000000e6
+26 1 1 1 0.52428800000000000000e6
+26 1 1 2 -0.26214400000000000000e6
+26 4 1 1 -0.52428800000000000000e6
+26 10 1 1 0.52428800000000000000e6
+26 12 1 1 0.52428800000000000000e6
+27 1 1 3 0.52428800000000000000e6
+27 1 4 5 0.10485760000000000000e7
+27 1 5 6 -0.10485760000000000000e7
+27 2 1 1 0.10485760000000000000e7
+27 4 1 1 0.10485760000000000000e7
+27 10 1 1 -0.10485760000000000000e7
+27 12 1 1 -0.10485760000000000000e7
+28 1 1 4 0.52428800000000000000e6
+28 1 1 6 -0.52428800000000000000e6
+28 1 1 7 0.52428800000000000000e6
+28 1 1 8 -0.52428800000000000000e6
+28 1 4 5 -0.52428800000000000000e6
+28 1 5 6 0.52428800000000000000e6
+28 4 1 1 0.10485760000000000000e7
+29 1 1 4 -0.52428800000000000000e6
+29 1 1 6 0.52428800000000000000e6
+29 1 1 9 0.52428800000000000000e6
+29 1 1 10 -0.52428800000000000000e6
+29 1 4 5 0.52428800000000000000e6
+29 1 5 6 -0.52428800000000000000e6
+29 6 1 1 -0.10485760000000000000e7
+30 1 1 4 0.52428800000000000000e6
+30 1 1 6 -0.52428800000000000000e6
+30 1 1 11 0.52428800000000000000e6
+30 1 1 12 -0.52428800000000000000e6
+30 1 4 5 -0.52428800000000000000e6
+30 1 5 6 0.52428800000000000000e6
+30 8 1 1 0.10485760000000000000e7
+31 1 1 2 -0.52428800000000000000e6
+31 1 1 8 -0.52428800000000000000e6
+31 1 1 13 0.52428800000000000000e6
+32 1 1 2 -0.52428800000000000000e6
+32 1 1 4 0.52428800000000000000e6
+32 1 1 6 -0.52428800000000000000e6
+32 1 1 8 -0.52428800000000000000e6
+32 1 1 14 0.52428800000000000000e6
+32 1 4 5 -0.52428800000000000000e6
+32 1 5 6 0.52428800000000000000e6
+32 10 1 1 0.10485760000000000000e7
+33 1 2 2 0.52428800000000000000e6
+33 1 2 13 -0.26214400000000000000e6
+33 1 8 8 -0.52428800000000000000e6
+33 1 8 13 0.26214400000000000000e6
+34 1 2 4 0.52428800000000000000e6
+34 1 4 8 0.52428800000000000000e6
+34 1 4 13 -0.52428800000000000000e6
+35 1 2 8 0.52428800000000000000e6
+35 1 8 8 0.10485760000000000000e7
+35 1 8 13 -0.52428800000000000000e6
+36 1 2 12 0.52428800000000000000e6
+36 1 8 12 0.52428800000000000000e6
+36 1 12 13 -0.52428800000000000000e6
+37 1 2 3 -0.52428800000000000000e6
+37 1 2 7 -0.52428800000000000000e6
+37 1 2 14 0.52428800000000000000e6
+38 1 2 3 -0.52428800000000000000e6
+38 1 3 8 -0.52428800000000000000e6
+38 1 3 13 0.52428800000000000000e6
+39 1 1 4 -0.52428800000000000000e6
+39 1 1 6 0.52428800000000000000e6
+39 1 4 7 -0.52428800000000000000e6
+39 1 4 14 0.52428800000000000000e6
+39 1 6 7 0.52428800000000000000e6
+39 1 6 14 -0.52428800000000000000e6
+39 16 1 1 -0.10485760000000000000e7
+40 1 1 5 0.52428800000000000000e6
+40 1 5 7 0.52428800000000000000e6
+40 1 5 14 -0.52428800000000000000e6
+40 13 1 1 0.10485760000000000000e7
+41 1 2 5 -0.52428800000000000000e6
+41 1 5 8 -0.52428800000000000000e6
+41 1 5 13 0.52428800000000000000e6
+42 1 2 6 0.52428800000000000000e6
+42 1 6 8 0.52428800000000000000e6
+42 1 6 13 -0.52428800000000000000e6
+43 1 2 7 -0.52428800000000000000e6
+43 1 7 8 -0.52428800000000000000e6
+43 1 7 13 0.52428800000000000000e6
+44 1 2 10 0.52428800000000000000e6
+44 1 8 10 0.52428800000000000000e6
+44 1 10 13 -0.52428800000000000000e6
+45 1 2 3 0.52428800000000000000e6
+45 1 2 7 0.52428800000000000000e6
+45 1 8 14 0.52428800000000000000e6
+45 1 13 14 -0.52428800000000000000e6
+46 1 2 9 -0.52428800000000000000e6
+46 1 8 9 -0.52428800000000000000e6
+46 1 9 13 0.52428800000000000000e6
+47 1 3 10 -0.52428800000000000000e6
+47 1 7 10 -0.52428800000000000000e6
+47 1 10 14 0.52428800000000000000e6
+48 1 2 11 -0.52428800000000000000e6
+48 1 8 11 -0.52428800000000000000e6
+48 1 11 13 0.52428800000000000000e6
+49 1 3 12 -0.52428800000000000000e6
+49 1 7 12 -0.52428800000000000000e6
+49 1 12 14 0.52428800000000000000e6
+50 1 2 13 -0.26214400000000000000e6
+50 1 8 13 -0.26214400000000000000e6
+50 1 13 13 0.52428800000000000000e6
+51 3 1 1 0.52428800000000000000e6
+51 4 1 1 0.52428800000000000000e6
+52 5 1 1 0.52428800000000000000e6
+52 6 1 1 0.52428800000000000000e6
+53 7 1 1 0.52428800000000000000e6
+53 8 1 1 0.52428800000000000000e6
+54 9 1 1 0.52428800000000000000e6
+54 10 1 1 0.52428800000000000000e6
+55 1 1 5 -0.26214400000000000000e6
+55 11 1 1 0.52428800000000000000e6
+56 1 1 4 -0.26214400000000000000e6
+56 1 1 6 0.26214400000000000000e6
+56 14 1 1 0.52428800000000000000e6
+57 1 4 5 -0.26214400000000000000e6
+57 1 5 6 0.26214400000000000000e6
+57 15 1 1 0.52428800000000000000e6
+*** ANSWER ***
+3.868379552285284651e-10 1.716140896673183300e-02 1.887010507909041561e-18 -1.887011350846306753e-18 -1.716140896673183647e-02 -3.868379514466956174e-10 -1.529258077468146463e-14 2.226716786986834511e-14 1.529257926809340349e-14 -3.868379483487939499e-10 4.999999996535377522e-01 1.468988068899475530e-01 3.655806780864716110e+00 -2.958428082434835417e-19 2.958414011672636043e-19 2.958419365657691193e-19 -2.958421962751351263e-19 -3.655806780864716110e+00 -1.468988068899475530e-01 5.650434192216781316e-19 -1.096678750387681879e-18 -5.650453039127628515e-19 -1.468988068899475530e-01 -3.655806781735100763e+00 -2.500000005549354309e-01 7.620756457173851622e-10 1.333765370139893885e-12 8.474097525741447204e-14 -7.528209300111621812e-13 7.528209329437565596e-13 -7.528943303977531613e-13 1.420878505077791818e-12 1.160512725217411807e-09 3.769422047936122443e-19 1.542966160466407113e-16 1.973776964115089565e-19 -3.708033867070999630e-19 7.745533947984158083e-19 -3.825797791535555980e-15 5.572005259074834639e-15 3.652411176383187275e-19 1.881024143985097735e-19 9.353314129054748893e-19 9.846500568039712263e-20 -7.548137900186535773e-19 9.846513536812299257e-20 9.435029002062635112e-19 -9.846440347899378601e-20 -9.435031548119990880e-19 5.802569020889839058e-10 2.239344287260864323e-09 1.159786191880922861e-09 1.159786191878002707e-09 7.880809140907479478e-10 5.611205849532018030e-12 8.883349249947243486e-12 9.999999993063699577e-01
+1 1 1 1 3.995619728124246285e-04
+1 1 1 2 -8.919496334440652892e-11
+1 1 1 3 6.992771783799046854e-07
+1 1 1 4 -7.439338408550898435e-07
+1 1 1 5 -1.462185406272367630e-06
+1 1 1 6 7.439338408550898435e-07
+1 1 1 7 4.442867643575931872e-08
+1 1 1 8 -3.946447634104086504e-07
+1 1 1 9 -3.946949797536921977e-07
+1 1 1 10 3.946949797536921977e-07
+1 1 1 11 3.946949812912162391e-07
+1 1 1 12 -3.946949812912162391e-07
+1 1 1 13 -3.947334626955772094e-07
+1 1 1 14 7.449495496702253169e-07
+1 1 2 2 6.084577523493345979e-04
+1 1 2 3 -1.817243459160319486e-13
+1 1 2 4 1.976262746668333763e-13
+1 1 2 5 3.834839735988989917e-13
+1 1 2 6 -1.976256455367285979e-13
+1 1 2 7 -1.255692603480728230e-14
+1 1 2 8 8.089586423386116525e-11
+1 1 2 9 1.034824245088157606e-13
+1 1 2 10 -1.034823563400300333e-13
+1 1 2 11 -1.034823913639874235e-13
+1 1 2 12 1.034827576961972078e-13
+1 1 2 13 -8.068889458348293159e-11
+1 1 2 14 -1.944077660098920254e-13
+1 1 3 3 2.028293509344407332e-04
+1 1 3 4 -4.008857899655077164e-09
+1 1 3 5 -5.837204454078767461e-09
+1 1 3 6 4.008858294598097863e-09
+1 1 3 7 2.028144950759892102e-04
+1 1 3 8 5.831943547126749890e-13
+1 1 3 9 4.946687035562542374e-13
+1 1 3 10 -4.946672485433414838e-13
+1 1 3 11 -4.946684825853077909e-13
+1 1 3 12 4.946673820300733778e-13
+1 1 3 13 4.060890502520718273e-13
+1 1 3 14 -2.028144960673724823e-04
+1 1 4 4 1.485667054826968241e-08
+1 1 4 5 4.740197736747474641e-09
+1 1 4 7 2.005819872528593574e-09
+1 1 4 8 -9.862019763098129668e-14
+1 1 4 13 9.862019763098129668e-14
+1 1 4 14 -2.005819872528593574e-09
+1 1 5 5 1.485667054826968241e-08
+1 1 5 6 -4.740197736747474641e-09
+1 1 5 7 2.921335493269826903e-09
+1 1 5 8 -1.914915350843588490e-13
+1 1 5 13 1.914915350843588490e-13
+1 1 5 14 -2.921335493269826903e-09
+1 1 6 6 1.485667054826968241e-08
+1 1 6 7 -2.005819477585531929e-09
+1 1 6 8 9.861983864016589212e-14
+1 1 6 13 -9.861983864016589212e-14
+1 1 6 14 2.005819477585531929e-09
+1 1 7 7 2.028293525586334026e-04
+1 1 7 8 4.989003691553611471e-13
+1 1 7 9 4.946687035562542374e-13
+1 1 7 10 -4.946672485433414838e-13
+1 1 7 11 -4.946684825853077909e-13
+1 1 7 12 4.946673820300733778e-13
+1 1 7 13 4.903830358093856187e-13
+1 1 7 14 -2.028144968794695082e-04
+1 1 8 8 3.042365871570146241e-04
+1 1 8 9 -5.162408889188246753e-14
+1 1 8 10 5.162402089816404663e-14
+1 1 8 11 5.162370517119469408e-14
+1 1 8 12 -5.162407655216251221e-14
+1 1 8 13 -3.042217305844493558e-04
+1 1 8 14 -3.957398123412998467e-13
+1 1 9 9 1.485667054826968241e-08
+1 1 9 13 5.162408889188246753e-14
+1 1 9 14 -4.946687035562542374e-13
+1 1 10 10 1.485667054826968241e-08
+1 1 10 13 -5.162402089816404663e-14
+1 1 10 14 4.946672485433414838e-13
+1 1 11 11 1.485667054826968241e-08
+1 1 11 13 -5.162370517119469408e-14
+1 1 11 14 4.946684825853077909e-13
+1 1 12 12 1.485667054826968241e-08
+1 1 12 13 5.162407655216251221e-14
+1 1 12 14 -4.946673820300733778e-13
+1 1 13 13 3.042365873529774447e-04
+1 1 13 14 -5.935435926234452026e-13
+1 1 14 14 2.028293545414030098e-04
+1 2 1 1 2.621439998197673995e+05
+1 3 1 1 1.174076194349972123e-03
+1 4 1 1 4.127257809435849354e-04
+1 5 1 1 6.080768396394134814e-04
+1 6 1 1 6.088662295989196371e-04
+1 7 1 1 6.080768396378825880e-04
+1 8 1 1 6.088662296004657094e-04
+1 9 1 1 4.131962229573584735e-04
+1 10 1 1 1.176125320164162630e-03
+1 11 1 1 2.956744562987712490e-06
+1 12 1 1 2.621440005798080238e+05
+1 13 1 1 3.237375044296685377e-08
+1 14 1 1 4.672290082104612332e-06
+1 15 1 1 5.242879996363529935e+05
+1 16 1 1 2.688602609263679558e-08
+2 1 1 1 2.999999999207970003e+00
+2 1 1 2 4.524042241951566429e-12
+2 1 1 3 9.999999997177934086e-01
+2 1 1 4 2.607851300892601287e+01
+2 1 1 5 8.353183410979875134e+01
+2 1 1 6 -2.607851300892923874e+01
+2 1 1 7 -2.707676620345142737e+01
+2 1 1 8 2.657676620345904439e+01
+2 1 1 9 2.657511485593848022e+01
+2 1 1 10 -2.657511485594119094e+01
+2 1 1 11 -2.657511485590708489e+01
+2 1 1 12 2.657511485590559985e+01
+2 1 1 13 2.657676620346353857e+01
+2 1 1 14 -2.607676620371028520e+01
+2 1 2 2 1.000000000023848479e+00
+2 1 2 3 -3.009330107815164661e-17
+2 1 2 4 -6.590630950981336452e-16
+2 1 2 5 7.125817630498386272e-16
+2 1 2 6 -1.118967404576836858e-16
+2 1 2 7 -7.417099457205216499e-17
+2 1 2 8 -2.389396374302699087e-12
+2 1 2 9 1.012671833609301836e-16
+2 1 2 10 -5.022997323211047086e-17
+2 1 2 11 -2.876700101402989087e-16
+2 1 2 12 -7.607763482222072623e-16
+2 1 2 13 2.383261341368581603e-12
+2 1 2 14 -1.043153862056751304e-16
+2 1 3 3 5.318569060362135133e+03
+2 1 3 4 1.512012871383825086e+03
+2 1 3 5 2.481279487030956716e+03
+2 1 3 6 -1.512012871384696382e+03
+2 1 3 7 -2.702345694795284544e+03
+2 1 3 8 4.356116458748186915e+01
+2 1 3 9 4.359365039821160082e+01
+2 1 3 10 -4.359365039729915026e+01
+2 1 3 11 -4.359365043694173636e+01
+2 1 3 12 4.359365043701030373e+01
+2 1 3 13 4.356116458748174125e+01
+2 1 3 14 2.615223365566841949e+03
+2 1 4 4 6.489697432909837516e+03
+2 1 4 5 -5.000000000572772940e-01
+2 1 4 6 -1.084246382846884217e+03
+2 1 4 7 -1.050947568334137031e+03
+2 1 4 8 2.949411326325806044e+02
+2 1 4 9 2.949202728152817485e+02
+2 1 4 10 -2.949202728150550570e+02
+2 1 4 11 -2.949202731446161465e+02
+2 1 4 12 2.949202731446176244e+02
+2 1 4 13 2.949411326325803202e+02
+2 1 4 14 4.610653030497016402e+02
+2 1 5 5 1.022566249481930754e+04
+2 1 5 6 4.999999995706878031e-01
+2 1 5 7 -2.174722033596987785e+03
+2 1 5 8 9.340822900658195067e+02
+2 1 5 9 9.339537264752490273e+02
+2 1 5 10 -9.339537264749291126e+02
+2 1 5 11 -9.339537274269861200e+02
+2 1 5 12 9.339537274269621321e+02
+2 1 5 13 9.340822900658172330e+02
+2 1 5 14 3.065574534340009336e+02
+2 1 6 6 6.489697432910379575e+03
+2 1 6 7 1.050947568334577227e+03
+2 1 6 8 -2.949411326329109784e+02
+2 1 6 9 -2.949202728153173894e+02
+2 1 6 10 2.949202728150906410e+02
+2 1 6 11 2.949202731446517873e+02
+2 1 6 12 -2.949202731446537769e+02
+2 1 6 13 -2.949411326329105805e+02
+2 1 6 14 -4.610653030501185299e+02
+2 1 7 7 4.354747440715505036e+03
+2 1 7 8 -3.003490682742935292e+02
+2 1 7 9 -3.003270382906613349e+02
+2 1 7 10 3.003270382896992032e+02
+2 1 7 11 3.003270386002092209e+02
+2 1 7 12 -3.003270386001549355e+02
+2 1 7 13 -3.003490682742929039e+02
+2 1 7 14 1.651401745920216854e+03
+2 1 8 8 2.981794010993761731e+03
+2 1 8 9 2.785302130892500827e+02
+2 1 8 10 -2.785302130901151259e+02
+2 1 8 11 -2.785302133796736257e+02
+2 1 8 12 2.785302133795733539e+02
+2 1 8 13 2.980794010993755819e+03
+2 1 8 14 -2.567879036868117737e+02
+2 1 9 9 5.683943015112485227e+03
+2 1 9 10 -2.784919650492902861e+02
+2 1 9 11 -2.784919653394483703e+02
+2 1 9 12 2.784919653394323404e+02
+2 1 9 13 2.785302130892495711e+02
+2 1 9 14 -2.567333878924498549e+02
+2 1 10 10 5.683943015112533431e+03
+2 1 10 11 2.784919653394723582e+02
+2 1 10 12 -2.784919653394562715e+02
+2 1 10 13 -2.785302130901145574e+02
+2 1 10 14 2.567333878924002306e+02
+2 1 11 11 5.683943015692854715e+03
+2 1 11 12 -2.784919656296138442e+02
+2 1 11 13 -2.785302133796730573e+02
+2 1 11 14 2.567333881632676480e+02
+2 1 12 12 5.683943015692811969e+03
+2 1 12 13 2.785302133795728423e+02
+2 1 12 14 -2.567333881631447525e+02
+2 1 13 13 2.981794010993764005e+03
+2 1 13 14 -2.567879036868112621e+02
+2 1 14 14 4.267625111487064714e+03
+2 2 1 1 4.806666407713272888e-10
+2 3 1 1 5.034936108100167562e-01
+2 4 1 1 1.496506389228141831e+00
+2 5 1 1 1.006796305802390767e+00
+2 6 1 1 9.932036942166911908e-01
+2 7 1 1 1.006796305803040026e+00
+2 8 1 1 9.932036942160419324e-01
+2 9 1 1 1.503493610457855789e+00
+2 10 1 1 4.965063895548704198e-01
+2 11 1 1 8.453183410979833923e+01
+2 12 1 1 4.805422203179685806e-10
+2 13 1 1 2.398747652921155805e+03
+2 14 1 1 5.315702601785440606e+01
+2 15 1 1 2.403334600545797478e-10
+2 16 1 1 2.972868716750660496e+03
+*** END ***
+*** REQUEST ***
+""
+1
+5
+1 1 1 1 1
+0.10485760000000000000e7
+0 1 1 1 0.52428800000000000000e6
+1 1 1 1 0.10485760000000000000e7
+1 3 1 1 0.52428800000000000000e6
+1 4 1 1 0.52428800000000000000e6
+*** ANSWER ***
+5.000000015457306546e-01
+1 1 1 1 1.637801221075657924e-03
+1 2 1 1 1.556432066071474946e-05
+1 3 1 1 2.621440008259723545e+05
+1 4 1 1 2.621440008259723545e+05
+1 5 1 1 1.556432066071474946e-05
+2 1 1 1 9.999999999999993339e-01
+2 2 1 1 5.258797495207707584e+01
+2 3 1 1 6.452673897300557502e-16
+2 4 1 1 6.452673897300557502e-16
+2 5 1 1 5.258797495207707584e+01
+*** END ***
+*** REQUEST ***
+""
+57
+16
+14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.10485760000000000000e7 0.0 0.0 0.0 -0.10485760000000000000e7 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.10485760000000000000e7 0.0 0.10485760000000000000e7 -0.10485760000000000000e7 0.10485760000000000000e7 0.0 0.10485760000000000000e7 -0.10485760000000000000e7 0.0 0.0 -0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6
+0 1 1 2 0.13107200000000000000e6
+0 1 4 5 -0.26214400000000000000e6
+0 1 5 6 0.26214400000000000000e6
+0 2 1 1 -0.26214400000000000000e6
+0 4 1 1 0.26214400000000000000e6
+0 10 1 1 -0.26214400000000000000e6
+0 12 1 1 -0.26214400000000000000e6
+1 1 3 14 -0.52428800000000000000e6
+2 1 2 3 0.52428800000000000000e6
+2 1 3 8 -0.52428800000000000000e6
+3 1 3 12 -0.52428800000000000000e6
+4 1 3 11 -0.52428800000000000000e6
+5 1 3 10 -0.52428800000000000000e6
+6 1 7 9 -0.52428800000000000000e6
+6 1 9 14 0.52428800000000000000e6
+7 1 3 8 -0.52428800000000000000e6
+8 1 7 7 -0.10485760000000000000e7
+8 1 7 14 0.52428800000000000000e6
+9 1 3 6 -0.52428800000000000000e6
+10 1 3 5 -0.52428800000000000000e6
+11 1 3 4 -0.52428800000000000000e6
+12 1 3 14 0.52428800000000000000e6
+12 1 7 7 -0.10485760000000000000e7
+12 1 7 14 0.52428800000000000000e6
+13 1 2 3 -0.52428800000000000000e6
+14 1 1 2 -0.26214400000000000000e6
+14 1 4 5 0.52428800000000000000e6
+14 1 5 6 -0.52428800000000000000e6
+14 2 1 1 0.52428800000000000000e6
+14 4 1 1 0.52428800000000000000e6
+14 10 1 1 -0.52428800000000000000e6
+14 12 1 1 -0.52428800000000000000e6
+15 1 2 3 0.26214400000000000000e6
+15 1 2 7 -0.26214400000000000000e6
+15 1 3 8 -0.26214400000000000000e6
+15 1 7 8 0.26214400000000000000e6
+15 1 13 14 -0.26214400000000000000e6
+16 1 2 13 -0.26214400000000000000e6
+16 1 8 13 0.26214400000000000000e6
+16 1 13 13 -0.52428800000000000000e6
+17 1 2 12 -0.26214400000000000000e6
+17 1 8 12 0.26214400000000000000e6
+17 1 12 13 -0.26214400000000000000e6
+18 1 2 10 -0.26214400000000000000e6
+18 1 8 10 0.26214400000000000000e6
+18 1 10 13 -0.26214400000000000000e6
+19 1 2 2 -0.52428800000000000000e6
+19 1 2 13 -0.26214400000000000000e6
+19 1 8 8 0.52428800000000000000e6
+19 1 8 13 -0.26214400000000000000e6
+20 1 2 3 0.26214400000000000000e6
+20 1 2 7 -0.26214400000000000000e6
+20 1 3 8 -0.26214400000000000000e6
+20 1 7 8 0.26214400000000000000e6
+20 1 13 14 -0.26214400000000000000e6
+21 1 1 4 -0.26214400000000000000e6
+21 1 1 6 0.26214400000000000000e6
+21 1 2 6 -0.26214400000000000000e6
+21 1 4 8 0.26214400000000000000e6
+21 1 4 13 -0.26214400000000000000e6
+21 16 1 1 -0.52428800000000000000e6
+22 1 2 4 -0.26214400000000000000e6
+22 1 4 8 0.26214400000000000000e6
+22 1 4 13 -0.26214400000000000000e6
+23 1 1 2 -0.13107200000000000000e6
+23 1 4 5 -0.26214400000000000000e6
+23 1 5 6 0.26214400000000000000e6
+23 2 1 1 -0.26214400000000000000e6
+23 4 1 1 0.26214400000000000000e6
+23 10 1 1 -0.26214400000000000000e6
+23 12 1 1 0.26214400000000000000e6
+24 1 1 1 0.52428800000000000000e6
+24 1 1 2 -0.13107200000000000000e6
+24 1 4 5 0.26214400000000000000e6
+24 1 5 6 -0.26214400000000000000e6
+24 2 1 1 0.26214400000000000000e6
+24 4 1 1 -0.26214400000000000000e6
+24 10 1 1 0.26214400000000000000e6
+24 12 1 1 0.26214400000000000000e6
+25 1 1 2 -0.26214400000000000000e6
+25 1 1 3 0.52428800000000000000e6
+25 1 4 5 0.52428800000000000000e6
+25 1 5 6 -0.52428800000000000000e6
+25 2 1 1 0.52428800000000000000e6
+25 4 1 1 0.52428800000000000000e6
+25 10 1 1 -0.52428800000000000000e6
+25 12 1 1 -0.52428800000000000000e6
+26 1 1 4 0.52428800000000000000e6
+26 1 1 6 -0.52428800000000000000e6
+26 1 1 7 0.52428800000000000000e6
+26 1 1 8 -0.52428800000000000000e6
+26 1 4 5 -0.52428800000000000000e6
+26 1 5 6 0.52428800000000000000e6
+26 4 1 1 0.10485760000000000000e7
+27 1 1 4 -0.52428800000000000000e6
+27 1 1 6 0.52428800000000000000e6
+27 1 1 9 0.52428800000000000000e6
+27 1 1 10 -0.52428800000000000000e6
+27 1 4 5 0.52428800000000000000e6
+27 1 5 6 -0.52428800000000000000e6
+27 6 1 1 -0.10485760000000000000e7
+28 1 1 4 0.52428800000000000000e6
+28 1 1 6 -0.52428800000000000000e6
+28 1 1 11 0.52428800000000000000e6
+28 1 1 12 -0.52428800000000000000e6
+28 1 4 5 -0.52428800000000000000e6
+28 1 5 6 0.52428800000000000000e6
+28 8 1 1 0.10485760000000000000e7
+29 1 1 2 0.26214400000000000000e6
+29 1 1 8 -0.52428800000000000000e6
+29 1 1 13 0.52428800000000000000e6
+29 1 4 5 -0.52428800000000000000e6
+29 1 5 6 0.52428800000000000000e6
+29 2 1 1 -0.52428800000000000000e6
+29 4 1 1 0.52428800000000000000e6
+29 10 1 1 -0.52428800000000000000e6
+29 12 1 1 0.52428800000000000000e6
+30 1 1 2 0.26214400000000000000e6
+30 1 1 4 0.52428800000000000000e6
+30 1 1 6 -0.52428800000000000000e6
+30 1 1 8 -0.52428800000000000000e6
+30 1 1 14 0.52428800000000000000e6
+30 1 4 5 -0.10485760000000000000e7
+30 1 5 6 0.10485760000000000000e7
+30 2 1 1 -0.52428800000000000000e6
+30 4 1 1 0.52428800000000000000e6
+30 10 1 1 0.52428800000000000000e6
+30 12 1 1 0.52428800000000000000e6
+31 1 2 2 -0.10485760000000000000e7
+31 1 2 8 0.52428800000000000000e6
+31 1 2 13 -0.52428800000000000000e6
+32 1 2 3 0.52428800000000000000e6
+32 1 2 7 -0.52428800000000000000e6
+32 1 2 14 0.52428800000000000000e6
+33 1 3 3 0.52428800000000000000e6
+33 1 3 14 0.26214400000000000000e6
+33 1 7 7 -0.52428800000000000000e6
+33 1 7 14 0.26214400000000000000e6
+34 1 3 7 0.52428800000000000000e6
+34 1 7 7 -0.10485760000000000000e7
+34 1 7 14 0.52428800000000000000e6
+35 1 3 9 0.52428800000000000000e6
+35 1 7 9 -0.52428800000000000000e6
+35 1 9 14 0.52428800000000000000e6
+36 1 2 3 0.52428800000000000000e6
+36 1 3 8 -0.52428800000000000000e6
+36 1 3 13 0.52428800000000000000e6
+37 1 3 4 0.52428800000000000000e6
+37 1 4 7 -0.52428800000000000000e6
+37 1 4 14 0.52428800000000000000e6
+38 1 3 5 -0.52428800000000000000e6
+38 1 5 7 0.52428800000000000000e6
+38 1 5 14 -0.52428800000000000000e6
+39 1 2 5 0.52428800000000000000e6
+39 1 5 8 -0.52428800000000000000e6
+39 1 5 13 0.52428800000000000000e6
+40 1 1 4 0.52428800000000000000e6
+40 1 1 6 -0.52428800000000000000e6
+40 1 4 8 -0.52428800000000000000e6
+40 1 4 13 0.52428800000000000000e6
+40 1 6 8 0.52428800000000000000e6
+40 1 6 13 -0.52428800000000000000e6
+40 16 1 1 0.10485760000000000000e7
+41 1 3 6 0.52428800000000000000e6
+41 1 6 7 -0.52428800000000000000e6
+41 1 6 14 0.52428800000000000000e6
+42 1 3 11 -0.52428800000000000000e6
+42 1 7 11 0.52428800000000000000e6
+42 1 11 14 -0.52428800000000000000e6
+43 1 2 3 0.52428800000000000000e6
+43 1 3 8 -0.52428800000000000000e6
+43 1 7 13 0.52428800000000000000e6
+43 1 13 14 -0.52428800000000000000e6
+44 1 3 8 0.52428800000000000000e6
+44 1 7 8 -0.52428800000000000000e6
+44 1 8 14 0.52428800000000000000e6
+45 1 2 9 0.52428800000000000000e6
+45 1 8 9 -0.52428800000000000000e6
+45 1 9 13 0.52428800000000000000e6
+46 1 3 10 0.52428800000000000000e6
+46 1 7 10 -0.52428800000000000000e6
+46 1 10 14 0.52428800000000000000e6
+47 1 2 11 0.52428800000000000000e6
+47 1 8 11 -0.52428800000000000000e6
+47 1 11 13 0.52428800000000000000e6
+48 1 3 12 0.52428800000000000000e6
+48 1 7 12 -0.52428800000000000000e6
+48 1 12 14 0.52428800000000000000e6
+49 1 3 14 0.26214400000000000000e6
+49 1 7 14 -0.26214400000000000000e6
+49 1 14 14 0.52428800000000000000e6
+50 3 1 1 0.52428800000000000000e6
+50 4 1 1 0.52428800000000000000e6
+51 5 1 1 0.52428800000000000000e6
+51 6 1 1 0.52428800000000000000e6
+52 7 1 1 0.52428800000000000000e6
+52 8 1 1 0.52428800000000000000e6
+53 9 1 1 0.52428800000000000000e6
+53 10 1 1 0.52428800000000000000e6
+54 1 1 5 -0.26214400000000000000e6
+54 11 1 1 0.52428800000000000000e6
+55 1 1 5 0.26214400000000000000e6
+55 1 2 5 -0.26214400000000000000e6
+55 13 1 1 0.52428800000000000000e6
+56 1 1 4 -0.26214400000000000000e6
+56 1 1 6 0.26214400000000000000e6
+56 14 1 1 0.52428800000000000000e6
+57 1 4 5 -0.26214400000000000000e6
+57 1 5 6 0.26214400000000000000e6
+57 15 1 1 0.52428800000000000000e6
+*** ANSWER ***
+1.221402696163250923e+00 -3.293060370869250509e-05 -4.188337917944486132e-18 4.188338254600470878e-18 4.188338473154306862e-18 -4.188338266147940838e-18 3.293060370868410253e-05 -1.221402696163250923e+00 9.926119328612696424e-18 -1.669637434638399824e-17 -9.926120883622910204e-18 1.221402695332481469e+00 -3.293060370867694679e-05 -4.999999997011250752e-01 6.249701222995608825e-03 -3.692367837452580085e-10 -6.053601533648301017e-18 6.053600452798585197e-18 3.692367716001512127e-10 -6.249701222995596682e-03 -4.027784065141067462e-15 4.027749647294536924e-15 -1.088749566049830145e-09 4.881027849945401928e-10 -4.311926705086775527e-16 3.218856885793925345e-13 -3.269239244870775183e-13 3.269239088676821326e-13 -6.221567972828224737e-13 3.319552824260459377e-13 -3.692367665814274919e-10 4.077931072512487266e-18 1.107689614733570469e-09 -2.826865791050693000e-15 2.501165581504581713e-19 5.097016654315591844e-19 -8.630341403109616845e-18 1.528440598164478935e-17 1.662660756242604374e-15 1.015324153748838147e-15 8.630340007897694766e-18 -3.938221834988663153e-18 4.514743832414753329e-18 2.692149026436390306e-18 3.026723115720196531e-18 3.938221985832512289e-18 -3.026723394197058581e-18 -3.938221462986645428e-18 5.538547080964100808e-10 1.000000001050297405e+00 1.107384166400140085e-09 1.107384166415765527e-09 5.612402384629803952e-10 2.379631614956623578e-12 9.909181227401662177e-15 3.764822979915892989e-12 2.172563854721238170e-09
+1 1 1 1 2.559107656991269682e-04
+1 1 1 2 3.038478831978721453e-07
+1 1 1 3 -2.260691428356535367e-10
+1 1 1 4 -2.997320256907811880e-07
+1 1 1 5 -6.212085176675126346e-07
+1 1 1 6 2.997320256907811880e-07
+1 1 1 7 1.687608038939125531e-07
+1 1 1 8 -1.661163207268292968e-08
+1 1 1 9 -1.714022905214808979e-07
+1 1 1 10 1.714022905214808979e-07
+1 1 1 11 1.714022823324193299e-07
+1 1 1 12 -1.714022823324193299e-07
+1 1 1 13 -3.261893429338164291e-07
+1 1 1 14 1.740401711125867726e-07
+1 1 2 2 1.935907360060968294e-04
+1 1 2 3 -2.737889339892650699e-13
+1 1 2 4 -1.055850403540379087e-09
+1 1 2 5 -1.725919321107051013e-09
+1 1 2 6 1.055859425972339989e-09
+1 1 2 7 -5.311836125581529677e-12
+1 1 2 8 -1.935864058774434569e-04
+1 1 2 9 1.586874608894710399e-12
+1 1 2 10 -1.586915037098432318e-12
+1 1 2 11 -1.586874754896787450e-12
+1 1 2 12 1.586915320436700222e-12
+1 1 2 13 1.935864090612102650e-04
+1 1 2 14 2.138010326145426924e-12
+1 1 3 3 5.807527054893437280e-04
+1 1 3 4 6.793616322793478939e-13
+1 1 3 5 7.402780700123916631e-13
+1 1 3 6 -6.793615484990338571e-13
+1 1 3 7 -1.482091811858385732e-09
+1 1 3 8 -4.937550747648890592e-15
+1 1 3 9 1.311331100395874137e-13
+1 1 3 10 -1.311330729049692346e-13
+1 1 3 11 -1.311330374054326211e-13
+1 1 3 12 1.311330559369361346e-13
+1 1 3 13 2.672304667657813017e-13
+1 1 3 14 1.481829518440312462e-09
+1 1 4 4 4.332759909520270865e-09
+1 1 4 5 4.372143951502727829e-10
+1 1 4 7 4.524784433553534796e-12
+1 1 4 8 -5.323312923526292742e-10
+1 1 4 13 5.323312923526292742e-10
+1 1 4 14 -4.524784433553534796e-12
+1 1 5 5 4.332759909520270865e-09
+1 1 5 6 -4.372143951502727829e-10
+1 1 5 7 8.013430643304583317e-12
+1 1 5 8 -8.717130825689225622e-10
+1 1 5 13 8.717130825689225622e-10
+1 1 5 14 -8.013430643304583317e-12
+1 1 6 6 4.332759909520270865e-09
+1 1 6 7 -4.524783702060666594e-12
+1 1 6 8 5.323222699206708543e-10
+1 1 6 13 -5.323222699206708543e-10
+1 1 6 14 4.524783702060666594e-12
+1 1 7 7 2.903837017928020004e-04
+1 1 7 8 1.762364370663825602e-12
+1 1 7 9 2.064762382842585354e-12
+1 1 7 10 -2.064762528508156203e-12
+1 1 7 11 -2.064762449422536227e-12
+1 1 7 12 2.064762254386342358e-12
+1 1 7 13 2.367026014409066193e-12
+1 1 7 14 -2.903793731156716659e-04
+1 1 8 8 1.935907412686095857e-04
+1 1 8 9 -1.586874608894710399e-12
+1 1 8 10 1.586915037098432318e-12
+1 1 8 11 1.586874754896787450e-12
+1 1 8 12 -1.586915320436700222e-12
+1 1 8 13 -1.935864116924664263e-04
+1 1 8 14 1.411461428772282201e-12
+1 1 9 9 4.332759909520270865e-09
+1 1 9 13 1.586874608894710399e-12
+1 1 9 14 -2.064762382842585354e-12
+1 1 10 10 4.332759909520270865e-09
+1 1 10 13 -1.586915037098432318e-12
+1 1 10 14 2.064762528508156203e-12
+1 1 11 11 4.332759909520270865e-09
+1 1 11 13 -1.586874754896787450e-12
+1 1 11 14 2.064762449422536227e-12
+1 1 12 12 4.332759909520270865e-09
+1 1 12 13 1.586915320436700222e-12
+1 1 12 14 -2.064762254386342358e-12
+1 1 13 13 1.935907476361433646e-04
+1 1 13 14 -5.540851813845173794e-12
+1 1 14 14 2.903837099583601823e-04
+1 2 1 1 5.702149548706822923e-04
+1 3 1 1 5.242880005506626330e+05
+1 4 1 1 2.941820619081463441e-04
+1 5 1 1 5.805925625935061786e-04
+1 6 1 1 5.809353671745492087e-04
+1 7 1 1 5.805925626016984102e-04
+1 8 1 1 5.809353671663638075e-04
+1 9 1 1 2.942558549031886535e-04
+1 10 1 1 5.242880005514220102e+05
+1 11 1 1 1.251945060051898778e-06
+1 12 1 1 5.242879996856997022e+05
+1 13 1 1 9.528024716872241796e-09
+1 14 1 1 1.978184270403664431e-06
+1 15 1 1 1.139053491023998051e-03
+1 16 1 1 7.509123301306296067e-09
+2 1 1 1 4.000000073411537294e+00
+2 1 1 2 2.000000069785994761e+00
+2 1 1 3 2.012925787506997635e-08
+2 1 1 4 4.347459280228998324e+01
+2 1 1 5 1.378217310642983193e+02
+2 1 1 6 -4.347459280227454315e+01
+2 1 1 7 -4.372622325318651804e+01
+2 1 1 8 4.472622331287009700e+01
+2 1 1 9 4.372710326630356548e+01
+2 1 1 10 -4.372710326628641297e+01
+2 1 1 11 -4.372710326279087667e+01
+2 1 1 12 4.372710326278903636e+01
+2 1 1 13 4.272622328003724590e+01
+2 1 1 14 -4.372622334224728036e+01
+2 1 2 2 1.541187400830791739e+04
+2 1 2 3 -2.993524434064855655e-15
+2 1 2 4 4.351025967875229071e+03
+2 1 2 5 7.149390145762315115e+03
+2 1 2 6 -4.351025967872932597e+03
+2 1 2 7 -6.006936427926477506e+01
+2 1 2 8 7.765506368523986566e+03
+2 1 2 9 5.811527365026090308e+01
+2 1 2 10 -5.811527364573699828e+01
+2 1 2 11 -5.811527529188755636e+01
+2 1 2 12 5.811527529412980186e+01
+2 1 2 13 -7.645367639778919511e+03
+2 1 2 14 -6.006936427928068412e+01
+2 1 3 3 1.000000035520358876e+00
+2 1 3 4 1.512393946426647244e-16
+2 1 3 5 3.294442491260816002e-14
+2 1 3 6 -3.789703996106484015e-15
+2 1 3 7 3.552468280336770897e-09
+2 1 3 8 3.036674746864050346e-16
+2 1 3 9 -3.783040319851762759e-14
+2 1 3 10 -1.441804293638299598e-14
+2 1 3 11 -8.750516770618630082e-15
+2 1 3 12 4.412137788013603617e-15
+2 1 3 13 3.848948916631264713e-15
+2 1 3 14 -3.552264835159767893e-09
+2 1 4 4 1.884046827141310496e+04
+2 1 4 5 -2.516304625667646899e-01
+2 1 4 6 -3.224764829979240858e+03
+2 1 4 7 -8.570688718517942561e+02
+2 1 4 8 3.032581855782677849e+03
+2 1 4 9 8.559017898784620684e+02
+2 1 4 10 -8.559017898770283637e+02
+2 1 4 11 -8.559017885595933421e+02
+2 1 4 12 8.559017885602174829e+02
+2 1 4 13 -1.318444112092502564e+03
+2 1 4 14 -8.570688718517842517e+02
+2 1 5 5 2.992679210925188454e+04
+2 1 5 6 2.516304637375451625e-01
+2 1 5 7 -2.741976844947480458e+03
+2 1 5 8 6.316671917719366320e+03
+2 1 5 9 2.740998926486116488e+03
+2 1 5 10 -2.740998926483481227e+03
+2 1 5 11 -2.740998913624653596e+03
+2 1 5 12 2.740998913625663135e+03
+2 1 5 13 -8.327182280425420231e+02
+2 1 5 14 -2.741976844947408608e+03
+2 1 6 6 1.884046827141212998e+04
+2 1 6 7 8.570688718534410100e+02
+2 1 6 8 -3.032581855779410944e+03
+2 1 6 9 -8.559017898782685734e+02
+2 1 6 10 8.559017898768363466e+02
+2 1 6 11 8.559017885594005293e+02
+2 1 6 12 -8.559017885600251248e+02
+2 1 6 13 1.318444112096767867e+03
+2 1 6 14 8.570688718534313466e+02
+2 1 7 7 8.643530917774662157e+03
+2 1 7 8 -8.652138792836501580e+02
+2 1 7 9 -8.348512950079091297e+02
+2 1 7 10 8.348512950077265486e+02
+2 1 7 11 8.348512907289283476e+02
+2 1 7 12 -8.348512907282921560e+02
+2 1 7 13 -8.051445150043837202e+02
+2 1 7 14 8.642530917770918677e+03
+2 1 8 8 1.255631878376251188e+04
+2 1 8 9 8.639089317903996061e+02
+2 1 8 10 -8.639089317861210020e+02
+2 1 8 11 -8.639089283274954596e+02
+2 1 8 12 8.639089283289644072e+02
+2 1 8 13 4.789812415224353572e+03
+2 1 8 14 -8.652138792836132097e+02
+2 1 9 9 1.645026211356865315e+04
+2 1 9 10 -8.345586721350839525e+02
+2 1 9 11 -8.345586678553106594e+02
+2 1 9 12 8.345586678553008824e+02
+2 1 9 13 8.057936581401659168e+02
+2 1 9 14 -8.348512950078852555e+02
+2 1 10 10 1.645026211356830026e+04
+2 1 10 11 8.345586678551314890e+02
+2 1 10 12 -8.345586678551223940e+02
+2 1 10 13 -8.057936581403889704e+02
+2 1 10 14 8.348512950077029018e+02
+2 1 11 11 1.645026210500874731e+04
+2 1 11 12 -8.345586635753495557e+02
+2 1 11 13 -8.057936530356349749e+02
+2 1 11 14 8.348512907289044733e+02
+2 1 12 12 1.645026210500871821e+04
+2 1 12 13 8.057936530348393944e+02
+2 1 12 14 -8.348512907282683955e+02
+2 1 13 13 1.243618005501262996e+04
+2 1 13 14 -8.051445150043309695e+02
+2 1 14 14 8.643530917788486477e+03
+2 2 1 1 1.006521832783320525e+00
+2 3 1 1 2.315972663288398288e-10
+2 4 1 1 2.000000025680388038e+00
+2 5 1 1 9.982400214147868489e-01
+2 6 1 1 1.001760006998753116e+00
+2 7 1 1 9.982400214152140627e-01
+2 8 1 1 1.001760006998325903e+00
+2 9 1 1 2.000000013977859314e+00
+2 10 1 1 2.315972663252945327e-10
+2 11 1 1 1.388217310643130702e+02
+2 12 1 1 2.315972702990203578e-10
+2 13 1 1 7.012568414698878769e+03
+2 14 1 1 8.794918560463305823e+01
+2 15 1 1 4.967391273615149316e-01
+2 16 1 1 8.616102750143676531e+03
+*** END ***
+*** REQUEST ***
+""
+47
+20
+14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0.0 -0.26214400000000000000e6 0.0 0.0 0.0 0.52428800000000000000e6 -0.26214400000000000000e6 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.52428800000000000000e6 -0.52428800000000000000e6 0.0 0.0 -0.52428800000000000000e6 -0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0 -0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.0 0.0 0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6
+0 1 1 2 0.13107200000000000000e6
+0 1 4 5 -0.26214400000000000000e6
+0 1 5 6 0.26214400000000000000e6
+0 2 1 1 -0.26214400000000000000e6
+0 12 1 1 -0.26214400000000000000e6
+1 1 2 3 0.26214400000000000000e6
+1 1 2 7 -0.26214400000000000000e6
+1 1 3 8 -0.26214400000000000000e6
+1 1 7 8 0.26214400000000000000e6
+1 1 13 14 -0.26214400000000000000e6
+2 1 2 13 -0.26214400000000000000e6
+2 1 8 13 0.26214400000000000000e6
+2 1 13 13 -0.52428800000000000000e6
+3 1 2 12 -0.26214400000000000000e6
+3 1 8 12 0.26214400000000000000e6
+3 1 12 13 -0.26214400000000000000e6
+4 1 2 10 -0.26214400000000000000e6
+4 1 8 10 0.26214400000000000000e6
+4 1 10 13 -0.26214400000000000000e6
+5 1 2 2 -0.52428800000000000000e6
+5 1 2 13 -0.26214400000000000000e6
+5 1 8 8 0.52428800000000000000e6
+5 1 8 13 -0.26214400000000000000e6
+6 1 1 2 0.13107200000000000000e6
+6 1 2 7 -0.26214400000000000000e6
+6 1 3 8 -0.26214400000000000000e6
+6 1 4 5 -0.26214400000000000000e6
+6 1 5 6 0.26214400000000000000e6
+6 1 7 8 0.26214400000000000000e6
+6 1 13 14 -0.26214400000000000000e6
+6 2 1 1 -0.26214400000000000000e6
+6 4 1 1 0.52428800000000000000e6
+6 10 1 1 -0.52428800000000000000e6
+6 12 1 1 0.78643200000000000000e6
+6 16 1 1 0.52428800000000000000e6
+7 1 1 4 -0.26214400000000000000e6
+7 1 1 6 0.26214400000000000000e6
+7 1 2 6 -0.26214400000000000000e6
+7 1 4 8 0.26214400000000000000e6
+7 1 4 13 -0.26214400000000000000e6
+7 20 1 1 -0.52428800000000000000e6
+8 1 2 4 -0.26214400000000000000e6
+8 1 4 8 0.26214400000000000000e6
+8 1 4 13 -0.26214400000000000000e6
+9 1 1 2 0.13107200000000000000e6
+9 1 2 3 -0.26214400000000000000e6
+9 1 4 5 -0.26214400000000000000e6
+9 1 5 6 0.26214400000000000000e6
+9 2 1 1 -0.26214400000000000000e6
+9 4 1 1 0.52428800000000000000e6
+9 10 1 1 -0.52428800000000000000e6
+9 12 1 1 0.78643200000000000000e6
+9 16 1 1 0.52428800000000000000e6
+10 1 1 2 -0.13107200000000000000e6
+10 1 4 5 -0.26214400000000000000e6
+10 1 5 6 0.26214400000000000000e6
+10 2 1 1 -0.26214400000000000000e6
+10 4 1 1 0.52428800000000000000e6
+10 10 1 1 -0.52428800000000000000e6
+10 12 1 1 0.26214400000000000000e6
+11 1 1 1 0.52428800000000000000e6
+11 1 1 2 -0.13107200000000000000e6
+11 1 4 5 0.26214400000000000000e6
+11 1 5 6 -0.26214400000000000000e6
+11 2 1 1 0.26214400000000000000e6
+11 12 1 1 0.26214400000000000000e6
+12 1 1 2 -0.26214400000000000000e6
+12 1 1 3 0.52428800000000000000e6
+12 1 4 5 0.52428800000000000000e6
+12 1 5 6 -0.52428800000000000000e6
+12 2 1 1 0.52428800000000000000e6
+12 12 1 1 -0.52428800000000000000e6
+13 1 1 4 0.52428800000000000000e6
+13 1 1 6 -0.52428800000000000000e6
+13 1 1 7 0.52428800000000000000e6
+13 1 1 8 -0.52428800000000000000e6
+13 1 4 5 -0.52428800000000000000e6
+13 1 5 6 0.52428800000000000000e6
+13 4 1 1 0.10485760000000000000e7
+14 1 1 4 -0.52428800000000000000e6
+14 1 1 6 0.52428800000000000000e6
+14 1 1 9 0.52428800000000000000e6
+14 1 1 10 -0.52428800000000000000e6
+14 1 4 5 0.52428800000000000000e6
+14 1 5 6 -0.52428800000000000000e6
+14 6 1 1 -0.10485760000000000000e7
+15 1 1 4 0.52428800000000000000e6
+15 1 1 6 -0.52428800000000000000e6
+15 1 1 11 0.52428800000000000000e6
+15 1 1 12 -0.52428800000000000000e6
+15 1 4 5 -0.52428800000000000000e6
+15 1 5 6 0.52428800000000000000e6
+15 8 1 1 0.10485760000000000000e7
+16 1 1 2 0.26214400000000000000e6
+16 1 1 8 -0.52428800000000000000e6
+16 1 1 13 0.52428800000000000000e6
+16 1 4 5 -0.52428800000000000000e6
+16 1 5 6 0.52428800000000000000e6
+16 2 1 1 -0.52428800000000000000e6
+16 4 1 1 0.10485760000000000000e7
+16 10 1 1 -0.10485760000000000000e7
+16 12 1 1 0.52428800000000000000e6
+17 1 1 2 0.26214400000000000000e6
+17 1 1 4 0.52428800000000000000e6
+17 1 1 6 -0.52428800000000000000e6
+17 1 1 8 -0.52428800000000000000e6
+17 1 1 14 0.52428800000000000000e6
+17 1 4 5 -0.10485760000000000000e7
+17 1 5 6 0.10485760000000000000e7
+17 2 1 1 -0.52428800000000000000e6
+17 4 1 1 0.10485760000000000000e7
+17 12 1 1 0.52428800000000000000e6
+18 1 2 2 -0.10485760000000000000e7
+18 1 2 8 0.52428800000000000000e6
+18 1 2 13 -0.52428800000000000000e6
+19 1 2 3 0.52428800000000000000e6
+19 1 2 7 -0.52428800000000000000e6
+19 1 2 14 0.52428800000000000000e6
+20 1 3 3 0.52428800000000000000e6
+20 1 3 14 0.26214400000000000000e6
+20 1 7 7 -0.52428800000000000000e6
+20 1 7 14 0.26214400000000000000e6
+21 1 1 5 -0.52428800000000000000e6
+21 1 3 5 0.52428800000000000000e6
+21 13 1 1 -0.10485760000000000000e7
+22 1 3 7 0.52428800000000000000e6
+22 1 7 7 -0.10485760000000000000e7
+22 1 7 14 0.52428800000000000000e6
+23 1 3 9 0.52428800000000000000e6
+23 1 7 9 -0.52428800000000000000e6
+23 1 9 14 0.52428800000000000000e6
+24 1 1 2 0.26214400000000000000e6
+24 1 3 8 -0.52428800000000000000e6
+24 1 3 13 0.52428800000000000000e6
+24 1 4 5 -0.52428800000000000000e6
+24 1 5 6 0.52428800000000000000e6
+24 2 1 1 -0.52428800000000000000e6
+24 4 1 1 0.10485760000000000000e7
+24 10 1 1 -0.10485760000000000000e7
+24 12 1 1 0.15728640000000000000e7
+24 16 1 1 0.10485760000000000000e7
+25 1 3 4 0.52428800000000000000e6
+25 1 4 7 -0.52428800000000000000e6
+25 1 4 14 0.52428800000000000000e6
+26 1 1 5 -0.52428800000000000000e6
+26 1 5 7 0.52428800000000000000e6
+26 1 5 14 -0.52428800000000000000e6
+26 13 1 1 -0.10485760000000000000e7
+27 1 2 5 0.52428800000000000000e6
+27 1 5 8 -0.52428800000000000000e6
+27 1 5 13 0.52428800000000000000e6
+28 1 1 4 0.52428800000000000000e6
+28 1 1 6 -0.52428800000000000000e6
+28 1 4 8 -0.52428800000000000000e6
+28 1 4 13 0.52428800000000000000e6
+28 1 6 8 0.52428800000000000000e6
+28 1 6 13 -0.52428800000000000000e6
+28 20 1 1 0.10485760000000000000e7
+29 1 3 6 0.52428800000000000000e6
+29 1 6 7 -0.52428800000000000000e6
+29 1 6 14 0.52428800000000000000e6
+30 1 3 11 -0.52428800000000000000e6
+30 1 7 11 0.52428800000000000000e6
+30 1 11 14 -0.52428800000000000000e6
+31 1 1 2 0.26214400000000000000e6
+31 1 3 8 -0.52428800000000000000e6
+31 1 4 5 -0.52428800000000000000e6
+31 1 5 6 0.52428800000000000000e6
+31 1 7 13 0.52428800000000000000e6
+31 1 13 14 -0.52428800000000000000e6
+31 2 1 1 -0.52428800000000000000e6
+31 4 1 1 0.10485760000000000000e7
+31 10 1 1 -0.10485760000000000000e7
+31 12 1 1 0.15728640000000000000e7
+31 16 1 1 0.10485760000000000000e7
+32 1 3 8 0.52428800000000000000e6
+32 1 7 8 -0.52428800000000000000e6
+32 1 8 14 0.52428800000000000000e6
+33 1 2 9 0.52428800000000000000e6
+33 1 8 9 -0.52428800000000000000e6
+33 1 9 13 0.52428800000000000000e6
+34 1 3 10 0.52428800000000000000e6
+34 1 7 10 -0.52428800000000000000e6
+34 1 10 14 0.52428800000000000000e6
+35 1 2 11 0.52428800000000000000e6
+35 1 8 11 -0.52428800000000000000e6
+35 1 11 13 0.52428800000000000000e6
+36 1 3 12 0.52428800000000000000e6
+36 1 7 12 -0.52428800000000000000e6
+36 1 12 14 0.52428800000000000000e6
+37 1 3 14 0.26214400000000000000e6
+37 1 7 14 -0.26214400000000000000e6
+37 1 14 14 0.52428800000000000000e6
+38 3 1 1 0.52428800000000000000e6
+38 4 1 1 0.52428800000000000000e6
+39 5 1 1 0.52428800000000000000e6
+39 6 1 1 0.52428800000000000000e6
+40 7 1 1 0.52428800000000000000e6
+40 8 1 1 0.52428800000000000000e6
+41 9 1 1 0.52428800000000000000e6
+41 10 1 1 0.52428800000000000000e6
+42 1 1 5 -0.26214400000000000000e6
+42 11 1 1 0.52428800000000000000e6
+43 4 1 1 -0.52428800000000000000e6
+43 10 1 1 0.52428800000000000000e6
+43 12 1 1 -0.52428800000000000000e6
+43 14 1 1 0.52428800000000000000e6
+44 1 1 5 0.26214400000000000000e6
+44 1 2 5 -0.26214400000000000000e6
+44 15 1 1 0.52428800000000000000e6
+45 1 1 4 -0.26214400000000000000e6
+45 1 1 6 0.26214400000000000000e6
+45 17 1 1 0.52428800000000000000e6
+46 1 4 5 -0.26214400000000000000e6
+46 1 5 6 0.26214400000000000000e6
+46 18 1 1 0.52428800000000000000e6
+47 1 1 4 0.26214400000000000000e6
+47 1 1 6 -0.26214400000000000000e6
+47 1 3 4 -0.26214400000000000000e6
+47 1 3 6 0.26214400000000000000e6
+47 19 1 1 0.52428800000000000000e6
+*** ANSWER ***
+-1.116725553774321256e+01 -5.952534867185548468e-09 -4.771671433108957062e-16 4.771670413689490438e-16 5.952533901298202815e-09 1.116725553774321433e+01 -3.454515318145707687e-14 3.454558840007780775e-14 -1.116725553774318414e+01 -1.000000006785568774e+00 6.857229014570172721e-09 -8.860567582645550725e-12 -2.108124338216549232e-13 -4.178681890761149065e-12 4.178681927837322824e-12 -4.516060486416472661e-14 8.568085822038013355e-12 -5.952534933885602096e-09 1.142663092731832956e-14 5.952535105005483600e-09 -1.457227117910825212e-14 -5.952535073574049691e-09 2.096166144424142020e-17 1.239316773585763044e-14 8.774083660481752730e-15 -7.373962917989500306e-15 7.941603972618613109e-15 8.902112506998065706e-15 -8.774083495286370057e-15 2.096162568588021349e-17 -4.216882609136135309e-15 -3.697001841088514834e-15 2.385831744403555423e-16 -2.096161507026837199e-17 -2.385831356797719941e-16 2.096165574582988363e-17 5.952534946562426225e-09 1.000000015869641823e+00 1.785255012519515546e-08 1.785255012515801505e-08 9.073086734904201916e-09 2.416185405688857556e-11 2.661973528610169513e-11 4.346150221439183270e-14 3.941603869022038800e-11 2.000000013574488644e+00 5.257115280135383461e-14
+1 1 1 1 3.595228197499059000e-03
+1 1 1 2 -4.828011885935885010e-06
+1 1 1 3 -4.645489256770070498e-06
+1 1 1 4 -1.541890046844966722e-06
+1 1 1 5 -6.310985750670199139e-06
+1 1 1 6 1.541890046844966722e-06
+1 1 1 7 -1.105264293034878164e-07
+1 1 1 8 -4.357940986958170071e-06
+1 1 1 9 -2.190832771143381321e-06
+1 1 1 10 2.190832771143381321e-06
+1 1 1 11 2.190832790581974309e-06
+1 1 1 12 -2.190832790581974309e-06
+1 1 1 13 -2.367716320302319618e-08
+1 1 1 14 4.492144579464665946e-06
+1 1 2 2 3.120908488698299205e-03
+1 1 2 3 -1.493244841926305286e-09
+1 1 2 4 -9.055918725549996834e-09
+1 1 2 5 -7.229484372893227112e-09
+1 1 2 6 9.055804635599883958e-09
+1 1 2 7 -6.241266557085050135e-09
+1 1 2 8 -3.120842635417014552e-03
+1 1 2 9 1.250862953609851266e-10
+1 1 2 10 -1.250864768926217781e-10
+1 1 2 11 -1.250862750392762993e-10
+1 1 2 12 1.250865036160914440e-10
+1 1 2 13 3.120842888618580602e-03
+1 1 2 14 5.990845475621872370e-09
+1 1 3 3 3.120908037041206836e-03
+1 1 3 4 -9.181065505771415149e-09
+1 1 3 5 -7.640066911952307290e-09
+1 1 3 6 9.181065592381387656e-09
+1 1 3 7 -3.120842708653991365e-03
+1 1 3 8 -6.475442959242362610e-09
+1 1 3 9 1.098994755527844572e-11
+1 1 3 10 -1.098992324196086422e-11
+1 1 3 11 -1.098992880759876537e-11
+1 1 3 12 1.098994456766965803e-11
+1 1 3 13 6.497589125897325349e-09
+1 1 3 14 3.120842683598227044e-03
+1 1 4 4 6.531190809202562315e-08
+1 1 4 5 1.418410127099428715e-08
+1 1 4 7 -4.600146774186657175e-09
+1 1 4 8 -4.667156672118867491e-09
+1 1 4 13 4.667156672118867491e-09
+1 1 4 14 4.600146774186657175e-09
+1 1 5 5 6.531190809202562315e-08
+1 1 5 6 -1.418410127099428715e-08
+1 1 5 7 -3.866080270346879136e-09
+1 1 5 8 -4.163687663596267430e-09
+1 1 5 13 4.163687663596267430e-09
+1 1 5 14 3.866080270346879136e-09
+1 1 6 6 6.531190809202562315e-08
+1 1 6 7 4.600146687576700385e-09
+1 1 6 8 4.667270762069001873e-09
+1 1 6 13 -4.667270762069001873e-09
+1 1 6 14 -4.600146687576700385e-09
+1 1 7 7 3.120908004082960461e-03
+1 1 7 8 2.188714782723788480e-09
+1 1 7 9 -1.098994755527844572e-11
+1 1 7 10 1.098992324196086422e-11
+1 1 7 11 1.098992880759876537e-11
+1 1 7 12 -1.098994456766965803e-11
+1 1 7 13 -2.210860949378766109e-09
+1 1 7 14 -3.120842667119095182e-03
+1 1 8 8 3.120907405951924007e-03
+1 1 8 9 -1.250862953609851266e-10
+1 1 8 10 1.250864768926217781e-10
+1 1 8 11 1.250862750392762993e-10
+1 1 8 12 -1.250865036160914440e-10
+1 1 8 13 -3.120842347245409050e-03
+1 1 8 14 -1.938293701260615265e-09
+1 1 9 9 6.531190809202562315e-08
+1 1 9 13 1.250862953609851266e-10
+1 1 9 14 1.098994755527844572e-11
+1 1 10 10 6.531190809202562315e-08
+1 1 10 13 -1.250864768926217781e-10
+1 1 10 14 -1.098992324196086422e-11
+1 1 11 11 6.531190809202562315e-08
+1 1 11 13 -1.250862750392762993e-10
+1 1 11 14 -1.098992880759876537e-11
+1 1 12 12 6.531190809202562315e-08
+1 1 12 13 1.250865036160914440e-10
+1 1 12 14 1.098994456766965803e-11
+1 1 13 13 3.120907912355068252e-03
+1 1 13 14 1.960439867915583381e-09
+1 1 14 14 3.120907953971412737e-03
+1 2 1 1 5.242880035673135426e+05
+1 3 1 1 5.242880083203280810e+05
+1 4 1 1 4.757519343878941799e-03
+1 5 1 1 9.359943111946411251e-03
+1 6 1 1 9.364324777488700416e-03
+1 7 1 1 9.359943111926937245e-03
+1 8 1 1 9.364324777508091155e-03
+1 9 1 1 4.756975809977546932e-03
+1 10 1 1 5.242880083285477012e+05
+1 11 1 1 1.273308204787002385e-05
+1 12 1 1 1.404011136113249509e-05
+1 13 1 1 8.832420245662414158e-08
+1 14 1 1 1.402171968177171019e-05
+1 15 1 1 8.809825216500528721e-08
+1 16 1 1 8.935438724308554677e-08
+1 17 1 1 2.073066800091028975e-05
+1 18 1 1 1.048576007117006928e+06
+1 19 1 1 9.287433265194180584e-08
+1 20 1 1 9.275805888736266193e-08
+2 1 1 1 3.000000436687889849e+00
+2 1 1 2 1.088895345679293456e+02
+2 1 1 3 1.078895343959663791e+02
+2 1 1 4 3.551283503745867876e+01
+2 1 1 5 1.175172365249447637e+02
+2 1 1 6 -3.551283503813274933e+01
+2 1 1 7 1.818193207774310594e+01
+2 1 1 8 9.020760237793749070e+01
+2 1 1 9 3.576279970839740940e+01
+2 1 1 10 -3.576279970828006327e+01
+2 1 1 11 -3.576279970800739250e+01
+2 1 1 12 3.576279970780404938e+01
+2 1 1 13 -1.868193213695007415e+01
+2 1 1 14 -8.970760231714960753e+01
+2 1 2 2 1.152668071443426015e+04
+2 1 2 3 6.451393384512919511e+03
+2 1 2 4 3.065848212190524009e+03
+2 1 2 5 6.434315526682780728e+03
+2 1 2 6 -3.065848212225017505e+03
+2 1 2 7 1.443789291693289442e+03
+2 1 2 8 7.544997757958288275e+03
+2 1 2 9 1.781945397203092170e+03
+2 1 2 10 -1.781945397196837348e+03
+2 1 2 11 -1.781945394739820358e+03
+2 1 2 12 1.781945394729676991e+03
+2 1 2 13 -3.981182956453286806e+03
+2 1 2 14 -5.007604092819563448e+03
+2 1 3 3 1.144705957600245711e+04
+2 1 3 4 3.058379597869042300e+03
+2 1 3 5 6.407288185920611795e+03
+2 1 3 6 -3.058379597924352765e+03
+2 1 3 7 3.947512861358019109e+03
+2 1 3 8 5.001463618776514522e+03
+2 1 3 9 1.775767545211067500e+03
+2 1 3 10 -1.775767545202092379e+03
+2 1 3 11 -1.775767542744569937e+03
+2 1 3 12 1.775767542728588523e+03
+2 1 3 13 -1.449929765734226066e+03
+2 1 3 14 -7.499046714576948034e+03
+2 1 4 4 9.981580440535421076e+03
+2 1 4 5 -2.500000728226851043e-01
+2 1 4 6 -1.518421470101589648e+03
+2 1 4 7 9.356307097780907043e+02
+2 1 4 8 2.126483195273950514e+03
+2 1 4 9 5.935807195916974024e+02
+2 1 4 10 -5.935807195891146648e+02
+2 1 4 11 -5.935807185430275013e+02
+2 1 4 12 5.935807185385156117e+02
+2 1 4 13 -9.393650169165538273e+02
+2 1 4 14 -2.122748888090929995e+03
+2 1 5 5 1.582204426513794169e+04
+2 1 5 6 2.500000400883673479e-01
+2 1 5 7 1.275060562778895246e+03
+2 1 5 8 5.145741293575863892e+03
+2 1 5 9 1.928522082695156769e+03
+2 1 5 10 -1.928522082689412400e+03
+2 1 5 11 -1.928522080139493028e+03
+2 1 5 12 1.928522080129745746e+03
+2 1 5 13 -1.288574233106882730e+03
+2 1 5 14 -5.132227623141797267e+03
+2 1 6 6 9.981580440566636753e+03
+2 1 6 7 -9.356307097965436697e+02
+2 1 6 8 -2.126483195303442699e+03
+2 1 6 9 -5.935807196006285267e+02
+2 1 6 10 5.935807195980451070e+02
+2 1 6 11 5.935807185519590803e+02
+2 1 6 12 -5.935807185474462813e+02
+2 1 6 13 9.393650169232356575e+02
+2 1 6 14 2.122748888127787268e+03
+2 1 7 7 5.901634834616206717e+03
+2 1 7 8 1.025845727044859814e+03
+2 1 7 9 3.041554044746424097e+02
+2 1 7 10 -3.041554044764088189e+02
+2 1 7 11 -3.041554039876700699e+02
+2 1 7 12 3.041554039837027403e+02
+2 1 7 13 -4.179435646483383948e+02
+2 1 7 14 1.953621973235965697e+03
+2 1 8 8 9.479214446681686240e+03
+2 1 8 9 1.474701066737370638e+03
+2 1 8 10 -1.474701066735281074e+03
+2 1 8 11 -1.474701064767717526e+03
+2 1 8 12 1.474701064758939310e+03
+2 1 8 13 1.933716688656045562e+03
+2 1 8 14 -3.975617891731617419e+03
+2 1 9 9 9.046680100874975324e+03
+2 1 9 10 -5.835211304239410310e+02
+2 1 9 11 -5.835211296837068176e+02
+2 1 9 12 5.835211296810592785e+02
+2 1 9 13 -3.072443304657103340e+02
+2 1 9 14 -1.471612140736412357e+03
+2 1 10 10 9.046680100871797549e+03
+2 1 10 11 5.835211296821236147e+02
+2 1 10 12 -5.835211296794757345e+02
+2 1 10 13 3.072443304615452462e+02
+2 1 10 14 1.471612140725670997e+03
+2 1 11 11 9.046680099391332988e+03
+2 1 11 12 -5.835211289392416347e+02
+2 1 11 13 3.072443299720914069e+02
+2 1 11 14 1.471612138756886907e+03
+2 1 12 12 9.046680099386032452e+03
+2 1 12 13 -3.072443299707266533e+02
+2 1 12 14 -1.471612138744872709e+03
+2 1 13 13 5.915399645153976962e+03
+2 1 13 14 1.031986201087594964e+03
+2 1 14 14 9.453168687857885743e+03
+2 2 1 1 1.173035868014493892e-09
+2 3 1 1 1.173035769722831929e-09
+2 4 1 1 1.000000119794376197e+00
+2 5 1 1 5.000708989776471158e-01
+2 6 1 1 4.999292356407931681e-01
+2 7 1 1 5.000708989778275271e-01
+2 8 1 1 4.999292356406128124e-01
+2 9 1 1 1.000000066176967239e+00
+2 10 1 1 1.173035769550182792e-09
+2 11 1 1 1.180172365249658100e+02
+2 12 1 1 1.058895340118561705e+02
+2 13 1 1 6.290270949396677679e+03
+2 14 1 1 1.068895341304834687e+02
+2 15 1 1 6.317298290159291355e+03
+2 16 1 1 6.237614315991453623e+03
+2 17 1 1 7.152567007569429336e+01
+2 18 1 1 5.865179340965989959e-10
+2 19 1 1 6.046233525720832404e+03
+2 20 1 1 6.061170754343097542e+03
+*** END ***
+*** REQUEST ***
+""
+47
+20
+14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0.0 -0.26214400000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 -0.26214400000000000000e6 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.52428800000000000000e6 -0.52428800000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.0 0.0 -0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6
+0 1 1 2 0.13107200000000000000e6
+0 1 4 5 -0.26214400000000000000e6
+0 1 5 6 0.26214400000000000000e6
+0 2 1 1 -0.26214400000000000000e6
+0 12 1 1 -0.26214400000000000000e6
+1 1 2 3 -0.26214400000000000000e6
+1 1 2 7 -0.26214400000000000000e6
+1 1 3 8 0.26214400000000000000e6
+1 1 7 8 0.26214400000000000000e6
+1 1 13 14 -0.26214400000000000000e6
+2 1 2 13 -0.26214400000000000000e6
+2 1 8 13 0.26214400000000000000e6
+2 1 13 13 -0.52428800000000000000e6
+3 1 2 12 -0.26214400000000000000e6
+3 1 8 12 0.26214400000000000000e6
+3 1 12 13 -0.26214400000000000000e6
+4 1 2 10 -0.26214400000000000000e6
+4 1 8 10 0.26214400000000000000e6
+4 1 10 13 -0.26214400000000000000e6
+5 1 2 2 -0.52428800000000000000e6
+5 1 2 13 -0.26214400000000000000e6
+5 1 8 8 0.52428800000000000000e6
+5 1 8 13 -0.26214400000000000000e6
+6 1 1 2 0.13107200000000000000e6
+6 1 2 7 -0.26214400000000000000e6
+6 1 3 8 0.26214400000000000000e6
+6 1 4 5 -0.26214400000000000000e6
+6 1 5 6 0.26214400000000000000e6
+6 1 7 8 0.26214400000000000000e6
+6 1 13 14 -0.26214400000000000000e6
+6 2 1 1 -0.26214400000000000000e6
+6 4 1 1 -0.52428800000000000000e6
+6 10 1 1 0.52428800000000000000e6
+6 12 1 1 -0.26214400000000000000e6
+6 16 1 1 -0.52428800000000000000e6
+7 1 1 4 -0.26214400000000000000e6
+7 1 1 6 0.26214400000000000000e6
+7 1 2 6 -0.26214400000000000000e6
+7 1 4 8 0.26214400000000000000e6
+7 1 4 13 -0.26214400000000000000e6
+7 20 1 1 -0.52428800000000000000e6
+8 1 2 4 -0.26214400000000000000e6
+8 1 4 8 0.26214400000000000000e6
+8 1 4 13 -0.26214400000000000000e6
+9 1 1 2 -0.13107200000000000000e6
+9 1 2 3 -0.26214400000000000000e6
+9 1 4 5 0.26214400000000000000e6
+9 1 5 6 -0.26214400000000000000e6
+9 2 1 1 0.26214400000000000000e6
+9 4 1 1 0.52428800000000000000e6
+9 10 1 1 -0.52428800000000000000e6
+9 12 1 1 0.26214400000000000000e6
+9 16 1 1 0.52428800000000000000e6
+10 1 1 2 -0.39321600000000000000e6
+10 1 4 5 0.26214400000000000000e6
+10 1 5 6 -0.26214400000000000000e6
+10 2 1 1 0.26214400000000000000e6
+10 4 1 1 0.52428800000000000000e6
+10 10 1 1 -0.52428800000000000000e6
+10 12 1 1 -0.26214400000000000000e6
+11 1 1 1 0.52428800000000000000e6
+11 1 1 2 -0.13107200000000000000e6
+11 1 4 5 0.26214400000000000000e6
+11 1 5 6 -0.26214400000000000000e6
+11 2 1 1 0.26214400000000000000e6
+11 12 1 1 0.26214400000000000000e6
+12 1 1 2 -0.26214400000000000000e6
+12 1 1 3 0.52428800000000000000e6
+12 1 4 5 0.52428800000000000000e6
+12 1 5 6 -0.52428800000000000000e6
+12 2 1 1 0.52428800000000000000e6
+12 12 1 1 -0.52428800000000000000e6
+13 1 1 4 0.52428800000000000000e6
+13 1 1 6 -0.52428800000000000000e6
+13 1 1 7 0.52428800000000000000e6
+13 1 1 8 -0.52428800000000000000e6
+13 1 4 5 -0.52428800000000000000e6
+13 1 5 6 0.52428800000000000000e6
+13 4 1 1 0.10485760000000000000e7
+14 1 1 4 -0.52428800000000000000e6
+14 1 1 6 0.52428800000000000000e6
+14 1 1 9 0.52428800000000000000e6
+14 1 1 10 -0.52428800000000000000e6
+14 1 4 5 0.52428800000000000000e6
+14 1 5 6 -0.52428800000000000000e6
+14 6 1 1 -0.10485760000000000000e7
+15 1 1 4 0.52428800000000000000e6
+15 1 1 6 -0.52428800000000000000e6
+15 1 1 11 0.52428800000000000000e6
+15 1 1 12 -0.52428800000000000000e6
+15 1 4 5 -0.52428800000000000000e6
+15 1 5 6 0.52428800000000000000e6
+15 8 1 1 0.10485760000000000000e7
+16 1 1 2 -0.26214400000000000000e6
+16 1 1 8 -0.52428800000000000000e6
+16 1 1 13 0.52428800000000000000e6
+16 1 4 5 0.52428800000000000000e6
+16 1 5 6 -0.52428800000000000000e6
+16 2 1 1 0.52428800000000000000e6
+16 4 1 1 0.10485760000000000000e7
+16 10 1 1 -0.10485760000000000000e7
+16 12 1 1 -0.52428800000000000000e6
+17 1 1 2 -0.26214400000000000000e6
+17 1 1 4 0.52428800000000000000e6
+17 1 1 6 -0.52428800000000000000e6
+17 1 1 8 -0.52428800000000000000e6
+17 1 1 14 0.52428800000000000000e6
+17 2 1 1 0.52428800000000000000e6
+17 4 1 1 0.10485760000000000000e7
+17 12 1 1 -0.52428800000000000000e6
+18 1 2 2 -0.10485760000000000000e7
+18 1 2 8 0.52428800000000000000e6
+18 1 2 13 -0.52428800000000000000e6
+19 1 2 3 -0.52428800000000000000e6
+19 1 2 7 -0.52428800000000000000e6
+19 1 2 14 0.52428800000000000000e6
+20 1 3 3 0.52428800000000000000e6
+20 1 3 14 -0.26214400000000000000e6
+20 1 7 7 -0.52428800000000000000e6
+20 1 7 14 0.26214400000000000000e6
+21 1 1 5 -0.52428800000000000000e6
+21 1 3 5 0.52428800000000000000e6
+21 13 1 1 -0.10485760000000000000e7
+22 1 3 7 0.52428800000000000000e6
+22 1 7 7 0.10485760000000000000e7
+22 1 7 14 -0.52428800000000000000e6
+23 1 3 9 0.52428800000000000000e6
+23 1 7 9 0.52428800000000000000e6
+23 1 9 14 -0.52428800000000000000e6
+24 1 1 2 -0.26214400000000000000e6
+24 1 3 8 -0.52428800000000000000e6
+24 1 3 13 0.52428800000000000000e6
+24 1 4 5 0.52428800000000000000e6
+24 1 5 6 -0.52428800000000000000e6
+24 2 1 1 0.52428800000000000000e6
+24 4 1 1 0.10485760000000000000e7
+24 10 1 1 -0.10485760000000000000e7
+24 12 1 1 0.52428800000000000000e6
+24 16 1 1 0.10485760000000000000e7
+25 1 3 4 -0.52428800000000000000e6
+25 1 4 7 -0.52428800000000000000e6
+25 1 4 14 0.52428800000000000000e6
+26 1 1 5 0.52428800000000000000e6
+26 1 5 7 0.52428800000000000000e6
+26 1 5 14 -0.52428800000000000000e6
+26 13 1 1 0.10485760000000000000e7
+27 1 2 5 0.52428800000000000000e6
+27 1 5 8 -0.52428800000000000000e6
+27 1 5 13 0.52428800000000000000e6
+28 1 1 4 0.52428800000000000000e6
+28 1 1 6 -0.52428800000000000000e6
+28 1 4 8 -0.52428800000000000000e6
+28 1 4 13 0.52428800000000000000e6
+28 1 6 8 0.52428800000000000000e6
+28 1 6 13 -0.52428800000000000000e6
+28 20 1 1 0.10485760000000000000e7
+29 1 3 6 -0.52428800000000000000e6
+29 1 6 7 -0.52428800000000000000e6
+29 1 6 14 0.52428800000000000000e6
+30 1 3 11 0.52428800000000000000e6
+30 1 7 11 0.52428800000000000000e6
+30 1 11 14 -0.52428800000000000000e6
+31 1 1 2 0.26214400000000000000e6
+31 1 3 8 0.52428800000000000000e6
+31 1 4 5 -0.52428800000000000000e6
+31 1 5 6 0.52428800000000000000e6
+31 1 7 13 0.52428800000000000000e6
+31 1 13 14 -0.52428800000000000000e6
+31 2 1 1 -0.52428800000000000000e6
+31 4 1 1 -0.10485760000000000000e7
+31 10 1 1 0.10485760000000000000e7
+31 12 1 1 -0.52428800000000000000e6
+31 16 1 1 -0.10485760000000000000e7
+32 1 3 8 -0.52428800000000000000e6
+32 1 7 8 -0.52428800000000000000e6
+32 1 8 14 0.52428800000000000000e6
+33 1 2 9 0.52428800000000000000e6
+33 1 8 9 -0.52428800000000000000e6
+33 1 9 13 0.52428800000000000000e6
+34 1 3 10 -0.52428800000000000000e6
+34 1 7 10 -0.52428800000000000000e6
+34 1 10 14 0.52428800000000000000e6
+35 1 2 11 0.52428800000000000000e6
+35 1 8 11 -0.52428800000000000000e6
+35 1 11 13 0.52428800000000000000e6
+36 1 3 12 -0.52428800000000000000e6
+36 1 7 12 -0.52428800000000000000e6
+36 1 12 14 0.52428800000000000000e6
+37 1 3 14 -0.26214400000000000000e6
+37 1 7 14 -0.26214400000000000000e6
+37 1 14 14 0.52428800000000000000e6
+38 3 1 1 0.52428800000000000000e6
+38 4 1 1 0.52428800000000000000e6
+39 5 1 1 0.52428800000000000000e6
+39 6 1 1 0.52428800000000000000e6
+40 7 1 1 0.52428800000000000000e6
+40 8 1 1 0.52428800000000000000e6
+41 9 1 1 0.52428800000000000000e6
+41 10 1 1 0.52428800000000000000e6
+42 1 1 5 -0.26214400000000000000e6
+42 11 1 1 0.52428800000000000000e6
+43 1 1 2 0.26214400000000000000e6
+43 1 4 5 -0.52428800000000000000e6
+43 1 5 6 0.52428800000000000000e6
+43 2 1 1 -0.52428800000000000000e6
+43 4 1 1 -0.52428800000000000000e6
+43 10 1 1 0.52428800000000000000e6
+43 14 1 1 0.52428800000000000000e6
+44 1 1 5 0.26214400000000000000e6
+44 1 2 5 -0.26214400000000000000e6
+44 15 1 1 0.52428800000000000000e6
+45 1 1 4 -0.26214400000000000000e6
+45 1 1 6 0.26214400000000000000e6
+45 17 1 1 0.52428800000000000000e6
+46 1 4 5 -0.26214400000000000000e6
+46 1 5 6 0.26214400000000000000e6
+46 18 1 1 0.52428800000000000000e6
+47 1 1 4 0.26214400000000000000e6
+47 1 1 6 -0.26214400000000000000e6
+47 1 3 4 -0.26214400000000000000e6
+47 1 3 6 0.26214400000000000000e6
+47 19 1 1 0.52428800000000000000e6
+*** ANSWER ***
+-1.545143709661866316e+00 -1.134550863176834789e-09 -5.486689051704884456e-17 5.486698068821436381e-17 1.134550753252242359e-09 1.545143709661866316e+00 -4.069016414672386712e-15 4.068061030972423999e-15 1.545143709661879194e+00 -6.266823563438833632e-09 2.139639186723840111e-09 1.171753159947059650e-12 3.051149637013742576e-13 -9.678313635330632677e-13 9.678301231567526054e-13 -1.599053082543165317e-12 1.630523633887974575e-12 -1.134550721772563554e-09 2.797883515837270238e-14 1.134550580194805661e-09 -3.863917004231921268e-15 1.134550609651288989e-09 2.868913456810974697e-17 -2.797700676839869006e-14 -1.459701764538643685e-15 2.094188690783034827e-15 1.487030027541467678e-15 1.097866309528391443e-15 1.459701764302591653e-15 -2.868914376862129351e-17 -3.113898162631277172e-14 -3.113533733567804929e-14 2.743407392149375048e-17 2.868911922172230053e-17 -2.743403698017543185e-17 -2.868911917521702116e-17 1.134550753731443183e-09 4.999999996688110349e-01 3.402701806856668016e-09 3.402701808094370095e-09 1.730541215041657474e-09 7.324627898123758542e-12 4.999999916730138438e-01 8.301766705402206849e-15 1.157125447660955751e-11 1.252145879544248042e-08 8.418260822532781013e-15
+1 1 1 1 1.121796077156214785e-03
+1 1 1 2 5.813886217360105064e-07
+1 1 1 3 6.143361207223240098e-07
+1 1 1 4 -9.998096919940220105e-07
+1 1 1 5 -1.914807234075906914e-06
+1 1 1 6 9.998096919940220105e-07
+1 1 1 7 1.599681140890661068e-07
+1 1 1 8 -1.764677465125312925e-07
+1 1 1 9 -5.074223699240226745e-07
+1 1 1 10 5.074223699240226745e-07
+1 1 1 11 5.074217196096075100e-07
+1 1 1 12 -5.074217196096075100e-07
+1 1 1 13 -8.383643425403910577e-07
+1 1 1 14 8.548639749638584140e-07
+1 1 2 2 5.948402395394216269e-04
+1 1 2 3 -1.805662319398860700e-08
+1 1 2 4 -1.066417790903235117e-09
+1 1 2 5 -1.396626332141325919e-09
+1 1 2 6 1.066668239007878142e-09
+1 1 2 7 -1.470045900281813322e-08
+1 1 2 8 -5.948313288166938006e-04
+1 1 2 9 1.438335574815211545e-11
+1 1 2 10 -1.438304978553126619e-11
+1 1 2 11 -1.438333638026221681e-11
+1 1 2 12 1.438302614770125231e-11
+1 1 2 13 5.948313576327642072e-04
+1 1 2 14 1.466896752751290739e-08
+1 1 3 3 5.948401818163204799e-04
+1 1 3 4 -1.441492446335594134e-09
+1 1 3 5 -2.025805318314745538e-09
+1 1 3 6 1.441492446459355036e-09
+1 1 3 7 5.948312700328550013e-04
+1 1 3 8 1.469758974204714917e-08
+1 1 3 9 1.504136898444512302e-11
+1 1 3 10 -1.504136093851834150e-11
+1 1 3 11 -1.504137380816292073e-11
+1 1 3 12 1.504136091413618159e-11
+1 1 3 13 -1.466800892459021241e-08
+1 1 3 14 -5.948313000807623060e-04
+1 1 4 4 8.927227146152089706e-09
+1 1 4 5 2.653153151813278188e-09
+1 1 4 7 7.653041187264364201e-10
+1 1 4 8 -5.758485797946573905e-10
+1 1 4 13 5.758485797946573905e-10
+1 1 4 14 -7.653041187264364201e-10
+1 1 5 5 8.927227146152089706e-09
+1 1 5 6 -2.653153151813278188e-09
+1 1 5 7 1.097958000313255763e-09
+1 1 5 8 -7.796319990796610059e-10
+1 1 5 13 7.796319990796610059e-10
+1 1 5 14 -1.097958000313255763e-09
+1 1 6 6 8.927227146152089706e-09
+1 1 6 7 -7.653041186026771724e-10
+1 1 6 8 5.755981316900212927e-10
+1 1 6 13 -5.755981316900212927e-10
+1 1 6 14 7.653041186026771724e-10
+1 1 7 7 5.948402127036812913e-04
+1 1 7 8 1.635537521635318240e-08
+1 1 7 9 1.504136898444512302e-11
+1 1 7 10 -1.504136093851834150e-11
+1 1 7 11 -1.504137380816292073e-11
+1 1 7 12 1.504136091413618159e-11
+1 1 7 13 -1.632579439889627046e-08
+1 1 7 14 -5.948313155244433622e-04
+1 1 8 8 5.948402725482578512e-04
+1 1 8 9 -1.438335574815211545e-11
+1 1 8 10 1.438304978553126619e-11
+1 1 8 11 1.438333638026221681e-11
+1 1 8 12 -1.438302614770125231e-11
+1 1 8 13 -5.948313741371847587e-04
+1 1 8 14 -1.632388374104797311e-08
+1 1 9 9 8.927227146152089706e-09
+1 1 9 13 1.438335574815211545e-11
+1 1 9 14 -1.504136898444512302e-11
+1 1 10 10 8.927227146152089706e-09
+1 1 10 13 -1.438304978553126619e-11
+1 1 10 14 1.504136093851834150e-11
+1 1 11 11 8.927227146152089706e-09
+1 1 11 13 -1.438333638026221681e-11
+1 1 11 14 1.504137380816292073e-11
+1 1 12 12 8.927227146152089706e-09
+1 1 12 13 1.438302614770125231e-11
+1 1 12 14 -1.504136091413618159e-11
+1 1 13 13 5.948403301804025675e-04
+1 1 13 14 1.629430292359105786e-08
+1 1 14 14 5.948402727994970933e-04
+1 2 1 1 3.284466540516492450e-03
+1 3 1 1 2.621439998263705347e+05
+1 4 1 1 9.068520386891774964e-04
+1 5 1 1 1.784004652140414862e-03
+1 6 1 1 1.785019496880263816e-03
+1 7 1 1 1.784004652789327426e-03
+1 8 1 1 1.785019496228547938e-03
+1 9 1 1 9.073109197789065066e-04
+1 10 1 1 2.621439998288590868e+05
+1 11 1 1 3.849141738597659374e-06
+1 12 1 1 2.621440022030863329e+05
+1 13 1 1 1.517475378340817916e-08
+1 14 1 1 2.621439956342699879e+05
+1 15 1 1 1.327974380859407224e-08
+1 16 1 1 1.895512647710511199e-08
+1 17 1 1 6.075597094178823639e-06
+1 18 1 1 6.564859516172093061e-03
+1 19 1 1 1.334082027627609022e-08
+1 20 1 1 1.221175988754780999e-08
+2 1 1 1 1.500000026008643017e+00
+2 1 1 2 4.999999844579782748e-01
+2 1 1 3 5.000000144803052882e-01
+2 1 1 4 2.276381002238412776e+01
+2 1 1 5 7.322465200284059961e+01
+2 1 1 6 -2.276381002242011320e+01
+2 1 1 7 -2.320158930741079573e+01
+2 1 1 8 2.320158926619165385e+01
+2 1 1 9 2.295114171399790237e+01
+2 1 1 10 -2.295114171399379188e+01
+2 1 1 11 -2.295114161180629253e+01
+2 1 1 12 2.295114161179150969e+01
+2 1 1 13 2.270158939285305166e+01
+2 1 1 14 -2.270158935139613732e+01
+2 1 2 2 1.150986277314328254e+04
+2 1 2 3 5.880677106887153968e+03
+2 1 2 4 3.311675983094874482e+03
+2 1 2 5 5.571034195365520645e+03
+2 1 2 6 -3.311675983108742003e+03
+2 1 2 7 -2.932543517211477138e+03
+2 1 2 8 5.746886350680556461e+03
+2 1 2 9 -6.683053498917331581e+00
+2 1 2 10 6.683053496644966174e+00
+2 1 2 11 6.683059715400050393e+00
+2 1 2 12 -6.683059714383553285e+00
+2 1 2 13 -5.762476422458453271e+03
+2 1 2 14 2.948133589675585881e+03
+2 1 3 3 1.164292196385548232e+04
+2 1 3 4 3.348022736259935300e+03
+2 1 3 5 5.622773803174752175e+03
+2 1 3 6 -3.348022736257888482e+03
+2 1 3 7 -5.746077633707278437e+03
+2 1 3 8 2.865205205290576941e+03
+2 1 3 9 -7.355089995466111930e+01
+2 1 3 10 7.355089995202216357e+01
+2 1 3 11 7.355090470964776728e+01
+2 1 3 12 -7.355090470815983394e+01
+2 1 3 13 -3.015471901665924179e+03
+2 1 3 14 5.896344330137134421e+03
+2 1 4 4 1.377353318425939324e+04
+2 1 4 5 -1.877793676647962762e-01
+2 1 4 6 -3.175085910052047893e+03
+2 1 4 7 -2.284362253209859318e+03
+2 1 4 8 2.266188876687878292e+03
+2 1 4 9 6.116094627310995975e+02
+2 1 4 10 -6.116094627319138226e+02
+2 1 4 11 -6.116094527494923341e+02
+2 1 4 12 6.116094527496499040e+02
+2 1 4 13 -1.045487106406721978e+03
+2 1 4 14 1.063660483050044149e+03
+2 1 5 5 2.296501918080875839e+04
+2 1 5 6 1.877793651161708544e-01
+2 1 5 7 -4.754643208494613646e+03
+2 1 5 8 4.728773404678988300e+03
+2 1 5 9 1.944890695257621928e+03
+2 1 5 10 -1.944890695258799724e+03
+2 1 5 11 -1.944890665057926981e+03
+2 1 5 12 1.944890665057727119e+03
+2 1 5 13 -8.422607906867491465e+02
+2 1 5 14 8.681305946735610632e+02
+2 1 6 6 1.377353318426099213e+04
+2 1 6 7 2.284362253212886571e+03
+2 1 6 8 -2.266188876679860641e+03
+2 1 6 9 -6.116094627319786241e+02
+2 1 6 10 6.116094627327931903e+02
+2 1 6 11 6.116094527503710196e+02
+2 1 6 12 -6.116094527505296128e+02
+2 1 6 13 1.045487106390579129e+03
+2 1 6 14 -1.063660483044974171e+03
+2 1 7 7 8.752078614646539791e+03
+2 1 7 8 -2.045837919427497809e+03
+2 1 7 9 -5.807931494401467489e+02
+2 1 7 10 5.807931494394332503e+02
+2 1 7 11 5.807931387802924519e+02
+2 1 7 12 -5.807931387806706880e+02
+2 1 7 13 8.867055980292089998e+02
+2 1 7 14 3.005500980935405096e+03
+2 1 8 8 8.786152129344798595e+03
+2 1 8 9 6.142270726723900225e+02
+2 1 8 10 -6.142270726740009650e+02
+2 1 8 11 -6.142270612822148905e+02
+2 1 8 12 6.142270612797854028e+02
+2 1 8 13 3.038765778653615143e+03
+2 1 8 14 8.193672858630534392e+02
+2 1 9 9 1.121649928085264219e+04
+2 1 9 10 -6.180520066443240239e+02
+2 1 9 11 -6.180519983637202586e+02
+2 1 9 12 6.180519983634078471e+02
+2 1 9 13 6.209101261712327187e+02
+2 1 9 14 -6.543440493947751975e+02
+2 1 10 10 1.121649928085231477e+04
+2 1 10 11 6.180519983635558674e+02
+2 1 10 12 -6.180519983632433423e+02
+2 1 10 13 -6.209101261706239256e+02
+2 1 10 14 6.543440493914234821e+02
+2 1 11 11 1.121649926429113657e+04
+2 1 11 12 -6.180519900826674302e+02
+2 1 11 13 -6.209101209975424354e+02
+2 1 11 14 6.543440434899060847e+02
+2 1 12 12 1.121649926429050356e+04
+2 1 12 13 6.209101209941511570e+02
+2 1 12 14 -6.543440434887985475e+02
+2 1 13 13 8.801742201118562662e+03
+2 1 13 14 -2.128766303643523315e+03
+2 1 14 14 8.902345311079354360e+03
+2 2 1 1 2.511171418931168464e-01
+2 3 1 1 7.677140651448751445e-10
+2 4 1 1 9.999999940902468687e-01
+2 5 1 1 5.008953819400652208e-01
+2 6 1 1 4.991046397863161954e-01
+2 7 1 1 5.008953819405332908e-01
+2 8 1 1 4.991046397858481254e-01
+2 9 1 1 1.000000010097441994e+00
+2 10 1 1 7.677140650442494502e-10
+2 11 1 1 7.372465200323586032e+01
+2 12 1 1 7.677139736726787485e-10
+2 13 1 1 5.550049151164920659e+03
+2 14 1 1 7.677142271572085914e-10
+2 15 1 1 5.498309543364354795e+03
+2 16 1 1 5.881177106847421783e+03
+2 17 1 1 4.602762004559877340e+01
+2 18 1 1 1.244411730986770825e-01
+2 19 1 1 6.651017852465472970e+03
+2 20 1 1 6.578324346133498693e+03
+*** END ***
+*** REQUEST ***
+""
+1
+6
+1 1 1 1 1 1
+0.10485760000000000000e7
+0 1 1 1 0.52428800000000000000e6
+1 1 1 1 0.10485760000000000000e7
+1 3 1 1 0.52428800000000000000e6
+1 4 1 1 0.52428800000000000000e6
+*** ANSWER ***
+5.000000017149335285e-01
+1 1 1 1 1.813867207457437554e-03
+1 2 1 1 1.420821586352863265e-05
+1 3 1 1 2.621440009133272688e+05
+1 4 1 1 2.621440009133272688e+05
+1 5 1 1 1.420821586352863265e-05
+1 6 1 1 1.420821586352863265e-05
+2 1 1 1 9.999999999999990008e-01
+2 2 1 1 6.282786184129422935e+01
+2 3 1 1 8.291678841961842720e-16
+2 4 1 1 8.291678841961842720e-16
+2 5 1 1 6.282786184129422935e+01
+2 6 1 1 6.282786184129422935e+01
+*** END ***
+*** REQUEST ***
+""
+57
+16
+14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.10485760000000000000e7 0.0 0.0 0.0 -0.10485760000000000000e7 0.0 0.10485760000000000000e7 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.52428800000000000000e6 0.10485760000000000000e7 0.10485760000000000000e7 -0.10485760000000000000e7 0.10485760000000000000e7 -0.10485760000000000000e7 0.10485760000000000000e7 0.0 0.0 -0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 -0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.10485760000000000000e7 0.0 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6
+0 1 1 2 0.26214400000000000000e6
+0 1 1 4 0.26214400000000000000e6
+0 1 1 6 -0.26214400000000000000e6
+0 1 1 8 -0.26214400000000000000e6
+0 1 1 14 0.26214400000000000000e6
+0 1 4 5 -0.78643200000000000000e6
+0 1 5 6 0.78643200000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+0 4 1 1 0.52428800000000000000e6
+1 1 3 14 -0.52428800000000000000e6
+2 1 2 3 -0.52428800000000000000e6
+2 1 3 8 -0.52428800000000000000e6
+3 1 3 12 -0.52428800000000000000e6
+4 1 3 11 -0.52428800000000000000e6
+5 1 3 10 -0.52428800000000000000e6
+6 1 7 9 -0.52428800000000000000e6
+6 1 9 14 0.52428800000000000000e6
+7 1 3 8 -0.52428800000000000000e6
+8 1 7 7 -0.10485760000000000000e7
+8 1 7 14 0.52428800000000000000e6
+9 1 3 6 -0.52428800000000000000e6
+10 1 3 5 -0.52428800000000000000e6
+11 1 3 4 -0.52428800000000000000e6
+12 1 3 14 0.52428800000000000000e6
+12 1 7 7 -0.10485760000000000000e7
+12 1 7 14 0.52428800000000000000e6
+13 1 2 3 -0.52428800000000000000e6
+14 1 1 4 0.52428800000000000000e6
+14 1 1 6 -0.52428800000000000000e6
+14 1 1 8 -0.52428800000000000000e6
+14 1 1 14 0.52428800000000000000e6
+14 1 4 5 -0.52428800000000000000e6
+14 1 5 6 0.52428800000000000000e6
+14 4 1 1 0.10485760000000000000e7
+15 1 2 3 0.26214400000000000000e6
+15 1 2 7 -0.26214400000000000000e6
+15 1 3 8 0.26214400000000000000e6
+15 1 7 8 -0.26214400000000000000e6
+15 1 13 14 0.26214400000000000000e6
+16 1 2 13 -0.26214400000000000000e6
+16 1 8 13 -0.26214400000000000000e6
+16 1 13 13 0.52428800000000000000e6
+17 1 2 12 -0.26214400000000000000e6
+17 1 8 12 -0.26214400000000000000e6
+17 1 12 13 0.26214400000000000000e6
+18 1 2 10 -0.26214400000000000000e6
+18 1 8 10 -0.26214400000000000000e6
+18 1 10 13 0.26214400000000000000e6
+19 1 2 2 0.52428800000000000000e6
+19 1 2 13 -0.26214400000000000000e6
+19 1 8 8 -0.52428800000000000000e6
+19 1 8 13 0.26214400000000000000e6
+20 1 2 3 0.26214400000000000000e6
+20 1 2 7 -0.26214400000000000000e6
+20 1 3 8 0.26214400000000000000e6
+20 1 7 8 -0.26214400000000000000e6
+20 1 13 14 0.26214400000000000000e6
+21 1 1 4 -0.26214400000000000000e6
+21 1 1 6 0.26214400000000000000e6
+21 1 2 6 -0.26214400000000000000e6
+21 1 4 8 -0.26214400000000000000e6
+21 1 4 13 0.26214400000000000000e6
+21 16 1 1 -0.52428800000000000000e6
+22 1 2 4 -0.26214400000000000000e6
+22 1 4 8 -0.26214400000000000000e6
+22 1 4 13 0.26214400000000000000e6
+23 1 1 4 0.26214400000000000000e6
+23 1 1 6 -0.26214400000000000000e6
+23 1 1 8 -0.26214400000000000000e6
+23 1 1 14 0.26214400000000000000e6
+23 1 4 5 -0.78643200000000000000e6
+23 1 5 6 0.78643200000000000000e6
+23 2 1 1 -0.52428800000000000000e6
+23 4 1 1 0.52428800000000000000e6
+23 12 1 1 0.52428800000000000000e6
+24 1 1 1 0.52428800000000000000e6
+24 1 1 2 -0.26214400000000000000e6
+24 1 1 4 -0.26214400000000000000e6
+24 1 1 6 0.26214400000000000000e6
+24 1 1 8 0.26214400000000000000e6
+24 1 1 14 -0.26214400000000000000e6
+24 1 4 5 0.78643200000000000000e6
+24 1 5 6 -0.78643200000000000000e6
+24 2 1 1 0.52428800000000000000e6
+24 4 1 1 -0.52428800000000000000e6
+25 1 1 3 0.52428800000000000000e6
+25 1 1 4 0.52428800000000000000e6
+25 1 1 6 -0.52428800000000000000e6
+25 1 1 8 -0.52428800000000000000e6
+25 1 1 14 0.52428800000000000000e6
+25 1 4 5 -0.52428800000000000000e6
+25 1 5 6 0.52428800000000000000e6
+25 4 1 1 0.10485760000000000000e7
+26 1 1 4 0.52428800000000000000e6
+26 1 1 6 -0.52428800000000000000e6
+26 1 1 7 0.52428800000000000000e6
+26 1 1 8 -0.52428800000000000000e6
+26 1 4 5 -0.52428800000000000000e6
+26 1 5 6 0.52428800000000000000e6
+26 4 1 1 0.10485760000000000000e7
+27 1 1 4 -0.52428800000000000000e6
+27 1 1 6 0.52428800000000000000e6
+27 1 1 9 0.52428800000000000000e6
+27 1 1 10 -0.52428800000000000000e6
+27 1 4 5 0.52428800000000000000e6
+27 1 5 6 -0.52428800000000000000e6
+27 6 1 1 -0.10485760000000000000e7
+28 1 1 4 0.52428800000000000000e6
+28 1 1 6 -0.52428800000000000000e6
+28 1 1 11 0.52428800000000000000e6
+28 1 1 12 -0.52428800000000000000e6
+28 1 4 5 -0.52428800000000000000e6
+28 1 5 6 0.52428800000000000000e6
+28 8 1 1 0.10485760000000000000e7
+29 1 1 2 -0.52428800000000000000e6
+29 1 1 4 -0.52428800000000000000e6
+29 1 1 6 0.52428800000000000000e6
+29 1 1 13 0.52428800000000000000e6
+29 1 1 14 -0.52428800000000000000e6
+29 1 4 5 0.15728640000000000000e7
+29 1 5 6 -0.15728640000000000000e7
+29 2 1 1 0.10485760000000000000e7
+29 4 1 1 -0.10485760000000000000e7
+29 12 1 1 -0.10485760000000000000e7
+30 1 2 2 0.10485760000000000000e7
+30 1 2 8 0.52428800000000000000e6
+30 1 2 13 -0.52428800000000000000e6
+31 1 2 3 0.52428800000000000000e6
+31 1 2 7 -0.52428800000000000000e6
+31 1 2 14 0.52428800000000000000e6
+32 1 3 3 0.52428800000000000000e6
+32 1 3 14 0.26214400000000000000e6
+32 1 7 7 -0.52428800000000000000e6
+32 1 7 14 0.26214400000000000000e6
+33 1 3 7 0.52428800000000000000e6
+33 1 7 7 -0.10485760000000000000e7
+33 1 7 14 0.52428800000000000000e6
+34 1 3 9 0.52428800000000000000e6
+34 1 7 9 -0.52428800000000000000e6
+34 1 9 14 0.52428800000000000000e6
+35 1 2 3 -0.52428800000000000000e6
+35 1 3 8 -0.52428800000000000000e6
+35 1 3 13 0.52428800000000000000e6
+36 1 3 4 0.52428800000000000000e6
+36 1 4 7 -0.52428800000000000000e6
+36 1 4 14 0.52428800000000000000e6
+37 1 3 5 -0.52428800000000000000e6
+37 1 5 7 0.52428800000000000000e6
+37 1 5 14 -0.52428800000000000000e6
+38 1 2 5 -0.52428800000000000000e6
+38 1 5 8 -0.52428800000000000000e6
+38 1 5 13 0.52428800000000000000e6
+39 1 1 4 -0.52428800000000000000e6
+39 1 1 6 0.52428800000000000000e6
+39 1 4 8 -0.52428800000000000000e6
+39 1 4 13 0.52428800000000000000e6
+39 1 6 8 0.52428800000000000000e6
+39 1 6 13 -0.52428800000000000000e6
+39 16 1 1 -0.10485760000000000000e7
+40 1 3 6 0.52428800000000000000e6
+40 1 6 7 -0.52428800000000000000e6
+40 1 6 14 0.52428800000000000000e6
+41 1 3 11 -0.52428800000000000000e6
+41 1 7 11 0.52428800000000000000e6
+41 1 11 14 -0.52428800000000000000e6
+42 1 2 3 -0.52428800000000000000e6
+42 1 3 8 -0.52428800000000000000e6
+42 1 7 13 0.52428800000000000000e6
+42 1 13 14 -0.52428800000000000000e6
+43 1 3 8 0.52428800000000000000e6
+43 1 7 8 -0.52428800000000000000e6
+43 1 8 14 0.52428800000000000000e6
+44 1 2 9 -0.52428800000000000000e6
+44 1 8 9 -0.52428800000000000000e6
+44 1 9 13 0.52428800000000000000e6
+45 1 3 10 0.52428800000000000000e6
+45 1 7 10 -0.52428800000000000000e6
+45 1 10 14 0.52428800000000000000e6
+46 1 2 11 -0.52428800000000000000e6
+46 1 8 11 -0.52428800000000000000e6
+46 1 11 13 0.52428800000000000000e6
+47 1 3 12 0.52428800000000000000e6
+47 1 7 12 -0.52428800000000000000e6
+47 1 12 14 0.52428800000000000000e6
+48 1 3 14 0.26214400000000000000e6
+48 1 7 14 -0.26214400000000000000e6
+48 1 14 14 0.52428800000000000000e6
+49 3 1 1 0.52428800000000000000e6
+49 4 1 1 0.52428800000000000000e6
+50 5 1 1 0.52428800000000000000e6
+50 6 1 1 0.52428800000000000000e6
+51 7 1 1 0.52428800000000000000e6
+51 8 1 1 0.52428800000000000000e6
+52 1 1 2 0.26214400000000000000e6
+52 1 4 5 -0.52428800000000000000e6
+52 1 5 6 0.52428800000000000000e6
+52 2 1 1 -0.52428800000000000000e6
+52 4 1 1 0.52428800000000000000e6
+52 9 1 1 0.52428800000000000000e6
+52 12 1 1 0.52428800000000000000e6
+53 1 1 2 -0.26214400000000000000e6
+53 1 4 5 0.52428800000000000000e6
+53 1 5 6 -0.52428800000000000000e6
+53 2 1 1 0.52428800000000000000e6
+53 4 1 1 -0.52428800000000000000e6
+53 10 1 1 0.52428800000000000000e6
+53 12 1 1 -0.52428800000000000000e6
+54 1 1 5 -0.26214400000000000000e6
+54 11 1 1 0.52428800000000000000e6
+55 1 1 5 0.26214400000000000000e6
+55 1 2 5 -0.26214400000000000000e6
+55 13 1 1 0.52428800000000000000e6
+56 1 1 4 -0.26214400000000000000e6
+56 1 1 6 0.26214400000000000000e6
+56 14 1 1 0.52428800000000000000e6
+57 1 4 5 -0.26214400000000000000e6
+57 1 5 6 0.26214400000000000000e6
+57 15 1 1 0.52428800000000000000e6
+*** ANSWER ***
+2.395843296934623723e+00 -1.482558552057233997e-04 2.247740535483374217e-17 -2.247740575984846173e-17 -2.247740220786478312e-17 2.247740771646352685e-17 1.482558552057696138e-04 -2.395843296934623723e+00 -4.264305214775493823e-17 8.333375427130910739e-17 4.264304336121705356e-17 2.395843295659977557e+00 1.482558552056858049e-04 5.000000012159875329e-01 -3.453092774928218783e-02 5.665296399022743553e-10 2.568241103926635949e-17 -2.568241415593281075e-17 -5.665295884143707015e-10 3.453092774928213926e-02 -6.381603107885721461e-15 6.381487231756248124e-15 -1.672254792120667263e-09 7.589128745979648948e-10 1.222495887188856058e-14 5.138301756199068849e-13 -4.986399984414542837e-13 4.986400169423990170e-13 -6.714834146249889853e-14 5.665296356412162809e-10 -9.259756895633913345e-18 1.699518699055908926e-09 -9.572799679287715131e-15 -1.011317359372357430e-17 -1.318660342458248949e-18 2.328132776997410857e-17 -4.572937894153944630e-17 -2.544057988768190673e-15 -1.558464648448957699e-15 -2.328133647499944581e-17 1.236423486879687525e-17 -1.440889120280324598e-17 3.599863278296609454e-17 1.284128684470612389e-17 -1.236423228809081681e-17 -1.284128786215887745e-17 1.236423444890213899e-17 8.497928663816686894e-10 8.597293833482549798e-10 1.699085141426398762e-09 1.699085141407932369e-09 1.000000001620060974e+00 8.594569689980730302e-10 3.633671598557783864e-12 1.555064685999291696e-14 5.748649140406546725e-12 3.336864455822352863e-09
+1 1 1 1 3.978953949158332685e-04
+1 1 1 2 4.787756141741500017e-07
+1 1 1 3 6.409399237024709650e-09
+1 1 1 4 -4.587265822664461990e-07
+1 1 1 5 -9.484686987618648009e-07
+1 1 1 6 4.587265822664461990e-07
+1 1 1 7 2.693949951154097409e-07
+1 1 1 8 -4.876352650388231401e-07
+1 1 1 9 -2.614309675028731835e-07
+1 1 1 10 2.614309675028731835e-07
+1 1 1 11 2.614309772026964958e-07
+1 1 1 12 -2.614309772026964958e-07
+1 1 1 13 -3.520506964869062251e-08
+1 1 1 14 2.534669317592830242e-07
+1 1 2 2 2.970311960901455954e-04
+1 1 2 3 9.467631924032548881e-12
+1 1 2 4 -1.672868588881509908e-09
+1 1 2 5 -2.742689695650679040e-09
+1 1 2 6 1.672898965113594567e-09
+1 1 2 7 1.831855219443054345e-11
+1 1 2 8 2.970246896110620015e-04
+1 1 2 9 -6.732532597237284282e-12
+1 1 2 10 6.732490776492850743e-12
+1 1 2 11 6.732533130675553539e-12
+1 1 2 12 -6.732489959477440542e-12
+1 1 2 13 -2.970247031083070441e-04
+1 1 2 14 -4.854779423298113160e-12
+1 1 3 3 8.910437414092397743e-04
+1 1 3 4 -1.015111514390159083e-11
+1 1 3 5 -1.971552273289430515e-11
+1 1 3 6 1.015111518663761546e-11
+1 1 3 7 -5.018903998254397591e-09
+1 1 3 8 -9.912419147261159956e-12
+1 1 3 9 -5.302215557106145322e-12
+1 1 3 10 5.302213630898458901e-12
+1 1 3 11 5.302214140127659019e-12
+1 1 3 12 -5.302214147929057062e-12
+1 1 3 13 -6.913577936267504252e-13
+1 1 3 14 5.029507756107564610e-09
+1 1 4 4 6.481718615442903893e-09
+1 1 4 5 7.493532067042077600e-10
+1 1 4 7 -1.220612077386418543e-11
+1 1 4 8 8.171146898380822798e-10
+1 1 4 13 -8.171146898380822798e-10
+1 1 4 14 1.220612077386418543e-11
+1 1 5 5 6.481718615442903893e-09
+1 1 5 6 -7.493532067042077600e-10
+1 1 5 7 -2.397536462650183322e-11
+1 1 5 8 1.333819074815297152e-09
+1 1 5 13 -1.333819074815297152e-09
+1 1 5 14 2.397536462650183322e-11
+1 1 6 6 6.481718615442903893e-09
+1 1 6 7 1.220612533780450944e-11
+1 1 6 8 -8.170843136060071339e-10
+1 1 6 13 8.170843136060071339e-10
+1 1 6 14 -1.220612533780450944e-11
+1 1 7 7 4.455427102868895236e-04
+1 1 7 8 -5.409878413383303140e-12
+1 1 7 9 -6.482419579743084243e-12
+1 1 7 10 6.482418617858558166e-12
+1 1 7 11 6.482419970891776130e-12
+1 1 7 12 -6.482419750746004645e-12
+1 1 7 13 -7.554408750935308228e-12
+1 1 7 14 -4.455362154488930583e-04
+1 1 8 8 2.970311465692090360e-04
+1 1 8 9 -6.732532597237284282e-12
+1 1 8 10 6.732490776492850743e-12
+1 1 8 11 6.732533130675553539e-12
+1 1 8 12 -6.732489959477440542e-12
+1 1 8 13 -2.970246783478386289e-04
+1 1 8 14 1.887365118451572777e-11
+1 1 9 9 6.481718615442903893e-09
+1 1 9 13 6.732532597237284282e-12
+1 1 9 14 6.482419579743084243e-12
+1 1 10 10 6.481718615442903893e-09
+1 1 10 13 -6.732490776492850743e-12
+1 1 10 14 -6.482418617858558166e-12
+1 1 11 11 6.481718615442903893e-09
+1 1 11 13 -6.732533130675553539e-12
+1 1 11 14 -6.482419970891776130e-12
+1 1 12 12 6.481718615442903893e-09
+1 1 12 13 6.732489959477440542e-12
+1 1 12 14 6.482419750746004645e-12
+1 1 13 13 2.970311735636990669e-04
+1 1 13 14 -5.909364020197119637e-12
+1 1 14 14 4.455426840481277635e-04
+1 2 1 1 8.757920578559239564e-04
+1 3 1 1 4.507522806555053566e-04
+1 4 1 1 5.242880008505735314e+05
+1 5 1 1 8.908164323467790413e-04
+1 6 1 1 8.913392942817823178e-04
+1 7 1 1 8.908164323370976580e-04
+1 8 1 1 8.913392942915033829e-04
+1 9 1 1 5.242880008493850473e+05
+1 10 1 1 4.506094570806772168e-04
+1 11 1 1 1.911572133680105271e-06
+1 12 1 1 5.242879995221093413e+05
+1 13 1 1 1.463473615637487530e-08
+1 14 1 1 3.020429479140911360e-06
+1 15 1 1 1.749484473532806651e-03
+1 16 1 1 1.146168517288211040e-08
+2 1 1 1 4.000000173257391545e+00
+2 1 1 2 1.999999937363364566e+00
+2 1 1 3 -1.402160247772740640e-08
+2 1 1 4 4.441716121603290901e+01
+2 1 1 5 1.405451537666538684e+02
+2 1 1 6 -4.441716121596736144e+01
+2 1 1 7 -4.466897995581429370e+01
+2 1 1 8 4.366851124283838459e+01
+2 1 1 9 4.466962369026506252e+01
+2 1 1 10 -4.466962369026569490e+01
+2 1 1 11 -4.466962368667953598e+01
+2 1 1 12 4.466962368663231331e+01
+2 1 1 13 4.566851137811910633e+01
+2 1 1 14 -4.466897990775698446e+01
+2 1 2 2 1.498918232667658049e+04
+2 1 2 3 2.001860444288396652e-15
+2 1 2 4 4.241546756859445850e+03
+2 1 2 5 6.968021441709835926e+03
+2 1 2 6 -4.241546756874184211e+03
+2 1 2 7 -6.090190953160143295e+01
+2 1 2 8 -7.433188448141516346e+03
+2 1 2 9 5.895043733383374729e+01
+2 1 2 10 -5.895043732820523275e+01
+2 1 2 11 -5.895043807974257533e+01
+2 1 2 12 5.895043808112049533e+01
+2 1 2 13 7.554993878526380286e+03
+2 1 2 14 -6.090190953159262932e+01
+2 1 3 3 1.000000068134589748e+00
+2 1 3 4 -1.221362468844659068e-14
+2 1 3 5 -2.770887068619304170e-14
+2 1 3 6 7.753776137218438829e-15
+2 1 3 7 6.812355501392468449e-09
+2 1 3 8 -8.774854395137448942e-15
+2 1 3 9 2.301598133368600934e-13
+2 1 3 10 7.543544140021803670e-15
+2 1 3 11 3.893144105967559240e-15
+2 1 3 12 -5.976157258404859514e-15
+2 1 3 13 -6.837107292292885038e-15
+2 1 3 14 -6.813748795724510208e-09
+2 1 4 4 1.830849694436362552e+04
+2 1 4 5 -2.515843739915458732e-01
+2 1 4 6 -3.101708916860397949e+03
+2 1 4 7 -8.224001178523166118e+02
+2 1 4 8 -1.298377929974150902e+03
+2 1 4 9 8.210927444165471343e+02
+2 1 4 10 -8.210927444149926941e+02
+2 1 4 11 -8.210927732611426109e+02
+2 1 4 12 8.210927732608571432e+02
+2 1 4 13 2.943168826885326780e+03
+2 1 4 14 -8.224001178523394628e+02
+2 1 5 5 2.919690832840929579e+04
+2 1 5 6 2.515843716244158257e-01
+2 1 5 7 -2.691683524582366317e+03
+2 1 5 8 -7.923467532090891154e+02
+2 1 5 9 2.690162495961582408e+03
+2 1 5 10 -2.690162495959046282e+03
+2 1 5 11 -2.690162592183282868e+03
+2 1 5 12 2.690162592181699893e+03
+2 1 5 13 6.175674688500975208e+03
+2 1 5 14 -2.691683524582512291e+03
+2 1 6 6 1.830849694436797290e+04
+2 1 6 7 8.224001178501544018e+02
+2 1 6 8 1.298377929983108288e+03
+2 1 6 9 -8.210927444157749733e+02
+2 1 6 10 8.210927444142197373e+02
+2 1 6 11 8.210927732603697677e+02
+2 1 6 12 -8.210927732600850959e+02
+2 1 6 13 -2.943168826878476466e+03
+2 1 6 14 8.224001178501774802e+02
+2 1 7 7 8.426014097291101280e+03
+2 1 7 8 -7.916628506988778327e+02
+2 1 7 9 -8.217878661982297217e+02
+2 1 7 10 8.217878662017679972e+02
+2 1 7 11 8.217878958038918427e+02
+2 1 7 12 -8.217878957991755442e+02
+2 1 7 13 -8.525647602304802604e+02
+2 1 7 14 8.425014097284718446e+03
+2 1 8 8 1.211214440770499095e+04
+2 1 8 9 7.923063694397378640e+02
+2 1 8 10 -7.923063694395248149e+02
+2 1 8 11 -7.923063986677203729e+02
+2 1 8 12 7.923063986638119331e+02
+2 1 8 13 4.677955959536360751e+03
+2 1 8 14 -7.916628506989220568e+02
+2 1 9 9 1.602827647532901210e+04
+2 1 9 10 -8.214884478236310770e+02
+2 1 9 11 -8.214884774253891919e+02
+2 1 9 12 8.214884774247129826e+02
+2 1 9 13 8.512568067736071953e+02
+2 1 9 14 -8.217878661982759922e+02
+2 1 10 10 1.602827647532904666e+04
+2 1 10 11 8.214884774254130662e+02
+2 1 10 12 -8.214884774247370842e+02
+2 1 10 13 -8.512568067677450472e+02
+2 1 10 14 8.217878662018140403e+02
+2 1 11 11 1.602827653453257153e+04
+2 1 11 12 -8.214885070265030436e+02
+2 1 11 13 -8.512568367474984825e+02
+2 1 11 14 8.217878958039381132e+02
+2 1 12 12 1.602827653453122912e+04
+2 1 12 13 8.512568367449480320e+02
+2 1 12 14 -8.217878957992217011e+02
+2 1 13 13 1.223394983808124562e+04
+2 1 13 14 -8.525647602305158443e+02
+2 1 14 14 8.426014097319221037e+03
+2 2 1 1 1.006337360154446525e+00
+2 3 1 1 2.000000025977247464e+00
+2 4 1 1 1.281888186503828505e-09
+2 5 1 1 9.982438386506173877e-01
+2 6 1 1 1.001756215856888010e+00
+2 7 1 1 9.982438386496179650e-01
+2 8 1 1 1.001756215857887433e+00
+2 9 1 1 1.281888186745980459e-09
+2 10 1 1 2.000000070908390271e+00
+2 11 1 1 1.415451537667341029e+02
+2 12 1 1 1.281888428318611726e-09
+2 13 1 1 6.828476287943272837e+03
+2 14 1 1 8.983432243210931745e+01
+2 15 1 1 4.968313887594946188e-01
+2 16 1 1 8.395259191294573611e+03
+*** END ***
+*** REQUEST ***
+""
+47
+20
+14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.52428800000000000000e6 -0.26214400000000000000e6 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.0 -0.52428800000000000000e6 -0.52428800000000000000e6 0.0 -0.10485760000000000000e7 0.0 -0.52428800000000000000e6 0.0 -0.52428800000000000000e6 0.0 0.0 -0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6
+0 1 1 2 0.13107200000000000000e6
+0 1 4 5 -0.26214400000000000000e6
+0 1 5 6 0.26214400000000000000e6
+0 2 1 1 -0.26214400000000000000e6
+0 12 1 1 -0.26214400000000000000e6
+1 1 2 3 0.26214400000000000000e6
+1 1 2 7 -0.26214400000000000000e6
+1 1 3 8 0.26214400000000000000e6
+1 1 7 8 -0.26214400000000000000e6
+1 1 13 14 0.26214400000000000000e6
+2 1 2 13 -0.26214400000000000000e6
+2 1 8 13 -0.26214400000000000000e6
+2 1 13 13 0.52428800000000000000e6
+3 1 2 12 -0.26214400000000000000e6
+3 1 8 12 -0.26214400000000000000e6
+3 1 12 13 0.26214400000000000000e6
+4 1 2 10 -0.26214400000000000000e6
+4 1 8 10 -0.26214400000000000000e6
+4 1 10 13 0.26214400000000000000e6
+5 1 2 2 0.52428800000000000000e6
+5 1 2 13 -0.26214400000000000000e6
+5 1 8 8 -0.52428800000000000000e6
+5 1 8 13 0.26214400000000000000e6
+6 1 1 2 -0.13107200000000000000e6
+6 1 2 7 -0.26214400000000000000e6
+6 1 3 8 0.26214400000000000000e6
+6 1 4 5 0.26214400000000000000e6
+6 1 5 6 -0.26214400000000000000e6
+6 1 7 8 -0.26214400000000000000e6
+6 1 13 14 0.26214400000000000000e6
+6 2 1 1 0.26214400000000000000e6
+6 4 1 1 -0.52428800000000000000e6
+6 10 1 1 0.52428800000000000000e6
+6 12 1 1 0.26214400000000000000e6
+6 16 1 1 0.52428800000000000000e6
+7 1 1 4 -0.26214400000000000000e6
+7 1 1 6 0.26214400000000000000e6
+7 1 2 6 -0.26214400000000000000e6
+7 1 4 8 -0.26214400000000000000e6
+7 1 4 13 0.26214400000000000000e6
+7 20 1 1 -0.52428800000000000000e6
+8 1 2 4 -0.26214400000000000000e6
+8 1 4 8 -0.26214400000000000000e6
+8 1 4 13 0.26214400000000000000e6
+9 1 1 2 -0.13107200000000000000e6
+9 1 2 3 -0.26214400000000000000e6
+9 1 4 5 0.26214400000000000000e6
+9 1 5 6 -0.26214400000000000000e6
+9 2 1 1 0.26214400000000000000e6
+9 4 1 1 -0.52428800000000000000e6
+9 10 1 1 0.52428800000000000000e6
+9 12 1 1 0.26214400000000000000e6
+9 16 1 1 0.52428800000000000000e6
+10 1 1 2 -0.39321600000000000000e6
+10 1 4 5 0.26214400000000000000e6
+10 1 5 6 -0.26214400000000000000e6
+10 2 1 1 0.26214400000000000000e6
+10 4 1 1 -0.52428800000000000000e6
+10 10 1 1 0.52428800000000000000e6
+10 12 1 1 -0.26214400000000000000e6
+11 1 1 1 0.52428800000000000000e6
+11 1 1 2 -0.13107200000000000000e6
+11 1 4 5 0.26214400000000000000e6
+11 1 5 6 -0.26214400000000000000e6
+11 2 1 1 0.26214400000000000000e6
+11 12 1 1 0.26214400000000000000e6
+12 1 1 2 -0.26214400000000000000e6
+12 1 1 3 0.52428800000000000000e6
+12 1 4 5 0.52428800000000000000e6
+12 1 5 6 -0.52428800000000000000e6
+12 2 1 1 0.52428800000000000000e6
+12 12 1 1 -0.52428800000000000000e6
+13 1 1 4 0.52428800000000000000e6
+13 1 1 6 -0.52428800000000000000e6
+13 1 1 7 0.52428800000000000000e6
+13 1 1 8 -0.52428800000000000000e6
+13 1 4 5 -0.52428800000000000000e6
+13 1 5 6 0.52428800000000000000e6
+13 4 1 1 0.10485760000000000000e7
+14 1 1 4 -0.52428800000000000000e6
+14 1 1 6 0.52428800000000000000e6
+14 1 1 9 0.52428800000000000000e6
+14 1 1 10 -0.52428800000000000000e6
+14 1 4 5 0.52428800000000000000e6
+14 1 5 6 -0.52428800000000000000e6
+14 6 1 1 -0.10485760000000000000e7
+15 1 1 4 0.52428800000000000000e6
+15 1 1 6 -0.52428800000000000000e6
+15 1 1 11 0.52428800000000000000e6
+15 1 1 12 -0.52428800000000000000e6
+15 1 4 5 -0.52428800000000000000e6
+15 1 5 6 0.52428800000000000000e6
+15 8 1 1 0.10485760000000000000e7
+16 1 1 2 0.26214400000000000000e6
+16 1 1 8 -0.52428800000000000000e6
+16 1 1 13 0.52428800000000000000e6
+16 1 4 5 -0.52428800000000000000e6
+16 1 5 6 0.52428800000000000000e6
+16 2 1 1 -0.52428800000000000000e6
+16 4 1 1 0.10485760000000000000e7
+16 10 1 1 -0.10485760000000000000e7
+16 12 1 1 0.52428800000000000000e6
+17 1 1 2 0.26214400000000000000e6
+17 1 1 4 0.52428800000000000000e6
+17 1 1 6 -0.52428800000000000000e6
+17 1 1 8 -0.52428800000000000000e6
+17 1 1 14 0.52428800000000000000e6
+17 1 4 5 -0.10485760000000000000e7
+17 1 5 6 0.10485760000000000000e7
+17 2 1 1 -0.52428800000000000000e6
+17 4 1 1 0.10485760000000000000e7
+17 12 1 1 0.52428800000000000000e6
+18 1 2 2 0.10485760000000000000e7
+18 1 2 8 0.52428800000000000000e6
+18 1 2 13 -0.52428800000000000000e6
+19 1 2 3 0.52428800000000000000e6
+19 1 2 7 -0.52428800000000000000e6
+19 1 2 14 0.52428800000000000000e6
+20 1 3 3 0.52428800000000000000e6
+20 1 3 14 0.26214400000000000000e6
+20 1 7 7 -0.52428800000000000000e6
+20 1 7 14 0.26214400000000000000e6
+21 1 1 5 -0.52428800000000000000e6
+21 1 3 5 0.52428800000000000000e6
+21 13 1 1 -0.10485760000000000000e7
+22 1 3 7 0.52428800000000000000e6
+22 1 7 7 -0.10485760000000000000e7
+22 1 7 14 0.52428800000000000000e6
+23 1 3 9 0.52428800000000000000e6
+23 1 7 9 -0.52428800000000000000e6
+23 1 9 14 0.52428800000000000000e6
+24 1 1 2 0.26214400000000000000e6
+24 1 3 8 -0.52428800000000000000e6
+24 1 3 13 0.52428800000000000000e6
+24 1 4 5 -0.52428800000000000000e6
+24 1 5 6 0.52428800000000000000e6
+24 2 1 1 -0.52428800000000000000e6
+24 4 1 1 0.10485760000000000000e7
+24 10 1 1 -0.10485760000000000000e7
+24 12 1 1 -0.52428800000000000000e6
+24 16 1 1 -0.10485760000000000000e7
+25 1 3 4 0.52428800000000000000e6
+25 1 4 7 -0.52428800000000000000e6
+25 1 4 14 0.52428800000000000000e6
+26 1 1 5 -0.52428800000000000000e6
+26 1 5 7 0.52428800000000000000e6
+26 1 5 14 -0.52428800000000000000e6
+26 13 1 1 -0.10485760000000000000e7
+27 1 2 5 -0.52428800000000000000e6
+27 1 5 8 -0.52428800000000000000e6
+27 1 5 13 0.52428800000000000000e6
+28 1 1 4 -0.52428800000000000000e6
+28 1 1 6 0.52428800000000000000e6
+28 1 4 8 -0.52428800000000000000e6
+28 1 4 13 0.52428800000000000000e6
+28 1 6 8 0.52428800000000000000e6
+28 1 6 13 -0.52428800000000000000e6
+28 20 1 1 -0.10485760000000000000e7
+29 1 3 6 0.52428800000000000000e6
+29 1 6 7 -0.52428800000000000000e6
+29 1 6 14 0.52428800000000000000e6
+30 1 3 11 -0.52428800000000000000e6
+30 1 7 11 0.52428800000000000000e6
+30 1 11 14 -0.52428800000000000000e6
+31 1 1 2 0.26214400000000000000e6
+31 1 3 8 -0.52428800000000000000e6
+31 1 4 5 -0.52428800000000000000e6
+31 1 5 6 0.52428800000000000000e6
+31 1 7 13 0.52428800000000000000e6
+31 1 13 14 -0.52428800000000000000e6
+31 2 1 1 -0.52428800000000000000e6
+31 4 1 1 0.10485760000000000000e7
+31 10 1 1 -0.10485760000000000000e7
+31 12 1 1 -0.52428800000000000000e6
+31 16 1 1 -0.10485760000000000000e7
+32 1 3 8 0.52428800000000000000e6
+32 1 7 8 -0.52428800000000000000e6
+32 1 8 14 0.52428800000000000000e6
+33 1 2 9 -0.52428800000000000000e6
+33 1 8 9 -0.52428800000000000000e6
+33 1 9 13 0.52428800000000000000e6
+34 1 3 10 0.52428800000000000000e6
+34 1 7 10 -0.52428800000000000000e6
+34 1 10 14 0.52428800000000000000e6
+35 1 2 11 -0.52428800000000000000e6
+35 1 8 11 -0.52428800000000000000e6
+35 1 11 13 0.52428800000000000000e6
+36 1 3 12 0.52428800000000000000e6
+36 1 7 12 -0.52428800000000000000e6
+36 1 12 14 0.52428800000000000000e6
+37 1 3 14 0.26214400000000000000e6
+37 1 7 14 -0.26214400000000000000e6
+37 1 14 14 0.52428800000000000000e6
+38 3 1 1 0.52428800000000000000e6
+38 4 1 1 0.52428800000000000000e6
+39 5 1 1 0.52428800000000000000e6
+39 6 1 1 0.52428800000000000000e6
+40 7 1 1 0.52428800000000000000e6
+40 8 1 1 0.52428800000000000000e6
+41 9 1 1 0.52428800000000000000e6
+41 10 1 1 0.52428800000000000000e6
+42 1 1 5 -0.26214400000000000000e6
+42 11 1 1 0.52428800000000000000e6
+43 1 1 2 0.26214400000000000000e6
+43 1 4 5 -0.52428800000000000000e6
+43 1 5 6 0.52428800000000000000e6
+43 2 1 1 -0.52428800000000000000e6
+43 4 1 1 0.52428800000000000000e6
+43 10 1 1 -0.52428800000000000000e6
+43 14 1 1 0.52428800000000000000e6
+44 1 1 5 0.26214400000000000000e6
+44 1 2 5 -0.26214400000000000000e6
+44 15 1 1 0.52428800000000000000e6
+45 1 1 4 -0.26214400000000000000e6
+45 1 1 6 0.26214400000000000000e6
+45 17 1 1 0.52428800000000000000e6
+46 1 4 5 -0.26214400000000000000e6
+46 1 5 6 0.26214400000000000000e6
+46 18 1 1 0.52428800000000000000e6
+47 1 1 4 0.26214400000000000000e6
+47 1 1 6 -0.26214400000000000000e6
+47 1 3 4 -0.26214400000000000000e6
+47 1 3 6 0.26214400000000000000e6
+47 19 1 1 0.52428800000000000000e6
+*** ANSWER ***
+-5.522444954544657669e+00 3.035659591895284065e-09 -5.643188060404362264e-16 5.643187575633686977e-16 -3.035660719471526034e-09 5.522444954544658557e+00 -1.124749451442023777e-14 1.124887705289027870e-14 -5.522444954544627471e+00 -1.658763490575944399e-08 5.844984052402457851e-09 2.756456250453592250e-12 3.996940662324368826e-12 -2.410735757081995122e-12 2.410739154971903770e-12 -4.080036239571530460e-13 8.245671754011166350e-13 3.035659907560900440e-09 -9.219626766901695231e-14 3.035658671087020283e-09 -7.871863281397909925e-15 -3.035658866977273976e-09 6.566725509066493395e-17 9.239041965382247586e-14 3.151247637180273995e-15 -4.303600633867186907e-15 -5.291578305200878105e-15 -3.644142961919632612e-15 -3.151247847090786759e-15 6.566722426019946069e-17 -9.884491289330498853e-14 -9.927821019457962431e-14 -2.821608906122087891e-16 -6.566720632716404440e-17 2.821610120771018734e-16 6.566721323985753052e-17 3.035658799269553062e-09 4.654965819301674787e-09 9.104502657127529713e-09 9.104502653731172440e-09 4.999999992888765621e-01 1.832285682358731599e-11 4.999999780481417244e-01 2.541408927593872445e-14 2.900571277263224355e-11 3.314647175845123994e-08 1.813950307644041037e-14
+1 1 1 1 3.064475222091125970e-03
+1 1 1 2 1.243161645370973439e-06
+1 1 1 3 1.445176934637812974e-06
+1 1 1 4 -2.538359223630900752e-06
+1 1 1 5 -4.790181378518108348e-06
+1 1 1 6 2.538359223630900752e-06
+1 1 1 7 2.095548025968718683e-06
+1 1 1 8 -2.313947297228167309e-06
+1 1 1 9 -1.263919828609005058e-06
+1 1 1 10 1.263919828609005058e-06
+1 1 1 11 1.263921610081909484e-06
+1 1 1 12 -1.263921610081909484e-06
+1 1 1 13 -2.139114039972478562e-07
+1 1 1 14 4.323106752567006383e-07
+1 1 2 2 1.591579859165433109e-03
+1 1 2 3 -5.610126573448670910e-08
+1 1 2 4 -2.948825626152869218e-09
+1 1 2 5 -3.887840012674542028e-09
+1 1 2 6 2.948463201988178809e-09
+1 1 2 7 4.804001177630100330e-08
+1 1 2 8 1.591560061615289370e-03
+1 1 2 9 1.479335690172937216e-10
+1 1 2 10 -1.479327763826917239e-10
+1 1 2 11 -1.479336326998795870e-10
+1 1 2 12 1.479327890906641141e-10
+1 1 2 13 -1.591559766027946139e-03
+1 1 2 14 -4.833739678365355989e-08
+1 1 3 3 1.591579636572017405e-03
+1 1 3 4 -3.103000573268427993e-09
+1 1 3 5 -4.127123456077547399e-09
+1 1 3 6 3.103000463214890099e-09
+1 1 3 7 -1.591559516049781018e-03
+1 1 3 8 -4.836897590760151699e-08
+1 1 3 9 3.442855383697453689e-11
+1 1 3 10 -3.442852827085618251e-11
+1 1 3 11 -3.442853767293145484e-11
+1 1 3 12 3.442853189509842496e-11
+1 1 3 13 4.843918833946327822e-08
+1 1 3 14 1.591559446949153021e-03
+1 1 4 4 2.022322514568192196e-08
+1 1 4 5 7.187614331173076332e-09
+1 1 4 7 -1.652161321201971492e-09
+1 1 4 8 1.910218001054245651e-09
+1 1 4 13 -1.910218001054245651e-09
+1 1 4 14 1.652161321201971492e-09
+1 1 5 5 2.022322514568192196e-08
+1 1 5 6 -7.187614331173076332e-09
+1 1 5 7 -2.256326169128959689e-09
+1 1 5 8 2.774311006477157980e-09
+1 1 5 13 -2.774311006477157980e-09
+1 1 5 14 2.256326169128959689e-09
+1 1 6 6 2.022322514568192196e-08
+1 1 6 7 1.652161431255534408e-09
+1 1 6 8 -1.910580425218920343e-09
+1 1 6 13 1.910580425218920343e-09
+1 1 6 14 -1.652161431255534408e-09
+1 1 7 7 1.591579841977833892e-03
+1 1 7 8 5.175298925914319886e-08
+1 1 7 9 -3.442855383697453689e-11
+1 1 7 10 3.442852827085618251e-11
+1 1 7 11 3.442853767293145484e-11
+1 1 7 12 -3.442853189509842496e-11
+1 1 7 13 -5.182320169100508582e-08
+1 1 7 14 -1.591559549652063650e-03
+1 1 8 8 1.591580710515432939e-03
+1 1 8 9 1.479335690172937216e-10
+1 1 8 10 -1.479327763826917239e-10
+1 1 8 11 -1.479336326998795870e-10
+1 1 8 12 1.479327890906641141e-10
+1 1 8 13 -1.591560191702948331e-03
+1 1 8 14 -5.205037426649576207e-08
+1 1 9 9 2.022322514568192196e-08
+1 1 9 13 -1.479335690172937216e-10
+1 1 9 14 3.442855383697453689e-11
+1 1 10 10 2.022322514568192196e-08
+1 1 10 13 1.479327763826917239e-10
+1 1 10 14 -3.442852827085618251e-11
+1 1 11 11 2.022322514568192196e-08
+1 1 11 13 1.479336326998795870e-10
+1 1 11 14 -3.442853767293145484e-11
+1 1 12 12 2.022322514568192196e-08
+1 1 12 13 -1.479327890906641141e-10
+1 1 12 14 3.442853189509842496e-11
+1 1 13 13 1.591580119340740406e-03
+1 1 13 14 5.212058669835764903e-08
+1 1 14 14 1.591579703776584186e-03
+1 2 1 1 8.694231813074791704e-03
+1 3 1 1 2.440562942695182185e-03
+1 4 1 1 2.621439996327699919e+05
+1 5 1 1 4.773401712325224880e-03
+1 6 1 1 4.775929551982441464e-03
+1 7 1 1 4.773401710544553783e-03
+1 8 1 1 4.775929553764721516e-03
+1 9 1 1 2.621439996271867421e+05
+1 10 1 1 2.440035424173773483e-03
+1 11 1 1 9.626677183470630576e-06
+1 12 1 1 2.621440058793803328e+05
+1 13 1 1 3.299012439609477401e-08
+1 14 1 1 2.621439884909243265e+05
+1 15 1 1 3.354752718398537161e-08
+1 16 1 1 4.311375976513682302e-08
+1 17 1 1 1.522757036328349586e-05
+1 18 1 1 1.737831760852002680e-02
+1 19 1 1 2.973354893462274657e-08
+1 20 1 1 2.994131240009614839e-08
+2 1 1 1 1.500000279722952579e+00
+2 1 1 2 4.999998443202596787e-01
+2 1 1 3 5.000001764850156016e-01
+2 1 1 4 2.758639521335422273e+01
+2 1 1 5 8.592201151499567402e+01
+2 1 1 6 -2.758639521344635170e+01
+2 1 1 7 -2.752427799641871076e+01
+2 1 1 8 2.752427816975245989e+01
+2 1 1 9 2.777425704322212496e+01
+2 1 1 10 -2.777425704318102362e+01
+2 1 1 11 -2.777425715504746861e+01
+2 1 1 12 2.777425715499388659e+01
+2 1 1 13 2.802427784677355760e+01
+2 1 1 14 -2.802427801682745923e+01
+2 1 2 2 1.427449346191607401e+04
+2 1 2 3 7.182332300586982456e+03
+2 1 2 4 4.166504323868790379e+03
+2 1 2 5 7.060913767542288042e+03
+2 1 2 6 -4.166504323860684963e+03
+2 1 2 7 3.462446245504769195e+03
+2 1 2 8 -7.008276825868711967e+03
+2 1 2 9 1.269919514531378582e+02
+2 1 2 10 -1.269919514615624223e+02
+2 1 2 11 -1.269919648711021551e+02
+2 1 2 12 1.269919648608207297e+02
+2 1 2 13 7.265716636039885088e+03
+2 1 2 14 -3.719886055083028623e+03
+2 1 3 3 1.422905577212210301e+04
+2 1 3 4 4.160563561636523445e+03
+2 1 3 5 7.025986677185798726e+03
+2 1 3 6 -4.160563561626160663e+03
+2 1 3 7 7.040779508275793887e+03
+2 1 3 8 -3.517667772326600698e+03
+2 1 3 9 7.475915598008855056e+01
+2 1 3 10 -7.475915598253148175e+01
+2 1 3 11 -7.475916918414731072e+01
+2 1 3 12 7.475916917524499183e+01
+2 1 3 13 3.664664528106076887e+03
+2 1 3 14 -7.187776263822250257e+03
+2 1 4 4 1.707750720891154560e+04
+2 1 4 5 -1.878828215327714712e-01
+2 1 4 6 -3.912817450441641995e+03
+2 1 4 7 1.285390681928661706e+03
+2 1 4 8 -1.288361062892334758e+03
+2 1 4 9 7.949941316810629814e+02
+2 1 4 10 -7.949941316822057615e+02
+2 1 4 11 -7.949942169180335441e+02
+2 1 4 12 7.949942169130342791e+02
+2 1 4 13 2.878143260976698912e+03
+2 1 4 14 -2.875172879708224173e+03
+2 1 5 5 2.819494117584100240e+04
+2 1 5 6 1.878828201432677092e-01
+2 1 5 7 1.100989859574430739e+03
+2 1 5 8 -1.118453404443628642e+03
+2 1 5 9 2.411857709002754746e+03
+2 1 5 10 -2.411857709003381387e+03
+2 1 5 11 -2.411857973922805286e+03
+2 1 5 12 2.411857973912575744e+03
+2 1 5 13 5.942460363099099595e+03
+2 1 5 14 -5.924996817645248484e+03
+2 1 6 6 1.707750720891128003e+04
+2 1 6 7 -1.285390681909010254e+03
+2 1 6 8 1.288361062901506557e+03
+2 1 6 9 -7.949941316821198143e+02
+2 1 6 10 7.949941316832630491e+02
+2 1 6 11 7.949942169190912864e+02
+2 1 6 12 -7.949942169140906572e+02
+2 1 6 13 -2.878143260994469983e+03
+2 1 6 14 2.875172879717521027e+03
+2 1 7 7 1.078573359834339681e+04
+2 1 7 8 -2.413972087635288517e+03
+2 1 7 9 -6.821455085707568742e+02
+2 1 7 10 6.821455085632634336e+02
+2 1 7 11 6.821455818410465781e+02
+2 1 7 12 -6.821455818394815651e+02
+2 1 7 13 1.048474157714865896e+03
+2 1 7 14 3.744454090058946804e+03
+2 1 8 8 1.074187149416001012e+04
+2 1 8 9 6.560291108971871381e+02
+2 1 8 10 -6.560291108894515446e+02
+2 1 8 11 -6.560291840634654363e+02
+2 1 8 12 6.560291840610896088e+02
+2 1 8 13 3.733094668265926884e+03
+2 1 8 14 1.103695684691469069e+03
+2 1 9 9 1.388427030113273941e+04
+2 1 9 10 -7.195805426621952847e+02
+2 1 9 11 -7.195806225366429771e+02
+2 1 9 12 7.195806225353638865e+02
+2 1 9 13 7.830210623504042360e+02
+2 1 9 14 -7.569046645510625240e+02
+2 1 10 10 1.388427030113114597e+04
+2 1 10 11 7.195806225358408028e+02
+2 1 10 12 -7.195806225345613711e+02
+2 1 10 13 -7.830210623510416781e+02
+2 1 10 14 7.569046645460100535e+02
+2 1 11 11 1.388427046088009411e+04
+2 1 11 12 -7.195807024090702271e+02
+2 1 11 13 -7.830211489346474991e+02
+2 1 11 14 7.569047510254093822e+02
+2 1 12 12 1.388427046087754570e+04
+2 1 12 13 7.830211489219362875e+02
+2 1 12 14 -7.569047510149403024e+02
+2 1 13 13 1.099931130432308055e+04
+2 1 13 14 -2.616190370396364415e+03
+2 1 14 14 1.093273035389926918e+04
+2 2 1 1 2.515309279116083041e-01
+2 3 1 1 1.000000023323507348e+00
+2 4 1 1 2.071708871811019933e-09
+2 5 1 1 5.000419368455325531e-01
+2 6 1 1 4.999581139331444879e-01
+2 7 1 1 5.000419368435421452e-01
+2 8 1 1 4.999581139351347847e-01
+2 9 1 1 2.071708872424586116e-09
+2 10 1 1 9.999999862029476105e-01
+2 11 1 1 8.642201151512361434e+01
+2 12 1 1 2.071708212766751813e-09
+2 13 1 1 6.940564665666523979e+03
+2 14 1 1 2.071710052530300505e-09
+2 15 1 1 6.975491756054950201e+03
+2 16 1 1 7.182832300736969955e+03
+2 17 1 1 5.567279042701015612e+01
+2 18 1 1 1.242345547920395976e-01
+2 19 1 1 8.266454332861110743e+03
+2 20 1 1 8.278335857318545095e+03
+*** END ***
+*** REQUEST ***
+""
+47
+20
+14 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+0.0 0.26214400000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 -0.26214400000000000000e6 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 -0.10485760000000000000e7 0.0 0.52428800000000000000e6 0.0 -0.52428800000000000000e6 0.0 0.0 0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6
+0 1 1 2 0.13107200000000000000e6
+0 1 4 5 -0.26214400000000000000e6
+0 1 5 6 0.26214400000000000000e6
+0 2 1 1 -0.26214400000000000000e6
+0 12 1 1 -0.26214400000000000000e6
+1 1 2 3 -0.26214400000000000000e6
+1 1 2 7 -0.26214400000000000000e6
+1 1 3 8 -0.26214400000000000000e6
+1 1 7 8 -0.26214400000000000000e6
+1 1 13 14 0.26214400000000000000e6
+2 1 2 13 -0.26214400000000000000e6
+2 1 8 13 -0.26214400000000000000e6
+2 1 13 13 0.52428800000000000000e6
+3 1 2 12 -0.26214400000000000000e6
+3 1 8 12 -0.26214400000000000000e6
+3 1 12 13 0.26214400000000000000e6
+4 1 2 10 -0.26214400000000000000e6
+4 1 8 10 -0.26214400000000000000e6
+4 1 10 13 0.26214400000000000000e6
+5 1 2 2 0.52428800000000000000e6
+5 1 2 13 -0.26214400000000000000e6
+5 1 8 8 -0.52428800000000000000e6
+5 1 8 13 0.26214400000000000000e6
+6 1 1 2 -0.13107200000000000000e6
+6 1 2 7 -0.26214400000000000000e6
+6 1 3 8 -0.26214400000000000000e6
+6 1 4 5 0.26214400000000000000e6
+6 1 5 6 -0.26214400000000000000e6
+6 1 7 8 -0.26214400000000000000e6
+6 1 13 14 0.26214400000000000000e6
+6 2 1 1 0.26214400000000000000e6
+6 4 1 1 0.52428800000000000000e6
+6 10 1 1 -0.52428800000000000000e6
+6 12 1 1 -0.78643200000000000000e6
+6 16 1 1 -0.52428800000000000000e6
+7 1 1 4 -0.26214400000000000000e6
+7 1 1 6 0.26214400000000000000e6
+7 1 2 6 -0.26214400000000000000e6
+7 1 4 8 -0.26214400000000000000e6
+7 1 4 13 0.26214400000000000000e6
+7 20 1 1 -0.52428800000000000000e6
+8 1 2 4 -0.26214400000000000000e6
+8 1 4 8 -0.26214400000000000000e6
+8 1 4 13 0.26214400000000000000e6
+9 1 1 2 0.13107200000000000000e6
+9 1 2 3 -0.26214400000000000000e6
+9 1 4 5 -0.26214400000000000000e6
+9 1 5 6 0.26214400000000000000e6
+9 2 1 1 -0.26214400000000000000e6
+9 4 1 1 -0.52428800000000000000e6
+9 10 1 1 0.52428800000000000000e6
+9 12 1 1 0.78643200000000000000e6
+9 16 1 1 0.52428800000000000000e6
+10 1 1 2 -0.13107200000000000000e6
+10 1 4 5 -0.26214400000000000000e6
+10 1 5 6 0.26214400000000000000e6
+10 2 1 1 -0.26214400000000000000e6
+10 4 1 1 -0.52428800000000000000e6
+10 10 1 1 0.52428800000000000000e6
+10 12 1 1 0.26214400000000000000e6
+11 1 1 1 0.52428800000000000000e6
+11 1 1 2 -0.13107200000000000000e6
+11 1 4 5 0.26214400000000000000e6
+11 1 5 6 -0.26214400000000000000e6
+11 2 1 1 0.26214400000000000000e6
+11 12 1 1 0.26214400000000000000e6
+12 1 1 2 -0.26214400000000000000e6
+12 1 1 3 0.52428800000000000000e6
+12 1 4 5 0.52428800000000000000e6
+12 1 5 6 -0.52428800000000000000e6
+12 2 1 1 0.52428800000000000000e6
+12 12 1 1 -0.52428800000000000000e6
+13 1 1 4 0.52428800000000000000e6
+13 1 1 6 -0.52428800000000000000e6
+13 1 1 7 0.52428800000000000000e6
+13 1 1 8 -0.52428800000000000000e6
+13 1 4 5 -0.52428800000000000000e6
+13 1 5 6 0.52428800000000000000e6
+13 4 1 1 0.10485760000000000000e7
+14 1 1 4 -0.52428800000000000000e6
+14 1 1 6 0.52428800000000000000e6
+14 1 1 9 0.52428800000000000000e6
+14 1 1 10 -0.52428800000000000000e6
+14 1 4 5 0.52428800000000000000e6
+14 1 5 6 -0.52428800000000000000e6
+14 6 1 1 -0.10485760000000000000e7
+15 1 1 4 0.52428800000000000000e6
+15 1 1 6 -0.52428800000000000000e6
+15 1 1 11 0.52428800000000000000e6
+15 1 1 12 -0.52428800000000000000e6
+15 1 4 5 -0.52428800000000000000e6
+15 1 5 6 0.52428800000000000000e6
+15 8 1 1 0.10485760000000000000e7
+16 1 1 2 -0.26214400000000000000e6
+16 1 1 8 -0.52428800000000000000e6
+16 1 1 13 0.52428800000000000000e6
+16 1 4 5 0.52428800000000000000e6
+16 1 5 6 -0.52428800000000000000e6
+16 2 1 1 0.52428800000000000000e6
+16 4 1 1 0.10485760000000000000e7
+16 10 1 1 -0.10485760000000000000e7
+16 12 1 1 -0.52428800000000000000e6
+17 1 1 2 -0.26214400000000000000e6
+17 1 1 4 0.52428800000000000000e6
+17 1 1 6 -0.52428800000000000000e6
+17 1 1 8 -0.52428800000000000000e6
+17 1 1 14 0.52428800000000000000e6
+17 2 1 1 0.52428800000000000000e6
+17 4 1 1 0.10485760000000000000e7
+17 12 1 1 -0.52428800000000000000e6
+18 1 2 2 0.10485760000000000000e7
+18 1 2 8 0.52428800000000000000e6
+18 1 2 13 -0.52428800000000000000e6
+19 1 2 3 -0.52428800000000000000e6
+19 1 2 7 -0.52428800000000000000e6
+19 1 2 14 0.52428800000000000000e6
+20 1 3 3 0.52428800000000000000e6
+20 1 3 14 -0.26214400000000000000e6
+20 1 7 7 -0.52428800000000000000e6
+20 1 7 14 0.26214400000000000000e6
+21 1 1 5 -0.52428800000000000000e6
+21 1 3 5 0.52428800000000000000e6
+21 13 1 1 -0.10485760000000000000e7
+22 1 3 7 0.52428800000000000000e6
+22 1 7 7 0.10485760000000000000e7
+22 1 7 14 -0.52428800000000000000e6
+23 1 3 9 0.52428800000000000000e6
+23 1 7 9 0.52428800000000000000e6
+23 1 9 14 -0.52428800000000000000e6
+24 1 1 2 -0.26214400000000000000e6
+24 1 3 8 -0.52428800000000000000e6
+24 1 3 13 0.52428800000000000000e6
+24 1 4 5 0.52428800000000000000e6
+24 1 5 6 -0.52428800000000000000e6
+24 2 1 1 0.52428800000000000000e6
+24 4 1 1 0.10485760000000000000e7
+24 10 1 1 -0.10485760000000000000e7
+24 12 1 1 -0.15728640000000000000e7
+24 16 1 1 -0.10485760000000000000e7
+25 1 3 4 -0.52428800000000000000e6
+25 1 4 7 -0.52428800000000000000e6
+25 1 4 14 0.52428800000000000000e6
+26 1 1 5 0.52428800000000000000e6
+26 1 5 7 0.52428800000000000000e6
+26 1 5 14 -0.52428800000000000000e6
+26 13 1 1 0.10485760000000000000e7
+27 1 2 5 -0.52428800000000000000e6
+27 1 5 8 -0.52428800000000000000e6
+27 1 5 13 0.52428800000000000000e6
+28 1 1 4 -0.52428800000000000000e6
+28 1 1 6 0.52428800000000000000e6
+28 1 4 8 -0.52428800000000000000e6
+28 1 4 13 0.52428800000000000000e6
+28 1 6 8 0.52428800000000000000e6
+28 1 6 13 -0.52428800000000000000e6
+28 20 1 1 -0.10485760000000000000e7
+29 1 3 6 -0.52428800000000000000e6
+29 1 6 7 -0.52428800000000000000e6
+29 1 6 14 0.52428800000000000000e6
+30 1 3 11 0.52428800000000000000e6
+30 1 7 11 0.52428800000000000000e6
+30 1 11 14 -0.52428800000000000000e6
+31 1 1 2 0.26214400000000000000e6
+31 1 3 8 0.52428800000000000000e6
+31 1 4 5 -0.52428800000000000000e6
+31 1 5 6 0.52428800000000000000e6
+31 1 7 13 0.52428800000000000000e6
+31 1 13 14 -0.52428800000000000000e6
+31 2 1 1 -0.52428800000000000000e6
+31 4 1 1 -0.10485760000000000000e7
+31 10 1 1 0.10485760000000000000e7
+31 12 1 1 0.15728640000000000000e7
+31 16 1 1 0.10485760000000000000e7
+32 1 3 8 -0.52428800000000000000e6
+32 1 7 8 -0.52428800000000000000e6
+32 1 8 14 0.52428800000000000000e6
+33 1 2 9 -0.52428800000000000000e6
+33 1 8 9 -0.52428800000000000000e6
+33 1 9 13 0.52428800000000000000e6
+34 1 3 10 -0.52428800000000000000e6
+34 1 7 10 -0.52428800000000000000e6
+34 1 10 14 0.52428800000000000000e6
+35 1 2 11 -0.52428800000000000000e6
+35 1 8 11 -0.52428800000000000000e6
+35 1 11 13 0.52428800000000000000e6
+36 1 3 12 -0.52428800000000000000e6
+36 1 7 12 -0.52428800000000000000e6
+36 1 12 14 0.52428800000000000000e6
+37 1 3 14 -0.26214400000000000000e6
+37 1 7 14 -0.26214400000000000000e6
+37 1 14 14 0.52428800000000000000e6
+38 3 1 1 0.52428800000000000000e6
+38 4 1 1 0.52428800000000000000e6
+39 5 1 1 0.52428800000000000000e6
+39 6 1 1 0.52428800000000000000e6
+40 7 1 1 0.52428800000000000000e6
+40 8 1 1 0.52428800000000000000e6
+41 9 1 1 0.52428800000000000000e6
+41 10 1 1 0.52428800000000000000e6
+42 1 1 5 -0.26214400000000000000e6
+42 11 1 1 0.52428800000000000000e6
+43 4 1 1 0.52428800000000000000e6
+43 10 1 1 -0.52428800000000000000e6
+43 12 1 1 -0.52428800000000000000e6
+43 14 1 1 0.52428800000000000000e6
+44 1 1 5 0.26214400000000000000e6
+44 1 2 5 -0.26214400000000000000e6
+44 15 1 1 0.52428800000000000000e6
+45 1 1 4 -0.26214400000000000000e6
+45 1 1 6 0.26214400000000000000e6
+45 17 1 1 0.52428800000000000000e6
+46 1 4 5 -0.26214400000000000000e6
+46 1 5 6 0.26214400000000000000e6
+46 18 1 1 0.52428800000000000000e6
+47 1 1 4 0.26214400000000000000e6
+47 1 1 6 -0.26214400000000000000e6
+47 1 3 4 -0.26214400000000000000e6
+47 1 3 6 0.26214400000000000000e6
+47 19 1 1 0.52428800000000000000e6
+*** ANSWER ***
+-6.300751412246585303e+00 3.280673930521858256e-09 -1.935195665469081554e-16 1.935194755149902236e-16 -3.280674313351244469e-09 6.300751412246586192e+00 -7.996795485918402241e-15 7.996968140320767211e-15 6.300751412246592409e+00 -1.000000003822547168e+00 3.861292619978082298e-09 -4.767270642191489045e-12 4.559568614390726606e-12 -2.147412154113907717e-12 2.147412132464110756e-12 -4.415146345496764664e-12 -2.647911704186261969e-13 3.280674527662558113e-09 -4.662113357951222252e-15 3.280673927010104738e-09 -3.924506119708857722e-15 3.280673984936451304e-09 -1.320873443726907262e-17 -4.922773643947003470e-15 -2.034723291055713476e-15 1.907761680525564137e-15 -2.143582218523361258e-15 -2.078676017742729358e-15 2.034723417460031015e-15 1.320874858668965347e-17 -2.707840761030270584e-15 -2.874938551977450249e-15 -9.676138239155152314e-17 -1.320875533952543988e-17 9.676141647099134352e-17 1.320876390966659097e-17 3.280673985975198248e-09 4.994935115496885713e-09 9.839545629335862658e-09 9.839545629357483505e-09 1.000000008823451969e+00 1.308086987981550838e-11 1.440430724354695085e-11 1.121948445168936281e-14 2.109948029137830359e-11 2.000000007647711797e+00 1.223756591397920819e-14
+1 1 1 1 2.024460711677727662e-03
+1 1 1 2 -2.599707379947523717e-06
+1 1 1 3 -2.499422790453291408e-06
+1 1 1 4 -1.021282908069621355e-06
+1 1 1 5 -3.423072645221811749e-06
+1 1 1 6 1.021282908069621355e-06
+1 1 1 7 2.390527109701685271e-06
+1 1 1 8 6.310797064256780514e-08
+1 1 1 9 -1.125862423456072449e-06
+1 1 1 10 1.125862423456072449e-06
+1 1 1 11 1.125862412105343700e-06
+1 1 1 12 -1.125862412105343700e-06
+1 1 1 13 -2.314808247187807752e-06
+1 1 1 14 -1.388268331564406915e-07
+1 1 2 2 1.720049725654658294e-03
+1 1 2 3 6.495905855646060319e-10
+1 1 2 4 -2.096357216176247200e-09
+1 1 2 5 -1.817266097918479470e-09
+1 1 2 6 2.096311955860593637e-09
+1 1 2 7 2.342810795965133684e-09
+1 1 2 8 1.720018286759147268e-03
+1 1 2 9 5.073083165130176496e-11
+1 1 2 10 -5.072996938940159717e-11
+1 1 2 11 -5.073084951874310951e-11
+1 1 2 12 5.072999325287269150e-11
+1 1 2 13 -1.720018186402724227e-03
+1 1 2 14 -2.444290088213530412e-09
+1 1 3 3 1.720049298378932426e-03
+1 1 3 4 -2.141223474133173909e-09
+1 1 3 5 -2.057571464489917598e-09
+1 1 3 6 2.141223407860875229e-09
+1 1 3 7 1.720018002214362181e-03
+1 1 3 8 2.567079222609401658e-09
+1 1 3 9 -6.925180960646927548e-12
+1 1 3 10 6.925191919449113824e-12
+1 1 3 11 6.925188379018345037e-12
+1 1 3 12 -6.925196412671277647e-12
+1 1 3 13 -2.580951148237686556e-09
+1 1 3 14 -1.720017987301616230e-03
+1 1 4 4 3.132653465857940276e-08
+1 1 4 5 9.855588205585998784e-09
+1 1 4 7 1.066781004821017907e-09
+1 1 4 8 1.089779631674659555e-09
+1 1 4 13 -1.089779631674659555e-09
+1 1 4 14 -1.066781004821017907e-09
+1 1 5 5 3.132653465857940276e-08
+1 1 5 6 -9.855588205585998784e-09
+1 1 5 7 1.000216555959386970e-09
+1 1 5 8 1.123854434185176027e-09
+1 1 5 13 -1.123854434185176027e-09
+1 1 5 14 -1.000216555959386970e-09
+1 1 6 6 3.132653465857940276e-08
+1 1 6 7 -1.066781071093284741e-09
+1 1 6 8 -1.089824891990300090e-09
+1 1 6 13 1.089824891990300090e-09
+1 1 6 14 1.066781071093284741e-09
+1 1 7 7 1.720049359119102264e-03
+1 1 7 8 1.405816491290759396e-09
+1 1 7 9 -6.925180960646927548e-12
+1 1 7 10 6.925191919449113824e-12
+1 1 7 11 6.925188379018345037e-12
+1 1 7 12 -6.925196412671277647e-12
+1 1 7 13 -1.419688416919038504e-09
+1 1 7 14 -1.720018017671703968e-03
+1 1 8 8 1.720049500932955677e-03
+1 1 8 9 5.073083165130176496e-11
+1 1 8 10 -5.072996938940159717e-11
+1 1 8 11 -5.073084951874310951e-11
+1 1 8 12 5.072999325287269150e-11
+1 1 8 13 -1.720018074041869882e-03
+1 1 8 14 -1.507295783539153436e-09
+1 1 9 9 3.132653465857940276e-08
+1 1 9 13 -5.073083165130176496e-11
+1 1 9 14 6.925180960646927548e-12
+1 1 10 10 3.132653465857940276e-08
+1 1 10 13 5.072996938940159717e-11
+1 1 10 14 -6.925191919449113824e-12
+1 1 11 11 3.132653465857940276e-08
+1 1 11 13 5.073084951874310951e-11
+1 1 11 14 -6.925188379018345037e-12
+1 1 12 12 3.132653465857940276e-08
+1 1 12 13 -5.072999325287269150e-11
+1 1 12 14 6.925196412671277647e-12
+1 1 13 13 1.720049300220102655e-03
+1 1 13 14 1.521167709167436059e-09
+1 1 14 14 1.720049329293623155e-03
+1 2 1 1 5.242880020093463827e+05
+1 3 1 1 2.618815868368289633e-03
+1 4 1 1 5.242880046303515555e+05
+1 5 1 1 5.158787025447900479e-03
+1 6 1 1 5.161038750294809525e-03
+1 7 1 1 5.158787025459231693e-03
+1 8 1 1 5.161038750283448821e-03
+1 9 1 1 5.242880046260613017e+05
+1 10 1 1 2.619028933029354973e-03
+1 11 1 1 6.889469642207291463e-06
+1 12 1 1 7.596174961033124409e-06
+1 13 1 1 3.744211069947794241e-08
+1 14 1 1 7.583331970763326210e-06
+1 15 1 1 3.720877572278673030e-08
+1 16 1 1 3.703550054201750229e-08
+1 17 1 1 1.109353085766472878e-05
+1 18 1 1 1.048576004009634722e+06
+1 19 1 1 3.774254361648788937e-08
+1 20 1 1 3.769880835428110294e-08
+2 1 1 1 3.000000444400652277e+00
+2 1 1 2 1.115384350308486319e+02
+2 1 1 3 1.105384348459399604e+02
+2 1 1 4 3.651697892864040540e+01
+2 1 1 5 1.202511299564990424e+02
+2 1 1 6 -3.651697892857347227e+01
+2 1 1 7 -9.203619644005793532e+01
+2 1 1 8 -1.900223847161817758e+01
+2 1 1 9 3.676695328946205166e+01
+2 1 1 10 -3.676695328902278703e+01
+2 1 1 11 -3.676695328854906109e+01
+2 1 1 12 3.676695328876779456e+01
+2 1 1 13 9.253619650321250845e+01
+2 1 1 14 1.850223841362019428e+01
+2 1 2 2 1.270303171114729776e+04
+2 1 2 3 7.116922145933260254e+03
+2 1 2 4 3.337543874531124857e+03
+2 1 2 5 7.123369754655033830e+03
+2 1 2 6 -3.337543874518321900e+03
+2 1 2 7 -5.547146681057133719e+03
+2 1 2 8 -4.362580247124605194e+03
+2 1 2 9 1.988696093313582651e+03
+2 1 2 10 -1.988696093279197839e+03
+2 1 2 11 -1.988696092792192985e+03
+2 1 2 12 1.988696092810098662e+03
+2 1 2 13 8.339951463995330414e+03
+2 1 2 14 1.569775464876194292e+03
+2 1 3 3 1.261635952311011351e+04
+2 1 3 4 3.331053022046352453e+03
+2 1 3 5 7.093869504729096661e+03
+2 1 3 6 -3.331053022041415261e+03
+2 1 3 7 -8.289413430911346950e+03
+2 1 3 8 -1.576977403461950416e+03
+2 1 3 9 1.981460889155877567e+03
+2 1 3 10 -1.981460889135524212e+03
+2 1 3 11 -1.981460888639793666e+03
+2 1 3 12 1.981460888652065478e+03
+2 1 3 13 5.539944742474284794e+03
+2 1 3 14 4.326446092117021180e+03
+2 1 4 4 1.084537917238035152e+04
+2 1 4 5 -2.500000509916176505e-01
+2 1 4 6 -1.550858068840081842e+03
+2 1 4 7 -2.282957774673495351e+03
+2 1 4 8 -1.051340673545403206e+03
+2 1 4 9 6.174641237047160303e+02
+2 1 4 10 -6.174641236957086221e+02
+2 1 4 11 -6.174641237094568851e+02
+2 1 4 12 6.174641237144519437e+02
+2 1 4 13 2.286203200985707554e+03
+2 1 4 14 1.048095247372906215e+03
+2 1 5 5 1.752401553159353352e+04
+2 1 5 6 2.500000563866258130e-01
+2 1 5 7 -5.734765397275554278e+03
+2 1 5 8 -1.373854232219351843e+03
+2 1 5 9 2.187712803815823008e+03
+2 1 5 10 -2.187712803795520813e+03
+2 1 5 11 -2.187712803123366029e+03
+2 1 5 12 2.187712803135411377e+03
+2 1 5 13 5.749515522435618550e+03
+2 1 5 14 1.359104107454191308e+03
+2 1 6 6 1.084537917237439615e+04
+2 1 6 7 2.282957774670695017e+03
+2 1 6 8 1.051340673536380564e+03
+2 1 6 9 -6.174641237032791423e+02
+2 1 6 10 6.174641236942720752e+02
+2 1 6 11 6.174641237080198835e+02
+2 1 6 12 -6.174641237130158515e+02
+2 1 6 13 -2.286203200983329680e+03
+2 1 6 14 -1.048095247370770949e+03
+2 1 7 7 1.044615276324925981e+04
+2 1 7 8 1.119637844301884570e+03
+2 1 7 9 -1.653704007622726522e+03
+2 1 7 10 1.653704007607712128e+03
+2 1 7 11 1.653704007192767449e+03
+2 1 7 12 -1.653704007202134108e+03
+2 1 7 13 -4.427508836756879646e+03
+2 1 7 14 2.156239332310511145e+03
+2 1 8 8 6.497651532762517490e+03
+2 1 8 9 -3.313744835503875947e+02
+2 1 8 10 3.313744835468938845e+02
+2 1 8 11 3.313744834764144684e+02
+2 1 8 12 -3.313744834738542409e+02
+2 1 8 13 2.134571285555786744e+03
+2 1 8 14 -4.573395591601149590e+02
+2 1 9 9 9.957270864032272584e+03
+2 1 9 10 -6.627497604894324468e+02
+2 1 9 11 -6.627497603233467771e+02
+2 1 9 12 6.627497603267679551e+02
+2 1 9 13 1.657321609763173910e+03
+2 1 9 14 3.277568815331754877e+02
+2 1 10 10 9.957270864021167654e+03
+2 1 10 11 6.627497603177962446e+02
+2 1 10 12 -6.627497603212177637e+02
+2 1 10 13 -1.657321609732282923e+03
+2 1 10 14 -3.277568815278357874e+02
+2 1 11 11 9.957270863689011094e+03
+2 1 11 12 -6.627497601551319804e+02
+2 1 11 13 -1.657321609315757769e+03
+2 1 11 14 -3.277568814470501479e+02
+2 1 12 12 9.957270863695846856e+03
+2 1 12 13 1.657321609336223673e+03
+2 1 12 14 3.277568814499552445e+02
+2 1 13 13 1.047502274960543946e+04
+2 1 13 14 1.112435905715113904e+03
+2 1 14 14 6.483185424482193412e+03
+2 2 1 1 1.115992366321992278e-09
+2 3 1 1 1.000000080799830160e+00
+2 4 1 1 1.115992287234982597e-09
+2 5 1 1 5.000515491386603451e-01
+2 6 1 1 4.999486146102707362e-01
+2 7 1 1 5.000515491382392375e-01
+2 8 1 1 4.999486146106919549e-01
+2 9 1 1 1.115992287373315320e-09
+2 10 1 1 1.000000132031122924e+00
+2 11 1 1 1.207511299566291001e+02
+2 12 1 1 1.085384344575157485e+02
+2 13 1 1 6.974118374772385323e+03
+2 14 1 1 1.095384345885737787e+02
+2 15 1 1 7.003618624698532585e+03
+2 16 1 1 6.897845276501146145e+03
+2 17 1 1 7.353395785742891633e+01
+2 18 1 1 5.579961832335456692e-10
+2 19 1 1 6.589572086234267772e+03
+2 20 1 1 6.602553791191969140e+03
+*** END ***
+*** REQUEST ***
+""
+1
+6
+1 1 1 1 1 1
+0.10485760000000000000e7
+0 1 1 1 0.52428800000000000000e6
+1 1 1 1 0.10485760000000000000e7
+1 4 1 1 0.52428800000000000000e6
+1 5 1 1 0.52428800000000000000e6
+*** ANSWER ***
+5.000000017149335285e-01
+1 1 1 1 1.813867207457437554e-03
+1 2 1 1 1.420821586352863265e-05
+1 3 1 1 1.420821586352863265e-05
+1 4 1 1 2.621440009133272688e+05
+1 5 1 1 2.621440009133272688e+05
+1 6 1 1 1.420821586352863265e-05
+2 1 1 1 9.999999999999990008e-01
+2 2 1 1 6.282786184129422935e+01
+2 3 1 1 6.282786184129422935e+01
+2 4 1 1 8.291678841961842720e-16
+2 5 1 1 8.291678841961842720e-16
+2 6 1 1 6.282786184129422935e+01
+*** END ***
+*** REQUEST ***
+""
+2
+7
+1 1 1 1 1 1 1
+0.10485760000000000000e7 0.10485760000000000000e7
+0 1 1 1 0.52428800000000000000e6
+1 1 1 1 0.10485760000000000000e7
+1 3 1 1 0.52428800000000000000e6
+1 4 1 1 0.52428800000000000000e6
+2 1 1 1 0.10485760000000000000e7
+2 5 1 1 0.52428800000000000000e6
+2 6 1 1 0.52428800000000000000e6
+*** ANSWER ***
+2.500021852876498363e-01 2.499978196499695604e-01
+1 1 1 1 5.195964997146316003e-03
+1 2 1 1 1.669279410986605243e-05
+1 3 1 1 1.310731457367841504e+05
+1 4 1 1 1.310731457367841504e+05
+1 5 1 1 1.310708568853360339e+05
+1 6 1 1 1.310708568853360339e+05
+1 7 1 1 1.669279410986605243e-05
+2 1 1 1 9.999999999999921174e-01
+2 2 1 1 7.615695722136656798e+01
+2 3 1 1 7.290720724956996173e-15
+2 4 1 1 7.290720724956996173e-15
+2 5 1 1 7.290875520228106896e-15
+2 6 1 1 7.290875520228106896e-15
+2 7 1 1 7.615695722136656798e+01
+*** END ***
+*** REQUEST ***
+""
+4
+5
+3 1 1 1 1
+0.52428800000000000000e6 0.10485760000000000000e7 0.26214400000000000000e6 0.52428800000000000000e6
+0 1 1 2 0.26214400000000000000e6
+0 4 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 1 1 2 -0.26214400000000000000e6
+1 4 1 1 0.52428800000000000000e6
+2 1 1 3 0.52428800000000000000e6
+2 1 2 3 -0.52428800000000000000e6
+2 4 1 1 0.10485760000000000000e7
+2 5 1 1 0.10485760000000000000e7
+3 1 2 3 0.26214400000000000000e6
+3 2 1 1 0.52428800000000000000e6
+4 1 1 2 0.26214400000000000000e6
+4 1 2 3 -0.26214400000000000000e6
+4 3 1 1 0.52428800000000000000e6
+4 5 1 1 0.52428800000000000000e6
+*** ANSWER ***
+4.118260926926717979e-09 -9.763417926055627892e-13 1.000000004114681706e+00 1.000000004116174956e+00
+1 1 1 1 2.160070300886156747e-03
+1 1 1 2 -5.118842841471556469e-07
+1 1 1 3 -5.118842857615853036e-07
+1 1 2 2 9.155160296015329178e-07
+1 1 2 3 1.204752737472282027e-07
+1 1 3 3 9.155160296015329178e-07
+1 2 1 1 5.242880021581937326e+05
+1 3 1 1 5.242880021589766257e+05
+1 4 1 1 5.242880021589766257e+05
+1 5 1 1 5.242880021579528693e+05
+2 1 1 1 2.499999992646825930e+00
+2 1 1 2 1.499999994486832522e+00
+2 1 1 3 1.499999994481521437e+00
+2 1 2 2 4.949259498970275786e+02
+2 1 2 3 4.999999981567368468e-01
+2 1 3 3 4.949259498970472464e+02
+2 2 1 1 1.839813843201718803e-09
+2 3 1 1 1.839813843621254470e-09
+2 4 1 1 1.839813843621254470e-09
+2 5 1 1 1.839813842942592482e-09
+*** END ***
+*** REQUEST ***
+""
+5
+3
+3 1 1
+0.0 -0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0
+0 1 2 3 0.52428800000000000000e6
+0 2 1 1 -0.10485760000000000000e7
+1 1 2 3 -0.52428800000000000000e6
+2 1 2 2 -0.10485760000000000000e7
+3 1 1 2 -0.52428800000000000000e6
+4 1 1 1 0.10485760000000000000e7
+4 1 2 3 -0.52428800000000000000e6
+4 2 1 1 0.10485760000000000000e7
+5 1 1 3 -0.52428800000000000000e6
+5 1 2 3 0.52428800000000000000e6
+5 2 1 1 -0.10485760000000000000e7
+5 3 1 1 0.10485760000000000000e7
+*** ANSWER ***
+-1.000000000000002442e+00 -4.334665259020949418e-15 -5.606088354105582826e-28 2.614572177419890983e-15 1.118406671907423752e-17
+1 1 1 1 2.741606956793905548e-09
+1 1 1 2 2.939204850997307809e-22
+1 1 1 3 -5.863671972009993838e-12
+1 1 2 2 4.545255279926816170e-09
+1 1 2 3 -2.434139855805221498e-24
+1 1 3 3 2.932128366579138840e-14
+1 2 1 1 1.048576000000002794e+06
+1 3 1 1 1.175666522768578103e-11
+2 1 1 1 9.999999999992648103e-01
+2 1 1 2 1.050203893353059269e-15
+2 1 1 3 6.520506845461493128e+01
+2 1 2 2 4.999999999999999445e-01
+2 1 2 3 4.500401044987887586e-12
+2 1 3 3 1.760931343462711448e+04
+2 2 1 1 1.877488954426008097e-28
+2 3 1 1 6.520506845461341072e+01
+*** END ***
+*** REQUEST ***
+""
+5
+3
+3 1 1
+0.0 -0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0
+0 1 2 3 -0.52428800000000000000e6
+0 2 1 1 -0.10485760000000000000e7
+1 1 2 3 -0.52428800000000000000e6
+2 1 2 2 -0.10485760000000000000e7
+3 1 1 2 -0.52428800000000000000e6
+4 1 1 1 0.10485760000000000000e7
+4 1 2 3 0.52428800000000000000e6
+4 2 1 1 0.10485760000000000000e7
+5 1 1 3 -0.52428800000000000000e6
+5 1 2 3 -0.52428800000000000000e6
+5 2 1 1 -0.10485760000000000000e7
+5 3 1 1 0.10485760000000000000e7
+*** ANSWER ***
+1.000000000000002442e+00 -4.334665259020949418e-15 5.606088354105582826e-28 2.614572177419890983e-15 1.118406671907423752e-17
+1 1 1 1 2.741606956793905548e-09
+1 1 1 2 -2.939204850997307809e-22
+1 1 1 3 -5.863671972009993838e-12
+1 1 2 2 4.545255279926816170e-09
+1 1 2 3 2.434139855805221498e-24
+1 1 3 3 2.932128366579138840e-14
+1 2 1 1 1.048576000000002794e+06
+1 3 1 1 1.175666522768578103e-11
+2 1 1 1 9.999999999992648103e-01
+2 1 1 2 -1.050203893353059269e-15
+2 1 1 3 6.520506845461493128e+01
+2 1 2 2 4.999999999999999445e-01
+2 1 2 3 -4.500401044987887586e-12
+2 1 3 3 1.760931343462711448e+04
+2 2 1 1 1.877488954426008097e-28
+2 3 1 1 6.520506845461341072e+01
+*** END ***
+*** REQUEST ***
+""
+4
+5
+3 1 1 1 1
+0.52428800000000000000e6 0.10485760000000000000e7 0.26214400000000000000e6 0.52428800000000000000e6
+0 1 1 2 -0.26214400000000000000e6
+0 4 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 1 1 2 0.26214400000000000000e6
+1 4 1 1 0.52428800000000000000e6
+2 1 1 3 0.52428800000000000000e6
+2 1 2 3 0.52428800000000000000e6
+2 4 1 1 0.10485760000000000000e7
+2 5 1 1 0.10485760000000000000e7
+3 1 2 3 -0.26214400000000000000e6
+3 2 1 1 0.52428800000000000000e6
+4 1 1 2 -0.26214400000000000000e6
+4 1 2 3 0.26214400000000000000e6
+4 3 1 1 0.52428800000000000000e6
+4 5 1 1 0.52428800000000000000e6
+*** ANSWER ***
+4.118080467804684715e-09 -9.763265993044416723e-13 1.000000004114501184e+00 1.000000004115994434e+00
+1 1 1 1 2.159975671158192133e-03
+1 1 1 2 5.118763194383265167e-07
+1 1 1 3 -5.118763200961271155e-07
+1 1 2 2 9.154988538094284237e-07
+1 1 2 3 -1.204736078635559671e-07
+1 1 3 3 9.154988538094284237e-07
+1 2 1 1 5.242880021580990870e+05
+1 3 1 1 5.242880021588819800e+05
+1 4 1 1 5.242880021588819800e+05
+1 5 1 1 5.242880021578582237e+05
+2 1 1 1 2.499999992656185555e+00
+2 1 1 2 -1.499999994495740285e+00
+2 1 1 3 1.499999994514922053e+00
+2 1 2 2 4.949131034640402049e+02
+2 1 2 3 -4.999999981773923241e-01
+2 1 3 3 4.949131034640844291e+02
+2 2 1 1 1.839732167544220045e-09
+2 3 1 1 1.839732167963727174e-09
+2 4 1 1 1.839732167963739995e-09
+2 5 1 1 1.839732167285116471e-09
+*** END ***
+*** REQUEST ***
+""
+5
+3
+3 1 1
+-0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0 0.0
+0 1 2 3 0.52428800000000000000e6
+0 2 1 1 -0.10485760000000000000e7
+1 1 3 3 -0.10485760000000000000e7
+2 1 2 3 -0.52428800000000000000e6
+3 1 1 1 0.10485760000000000000e7
+3 1 2 3 -0.52428800000000000000e6
+3 2 1 1 0.10485760000000000000e7
+4 1 1 3 0.10485760000000000000e7
+5 1 1 2 -0.52428800000000000000e6
+5 1 2 3 0.52428800000000000000e6
+5 2 1 1 -0.10485760000000000000e7
+5 3 1 1 0.10485760000000000000e7
+*** ANSWER ***
+-4.334665259043807452e-15 -1.000000000000002442e+00 2.614572177519653489e-15 1.621893095060768740e-28 1.118406671931714504e-17
+1 1 1 1 2.741606956898514117e-09
+1 1 1 2 -5.863671972137347341e-12
+1 1 1 3 1.700678174046440642e-22
+1 1 2 2 2.932128366579138840e-14
+1 1 2 3 3.054907849415127301e-24
+1 1 3 3 4.545255279950785383e-09
+1 2 1 1 1.048576000000002794e+06
+1 3 1 1 1.175666522794048480e-11
+2 1 1 1 9.999999999918142146e-01
+2 1 1 2 6.520506845507829041e+01
+2 1 1 3 -1.588972252905990195e-14
+2 1 2 2 1.760931343491622829e+04
+2 1 2 3 -4.785912723036680060e-12
+2 1 3 3 4.999999999999998890e-01
+2 2 1 1 1.877488954426008097e-28
+2 3 1 1 6.520506845508334948e+01
+*** END ***
+*** REQUEST ***
+""
+5
+3
+3 1 1
+-0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0 0.0
+0 1 2 3 -0.52428800000000000000e6
+0 2 1 1 -0.10485760000000000000e7
+1 1 3 3 -0.10485760000000000000e7
+2 1 2 3 -0.52428800000000000000e6
+3 1 1 1 0.10485760000000000000e7
+3 1 2 3 0.52428800000000000000e6
+3 2 1 1 0.10485760000000000000e7
+4 1 1 3 0.10485760000000000000e7
+5 1 1 2 -0.52428800000000000000e6
+5 1 2 3 -0.52428800000000000000e6
+5 2 1 1 -0.10485760000000000000e7
+5 3 1 1 0.10485760000000000000e7
+*** ANSWER ***
+-4.334665259043807452e-15 1.000000000000002442e+00 2.614572177519653489e-15 -1.621893095060768740e-28 1.118406671931714504e-17
+1 1 1 1 2.741606956898514117e-09
+1 1 1 2 -5.863671972137347341e-12
+1 1 1 3 -1.700678174046440642e-22
+1 1 2 2 2.932128366579138840e-14
+1 1 2 3 -3.054907849415127301e-24
+1 1 3 3 4.545255279950785383e-09
+1 2 1 1 1.048576000000002794e+06
+1 3 1 1 1.175666522794048480e-11
+2 1 1 1 9.999999999918142146e-01
+2 1 1 2 6.520506845507829041e+01
+2 1 1 3 1.588972252905990195e-14
+2 1 2 2 1.760931343491622829e+04
+2 1 2 3 4.785912723036680060e-12
+2 1 3 3 4.999999999999998890e-01
+2 2 1 1 1.877488954426008097e-28
+2 3 1 1 6.520506845508334948e+01
+*** END ***
+*** REQUEST ***
+""
+7
+2
+3 1
+0.0 0.0 -0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0 0.52428800000000000000e6
+0 1 2 3 0.52428800000000000000e6
+0 2 1 1 -0.10485760000000000000e7
+1 1 2 3 -0.52428800000000000000e6
+2 1 2 3 -0.52428800000000000000e6
+3 1 2 2 -0.10485760000000000000e7
+4 1 1 2 -0.52428800000000000000e6
+5 1 1 1 0.10485760000000000000e7
+5 1 2 3 -0.52428800000000000000e6
+5 2 1 1 0.10485760000000000000e7
+6 1 1 3 0.10485760000000000000e7
+7 1 3 3 0.10485760000000000000e7
+*** ANSWER ***
+5.844380150176825550e-01 -1.584438015017682444e+00 -2.002107021181264257e-22 0.000000000000000000e+00 5.021765838988981181e-22 0.000000000000000000e+00 2.002106826178449975e-22
+1 1 1 1 5.265703136383709931e-16
+1 1 2 2 2.099361371842165349e-16
+1 1 2 3 -1.058843690649726934e-22
+1 1 3 3 2.099361167366894361e-16
+1 2 1 1 1.048576000000000000e+06
+2 1 1 1 1.000000000000005551e+00
+2 1 2 2 5.000000000000003331e-01
+2 1 2 3 6.469243385377873409e-15
+2 1 3 3 5.000000000000009992e-01
+2 2 1 1 3.388131789017201356e-21
+*** END ***
+*** REQUEST ***
+""
+7
+2
+3 1
+0.0 0.0 -0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0 0.52428800000000000000e6
+0 1 2 3 -0.52428800000000000000e6
+0 2 1 1 -0.10485760000000000000e7
+1 1 2 3 -0.52428800000000000000e6
+2 1 2 3 -0.52428800000000000000e6
+3 1 2 2 -0.10485760000000000000e7
+4 1 1 2 -0.52428800000000000000e6
+5 1 1 1 0.10485760000000000000e7
+5 1 2 3 0.52428800000000000000e6
+5 2 1 1 0.10485760000000000000e7
+6 1 1 3 0.10485760000000000000e7
+7 1 3 3 0.10485760000000000000e7
+*** ANSWER ***
+-5.844380150176825550e-01 1.584438015017682444e+00 -2.002107021181264257e-22 0.000000000000000000e+00 5.021765838988981181e-22 0.000000000000000000e+00 2.002106826178449975e-22
+1 1 1 1 5.265703136383709931e-16
+1 1 2 2 2.099361371842165349e-16
+1 1 2 3 1.058843690649726934e-22
+1 1 3 3 2.099361167366894361e-16
+1 2 1 1 1.048576000000000000e+06
+2 1 1 1 1.000000000000005551e+00
+2 1 2 2 5.000000000000003331e-01
+2 1 2 3 -6.469243385377873409e-15
+2 1 3 3 5.000000000000009992e-01
+2 2 1 1 3.388131789017201356e-21
+*** END ***
+*** REQUEST ***
+""
+5
+3
+3 1 1
+-0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0 0.0
+0 1 2 3 0.52428800000000000000e6
+0 2 1 1 -0.10485760000000000000e7
+1 1 3 3 -0.10485760000000000000e7
+2 1 2 3 -0.52428800000000000000e6
+3 1 1 1 0.10485760000000000000e7
+3 1 2 3 -0.52428800000000000000e6
+3 2 1 1 0.10485760000000000000e7
+4 1 1 3 0.10485760000000000000e7
+5 1 1 2 0.52428800000000000000e6
+5 1 2 3 0.52428800000000000000e6
+5 2 1 1 -0.10485760000000000000e7
+5 3 1 1 0.10485760000000000000e7
+*** ANSWER ***
+-4.334665259043807452e-15 -1.000000000000002442e+00 2.614572177519653489e-15 -1.621893095060768740e-28 1.118406671931714504e-17
+1 1 1 1 2.741606956898514117e-09
+1 1 1 2 5.863671972137347341e-12
+1 1 1 3 -1.700678174046440642e-22
+1 1 2 2 2.932128366579138840e-14
+1 1 2 3 3.054907849415127301e-24
+1 1 3 3 4.545255279950785383e-09
+1 2 1 1 1.048576000000002794e+06
+1 3 1 1 1.175666522794048480e-11
+2 1 1 1 9.999999999918142146e-01
+2 1 1 2 -6.520506845507829041e+01
+2 1 1 3 1.588972252905990195e-14
+2 1 2 2 1.760931343491622829e+04
+2 1 2 3 -4.785912723036680060e-12
+2 1 3 3 4.999999999999998890e-01
+2 2 1 1 1.877488954426008097e-28
+2 3 1 1 6.520506845508334948e+01
+*** END ***
+*** REQUEST ***
+""
+5
+3
+3 1 1
+-0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0 0.0
+0 1 2 3 -0.52428800000000000000e6
+0 2 1 1 -0.10485760000000000000e7
+1 1 3 3 -0.10485760000000000000e7
+2 1 2 3 -0.52428800000000000000e6
+3 1 1 1 0.10485760000000000000e7
+3 1 2 3 0.52428800000000000000e6
+3 2 1 1 0.10485760000000000000e7
+4 1 1 3 0.10485760000000000000e7
+5 1 1 2 0.52428800000000000000e6
+5 1 2 3 -0.52428800000000000000e6
+5 2 1 1 -0.10485760000000000000e7
+5 3 1 1 0.10485760000000000000e7
+*** ANSWER ***
+-4.334665259043807452e-15 1.000000000000002442e+00 2.614572177519653489e-15 1.621893095060768740e-28 1.118406671931714504e-17
+1 1 1 1 2.741606956898514117e-09
+1 1 1 2 5.863671972137347341e-12
+1 1 1 3 1.700678174046440642e-22
+1 1 2 2 2.932128366579138840e-14
+1 1 2 3 -3.054907849415127301e-24
+1 1 3 3 4.545255279950785383e-09
+1 2 1 1 1.048576000000002794e+06
+1 3 1 1 1.175666522794048480e-11
+2 1 1 1 9.999999999918142146e-01
+2 1 1 2 -6.520506845507829041e+01
+2 1 1 3 -1.588972252905990195e-14
+2 1 2 2 1.760931343491622829e+04
+2 1 2 3 4.785912723036680060e-12
+2 1 3 3 4.999999999999998890e-01
+2 2 1 1 1.877488954426008097e-28
+2 3 1 1 6.520506845508334948e+01
+*** END ***
+*** REQUEST ***
+""
+4
+5
+3 1 1 1 1
+0.52428800000000000000e6 -0.10485760000000000000e7 0.26214400000000000000e6 0.52428800000000000000e6
+0 1 1 2 0.26214400000000000000e6
+0 4 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 1 1 2 -0.26214400000000000000e6
+1 4 1 1 0.52428800000000000000e6
+2 1 1 3 0.52428800000000000000e6
+2 1 2 3 -0.52428800000000000000e6
+2 4 1 1 -0.10485760000000000000e7
+2 5 1 1 -0.10485760000000000000e7
+3 1 2 3 -0.26214400000000000000e6
+3 2 1 1 0.52428800000000000000e6
+4 1 1 2 0.26214400000000000000e6
+4 1 2 3 0.26214400000000000000e6
+4 3 1 1 0.52428800000000000000e6
+4 5 1 1 0.52428800000000000000e6
+*** ANSWER ***
+4.118092054457210231e-09 9.763300859798756793e-13 1.000000004114512953e+00 1.000000004116005980e+00
+1 1 1 1 2.159981747552098402e-03
+1 1 1 2 -5.118781501939859645e-07
+1 1 1 3 5.118781481182170602e-07
+1 1 2 2 9.155005048358325121e-07
+1 1 2 3 -1.204751118465025234e-07
+1 1 3 3 9.155005048358325121e-07
+1 2 1 1 5.242880021581052570e+05
+1 3 1 1 5.242880021588880336e+05
+1 4 1 1 5.242880021588880336e+05
+1 5 1 1 5.242880021578643937e+05
+2 1 1 1 2.499999992797296677e+00
+2 1 1 2 1.499999994637215339e+00
+2 1 1 3 -1.499999994607143838e+00
+2 1 2 2 4.949134399433892213e+02
+2 1 2 3 -4.999999982662907128e-01
+2 1 3 3 4.949134399433440308e+02
+2 2 1 1 1.839746329783988989e-09
+2 3 1 1 1.839746330203519693e-09
+2 4 1 1 1.839746330203519693e-09
+2 5 1 1 1.839746329524873215e-09
+*** END ***
+*** REQUEST ***
+""
+5
+3
+3 1 1
+0.0 -0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0
+0 1 2 3 0.52428800000000000000e6
+0 2 1 1 -0.10485760000000000000e7
+1 1 2 3 -0.52428800000000000000e6
+2 1 2 2 -0.10485760000000000000e7
+3 1 1 2 -0.52428800000000000000e6
+4 1 1 1 0.10485760000000000000e7
+4 1 2 3 -0.52428800000000000000e6
+4 2 1 1 0.10485760000000000000e7
+5 1 1 3 0.52428800000000000000e6
+5 1 2 3 0.52428800000000000000e6
+5 2 1 1 -0.10485760000000000000e7
+5 3 1 1 0.10485760000000000000e7
+*** ANSWER ***
+-1.000000000000002442e+00 -4.334665259020949418e-15 5.606088354105582826e-28 2.614572177419890983e-15 1.118406671907423752e-17
+1 1 1 1 2.741606956793905548e-09
+1 1 1 2 -2.939204850997307809e-22
+1 1 1 3 5.863671972009993838e-12
+1 1 2 2 4.545255279926816170e-09
+1 1 2 3 -2.434139855805221498e-24
+1 1 3 3 2.932128366579138840e-14
+1 2 1 1 1.048576000000002794e+06
+1 3 1 1 1.175666522768578103e-11
+2 1 1 1 9.999999999992648103e-01
+2 1 1 2 -1.050203893353059269e-15
+2 1 1 3 -6.520506845461493128e+01
+2 1 2 2 4.999999999999999445e-01
+2 1 2 3 4.500401044987887586e-12
+2 1 3 3 1.760931343462711448e+04
+2 2 1 1 1.877488954426008097e-28
+2 3 1 1 6.520506845461341072e+01
+*** END ***
+*** REQUEST ***
+""
+5
+3
+3 1 1
+0.0 -0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0
+0 1 2 3 -0.52428800000000000000e6
+0 2 1 1 -0.10485760000000000000e7
+1 1 2 3 -0.52428800000000000000e6
+2 1 2 2 -0.10485760000000000000e7
+3 1 1 2 -0.52428800000000000000e6
+4 1 1 1 0.10485760000000000000e7
+4 1 2 3 0.52428800000000000000e6
+4 2 1 1 0.10485760000000000000e7
+5 1 1 3 0.52428800000000000000e6
+5 1 2 3 -0.52428800000000000000e6
+5 2 1 1 -0.10485760000000000000e7
+5 3 1 1 0.10485760000000000000e7
+*** ANSWER ***
+1.000000000000002442e+00 -4.334665259020949418e-15 -5.606088354105582826e-28 2.614572177419890983e-15 1.118406671907423752e-17
+1 1 1 1 2.741606956793905548e-09
+1 1 1 2 2.939204850997307809e-22
+1 1 1 3 5.863671972009993838e-12
+1 1 2 2 4.545255279926816170e-09
+1 1 2 3 2.434139855805221498e-24
+1 1 3 3 2.932128366579138840e-14
+1 2 1 1 1.048576000000002794e+06
+1 3 1 1 1.175666522768578103e-11
+2 1 1 1 9.999999999992648103e-01
+2 1 1 2 1.050203893353059269e-15
+2 1 1 3 -6.520506845461493128e+01
+2 1 2 2 4.999999999999999445e-01
+2 1 2 3 -4.500401044987887586e-12
+2 1 3 3 1.760931343462711448e+04
+2 2 1 1 1.877488954426008097e-28
+2 3 1 1 6.520506845461341072e+01
+*** END ***
+*** REQUEST ***
+""
+4
+5
+3 1 1 1 1
+0.52428800000000000000e6 -0.10485760000000000000e7 0.26214400000000000000e6 0.52428800000000000000e6
+0 1 1 2 -0.26214400000000000000e6
+0 4 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 1 1 2 0.26214400000000000000e6
+1 4 1 1 0.52428800000000000000e6
+2 1 1 3 0.52428800000000000000e6
+2 1 2 3 0.52428800000000000000e6
+2 4 1 1 -0.10485760000000000000e7
+2 5 1 1 -0.10485760000000000000e7
+3 1 2 3 0.26214400000000000000e6
+3 2 1 1 0.52428800000000000000e6
+4 1 1 2 -0.26214400000000000000e6
+4 1 2 3 -0.26214400000000000000e6
+4 3 1 1 0.52428800000000000000e6
+4 5 1 1 0.52428800000000000000e6
+*** ANSWER ***
+4.118273893088214138e-09 9.763435770901940280e-13 1.000000004114694807e+00 1.000000004116187835e+00
+1 1 1 1 2.160077100337560573e-03
+1 1 1 2 5.118852202080574288e-07
+1 1 1 3 5.118852213454636466e-07
+1 1 2 2 9.155174781272308520e-07
+1 1 2 3 1.204757363328014633e-07
+1 1 3 3 9.155174781272308520e-07
+1 2 1 1 5.242880021582006011e+05
+1 3 1 1 5.242880021589833777e+05
+1 4 1 1 5.242880021589833777e+05
+1 5 1 1 5.242880021579596214e+05
+2 1 1 1 2.499999992641865898e+00
+2 1 1 2 -1.499999994481538312e+00
+2 1 1 3 -1.499999994475682774e+00
+2 1 2 2 4.949267107243919099e+02
+2 1 2 3 4.999999980314884795e-01
+2 1 3 3 4.949267107244114072e+02
+2 2 1 1 1.839821451888448591e-09
+2 3 1 1 1.839821452307982810e-09
+2 4 1 1 1.839821452307975986e-09
+2 5 1 1 1.839821451629315859e-09
+*** END ***
+*** REQUEST ***
+""
+4
+5
+3 1 1 1 1
+0.10485760000000000000e7 -0.10485760000000000000e7 0.52428800000000000000e6 0.52428800000000000000e6
+0 1 2 3 -0.26214400000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 1 2 3 0.26214400000000000000e6
+1 2 1 1 0.52428800000000000000e6
+2 1 1 2 0.52428800000000000000e6
+2 4 1 1 -0.10485760000000000000e7
+3 1 1 3 -0.26214400000000000000e6
+3 3 1 1 0.52428800000000000000e6
+4 1 2 3 -0.26214400000000000000e6
+4 5 1 1 0.52428800000000000000e6
+*** ANSWER ***
+8.077823973606246735e-10 -8.926408509491123330e-12 1.785281701903898931e-11 1.000000000807534262e+00
+1 1 1 1 4.236279347366532478e-04
+1 1 1 2 -4.680008864624082069e-06
+1 1 1 3 -4.680008864638956814e-06
+1 1 2 2 1.173171892461018907e-07
+1 1 2 3 5.869895003628600373e-08
+1 1 3 3 1.173171892461018907e-07
+1 2 1 1 5.242880004236152163e+05
+1 3 1 1 9.477334918524016631e-06
+1 4 1 1 9.477334918494267140e-06
+1 5 1 1 5.242880004234978696e+05
+2 1 1 1 2.999999999568473630e+00
+2 1 1 2 2.888028115506786975e+01
+2 1 1 3 2.888028115507193760e+01
+2 1 2 2 1.089107062653899447e+03
+2 1 2 3 -9.999999998078441532e-01
+2 1 3 3 1.089107062654042238e+03
+2 2 1 1 2.841711504849646364e-10
+2 3 1 1 2.988028115507380633e+01
+2 4 1 1 2.988028115507496452e+01
+2 5 1 1 2.841711515543517457e-10
+*** END ***
+*** REQUEST ***
+""
+1
+1
+2
+0.10485760000000000000e7
+0 1 2 2 -0.10485760000000000000e7
+1 1 1 1 0.10485760000000000000e7
+1 1 2 2 0.10485760000000000000e7
+*** ANSWER ***
+2.258572840667610832e-15
+1 1 1 1 2.368285274975880696e-09
+1 1 2 2 1.048576000000002328e+06
+2 1 1 1 1.000000000000000000e+00
+2 1 2 2 5.111818665832156499e-28
+*** END ***
+*** REQUEST ***
+""
+2
+2
+3 1
+0.13107200000000000000e6 0.18350080000000000000e7
+0 1 1 2 -0.13107200000000000000e6
+0 1 3 3 0.26214400000000000000e6
+0 2 1 1 0.26214400000000000000e6
+1 1 1 1 0.78643200000000000000e6
+1 1 1 2 0.13107200000000000000e6
+1 1 3 3 -0.26214400000000000000e6
+1 2 1 1 -0.26214400000000000000e6
+2 1 1 2 -0.52428800000000000000e6
+2 1 1 3 0.78643200000000000000e6
+2 1 2 2 0.15728640000000000000e7
+2 1 3 3 0.10485760000000000000e7
+2 2 1 1 0.10485760000000000000e7
+*** ANSWER ***
+3.613357683429287537e+00 2.020964582789953834e+00
+1 1 1 1 2.841660109694661573e+06
+1 1 1 2 -4.548854608993356815e+05
+1 1 1 3 1.589351218772669090e+06
+1 1 2 2 3.178702437545338180e+06
+1 1 3 3 9.097709217986713629e+05
+1 2 1 1 9.097709217986713629e+05
+2 1 1 1 5.484476916572960548e+00
+2 1 1 2 7.849544233698806384e-01
+2 1 1 3 -9.581298814245272411e+00
+2 1 2 2 1.123449810993547571e-01
+2 1 2 3 -1.371303589607832718e+00
+2 1 3 3 1.673838516073283955e+01
+2 2 1 1 1.235591432443268264e-08
+*** END ***
+*** REQUEST ***
+""
+6
+5
+5 1 1 1 1
+0.10485760000000000000e7 -0.10485760000000000000e7 0.0 -0.10485760000000000000e7 0.52428800000000000000e6 0.52428800000000000000e6
+0 1 2 3 -0.26214400000000000000e6
+0 1 4 5 0.26214400000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+1 1 1 1 0.52428800000000000000e6
+1 1 2 3 0.26214400000000000000e6
+1 1 4 5 -0.26214400000000000000e6
+1 2 1 1 0.52428800000000000000e6
+2 1 1 2 0.52428800000000000000e6
+2 4 1 1 -0.10485760000000000000e7
+3 1 2 4 0.52428800000000000000e6
+3 1 3 5 0.52428800000000000000e6
+4 1 2 2 -0.52428800000000000000e6
+4 1 2 3 -0.52428800000000000000e6
+4 1 3 3 -0.52428800000000000000e6
+4 1 4 4 0.52428800000000000000e6
+4 1 4 5 0.52428800000000000000e6
+4 1 5 5 0.52428800000000000000e6
+4 2 1 1 -0.10485760000000000000e7
+5 1 1 3 -0.26214400000000000000e6
+5 3 1 1 0.52428800000000000000e6
+6 1 2 3 -0.26214400000000000000e6
+6 5 1 1 0.52428800000000000000e6
+*** ANSWER ***
+Infeasible
+*** END ***
+*** REQUEST ***
+""
+26
+7
+5 1 5 1 5 1 1
+-0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.10485760000000000000e7 0.52428800000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 0.10485760000000000000e7 -0.10485760000000000000e7 0.0 0.0 0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.52428800000000000000e6 0.52428800000000000000e6
+0 1 4 5 0.26214400000000000000e6
+0 2 1 1 -0.52428800000000000000e6
+0 3 1 2 -0.26214400000000000000e6
+1 3 4 5 -0.26214400000000000000e6
+1 5 4 4 -0.52428800000000000000e6
+2 3 3 5 -0.26214400000000000000e6
+2 5 3 4 -0.26214400000000000000e6
+3 1 1 1 0.52428800000000000000e6
+3 1 4 5 -0.26214400000000000000e6
+3 2 1 1 0.52428800000000000000e6
+3 3 1 2 0.26214400000000000000e6
+4 1 1 3 0.52428800000000000000e6
+4 3 2 3 0.52428800000000000000e6
+4 3 4 5 -0.52428800000000000000e6
+4 4 1 1 0.10485760000000000000e7
+5 1 2 2 0.52428800000000000000e6
+5 5 1 2 -0.26214400000000000000e6
+6 1 2 3 0.52428800000000000000e6
+6 3 1 2 -0.52428800000000000000e6
+7 1 2 4 0.52428800000000000000e6
+7 5 1 4 -0.52428800000000000000e6
+8 1 3 5 0.52428800000000000000e6
+8 5 1 4 0.52428800000000000000e6
+9 1 3 3 -0.52428800000000000000e6
+9 1 4 4 0.52428800000000000000e6
+9 1 4 5 0.52428800000000000000e6
+9 1 5 5 0.52428800000000000000e6
+9 2 1 1 -0.10485760000000000000e7
+9 3 1 2 -0.52428800000000000000e6
+9 5 1 2 -0.26214400000000000000e6
+10 3 1 1 0.52428800000000000000e6
+10 3 2 3 0.26214400000000000000e6
+10 3 4 5 -0.26214400000000000000e6
+10 4 1 1 0.52428800000000000000e6
+11 1 3 3 -0.10485760000000000000e7
+11 3 1 3 0.52428800000000000000e6
+12 1 3 4 -0.52428800000000000000e6
+12 3 1 4 0.52428800000000000000e6
+13 3 1 5 0.52428800000000000000e6
+13 5 1 4 0.52428800000000000000e6
+14 3 2 2 0.52428800000000000000e6
+14 5 2 3 -0.26214400000000000000e6
+15 3 2 4 0.52428800000000000000e6
+15 5 3 4 -0.52428800000000000000e6
+16 3 2 3 0.52428800000000000000e6
+16 3 3 3 0.52428800000000000000e6
+16 3 4 4 -0.52428800000000000000e6
+16 3 4 5 -0.52428800000000000000e6
+16 4 1 1 0.10485760000000000000e7
+16 5 2 3 0.26214400000000000000e6
+16 5 4 5 0.26214400000000000000e6
+17 3 5 5 0.52428800000000000000e6
+17 5 4 5 0.26214400000000000000e6
+18 1 1 2 -0.26214400000000000000e6
+18 5 1 1 0.52428800000000000000e6
+19 3 1 2 -0.52428800000000000000e6
+19 5 1 3 0.52428800000000000000e6
+20 1 2 5 -0.52428800000000000000e6
+20 5 1 5 0.52428800000000000000e6
+21 3 2 5 0.52428800000000000000e6
+21 5 2 4 0.52428800000000000000e6
+22 3 2 3 -0.26214400000000000000e6
+22 5 3 3 0.52428800000000000000e6
+23 3 2 5 -0.52428800000000000000e6
+23 5 3 5 0.52428800000000000000e6
+24 1 1 2 0.52428800000000000000e6
+24 3 2 3 -0.26214400000000000000e6
+24 5 2 2 -0.52428800000000000000e6
+24 5 4 4 0.52428800000000000000e6
+24 5 5 5 0.52428800000000000000e6
+25 1 1 2 0.26214400000000000000e6
+25 5 2 3 0.26214400000000000000e6
+25 5 4 5 -0.26214400000000000000e6
+25 6 1 1 0.52428800000000000000e6
+26 3 1 2 -0.26214400000000000000e6
+26 7 1 1 0.52428800000000000000e6
+*** ANSWER ***
+Failure
+*** END ***
+*** REQUEST ***
+""
+143
+8
+15 5 5 1 5 1 5 1
+0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 -0.52428800000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.52428800000000000000e6 0.26214400000000000000e6 0.52428800000000000000e6 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.52428800000000000000e6 0.0 0.0 0.0 0.78643200000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6
+0 1 1 6 0.65536000000000000000e5
+0 1 1 10 -0.65536000000000000000e5
+0 1 3 14 0.65536000000000000000e5
+0 1 5 6 0.65536000000000000000e5
+0 1 8 9 -0.65536000000000000000e5
+0 1 14 15 -0.65536000000000000000e5
+0 2 2 2 -0.13107200000000000000e6
+0 2 5 5 0.13107200000000000000e6
+0 7 2 3 0.13107200000000000000e6
+0 7 4 5 -0.13107200000000000000e6
+0 8 1 1 0.26214400000000000000e6
+1 2 1 1 0.52428800000000000000e6
+1 2 2 2 -0.26214400000000000000e6
+1 2 3 3 -0.26214400000000000000e6
+1 2 4 4 0.26214400000000000000e6
+1 2 5 5 0.26214400000000000000e6
+2 1 1 8 0.13107200000000000000e6
+2 1 1 12 0.26214400000000000000e6
+2 1 3 12 -0.13107200000000000000e6
+2 1 4 11 0.13107200000000000000e6
+2 1 5 8 0.13107200000000000000e6
+2 1 12 15 0.13107200000000000000e6
+2 1 13 14 -0.13107200000000000000e6
+2 2 2 4 0.13107200000000000000e6
+2 2 3 5 0.13107200000000000000e6
+3 1 4 11 0.26214400000000000000e6
+3 1 5 12 -0.13107200000000000000e6
+3 1 6 13 -0.13107200000000000000e6
+3 1 8 15 -0.13107200000000000000e6
+3 1 10 13 0.13107200000000000000e6
+4 1 1 8 -0.13107200000000000000e6
+4 1 5 8 -0.13107200000000000000e6
+4 1 13 14 -0.13107200000000000000e6
+4 2 2 4 -0.13107200000000000000e6
+5 1 6 15 -0.13107200000000000000e6
+5 7 4 5 -0.13107200000000000000e6
+6 1 3 14 -0.13107200000000000000e6
+6 1 12 13 -0.13107200000000000000e6
+7 1 4 15 -0.13107200000000000000e6
+7 1 8 11 -0.13107200000000000000e6
+8 1 1 8 0.26214400000000000000e6
+8 1 3 8 -0.13107200000000000000e6
+8 1 8 15 0.13107200000000000000e6
+8 1 10 13 -0.13107200000000000000e6
+8 7 3 4 -0.13107200000000000000e6
+9 1 1 6 -0.13107200000000000000e6
+9 1 5 6 -0.13107200000000000000e6
+9 1 8 9 -0.13107200000000000000e6
+9 2 3 3 -0.26214400000000000000e6
+10 1 3 10 -0.13107200000000000000e6
+10 7 4 5 -0.13107200000000000000e6
+11 1 1 2 0.26214400000000000000e6
+11 1 2 3 -0.13107200000000000000e6
+11 1 11 12 0.13107200000000000000e6
+11 3 2 3 -0.13107200000000000000e6
+11 3 4 5 -0.13107200000000000000e6
+12 1 6 13 -0.13107200000000000000e6
+12 7 3 4 -0.13107200000000000000e6
+13 1 4 11 0.13107200000000000000e6
+13 1 5 8 -0.13107200000000000000e6
+13 1 13 14 -0.13107200000000000000e6
+13 2 3 5 0.13107200000000000000e6
+14 1 2 9 -0.13107200000000000000e6
+14 1 4 13 -0.13107200000000000000e6
+15 1 3 8 -0.13107200000000000000e6
+15 1 5 12 -0.13107200000000000000e6
+16 1 2 9 0.26214400000000000000e6
+16 1 2 13 -0.13107200000000000000e6
+16 1 7 10 -0.13107200000000000000e6
+16 1 7 14 -0.26214400000000000000e6
+16 1 11 14 -0.13107200000000000000e6
+16 2 1 4 0.26214400000000000000e6
+16 3 3 4 0.13107200000000000000e6
+17 1 1 8 -0.13107200000000000000e6
+17 1 4 11 -0.13107200000000000000e6
+18 1 1 1 0.26214400000000000000e6
+18 1 1 6 -0.65536000000000000000e5
+18 1 1 10 0.65536000000000000000e5
+18 1 3 14 -0.65536000000000000000e5
+18 1 5 6 -0.65536000000000000000e5
+18 1 8 9 0.65536000000000000000e5
+18 1 14 15 0.65536000000000000000e5
+18 2 2 2 0.13107200000000000000e6
+18 2 5 5 -0.13107200000000000000e6
+18 7 2 3 -0.13107200000000000000e6
+18 7 4 5 0.13107200000000000000e6
+18 8 1 1 -0.26214400000000000000e6
+19 1 1 3 0.26214400000000000000e6
+19 1 3 14 -0.26214400000000000000e6
+19 1 5 6 -0.26214400000000000000e6
+19 1 8 9 0.26214400000000000000e6
+19 1 12 13 0.26214400000000000000e6
+19 2 2 2 0.52428800000000000000e6
+19 7 2 3 -0.52428800000000000000e6
+19 7 4 5 0.52428800000000000000e6
+19 8 1 1 -0.10485760000000000000e7
+20 1 1 5 0.26214400000000000000e6
+20 7 2 3 0.26214400000000000000e6
+20 7 4 5 -0.26214400000000000000e6
+20 8 1 1 0.52428800000000000000e6
+21 1 1 7 0.26214400000000000000e6
+21 1 2 9 0.26214400000000000000e6
+21 1 7 14 -0.26214400000000000000e6
+21 2 1 4 0.26214400000000000000e6
+22 1 1 9 0.26214400000000000000e6
+22 1 4 7 -0.26214400000000000000e6
+23 1 1 11 0.26214400000000000000e6
+23 1 2 13 0.26214400000000000000e6
+23 1 11 14 -0.26214400000000000000e6
+23 2 1 5 0.26214400000000000000e6
+24 1 1 13 0.26214400000000000000e6
+24 1 4 11 -0.26214400000000000000e6
+25 1 1 6 -0.13107200000000000000e6
+25 1 1 10 0.13107200000000000000e6
+25 1 1 14 0.26214400000000000000e6
+25 1 3 14 -0.13107200000000000000e6
+25 1 5 6 -0.13107200000000000000e6
+25 1 8 9 0.13107200000000000000e6
+25 1 14 15 0.13107200000000000000e6
+25 2 1 1 -0.52428800000000000000e6
+25 2 2 2 0.26214400000000000000e6
+25 2 5 5 -0.26214400000000000000e6
+26 1 1 15 0.26214400000000000000e6
+26 1 12 13 0.26214400000000000000e6
+26 1 14 15 -0.26214400000000000000e6
+26 2 5 5 0.52428800000000000000e6
+27 1 2 2 0.26214400000000000000e6
+27 1 3 14 -0.13107200000000000000e6
+27 1 5 6 -0.13107200000000000000e6
+27 1 8 9 0.13107200000000000000e6
+27 1 12 13 0.13107200000000000000e6
+27 2 2 2 0.26214400000000000000e6
+27 7 2 3 -0.26214400000000000000e6
+27 7 4 5 0.26214400000000000000e6
+27 8 1 1 -0.52428800000000000000e6
+28 1 2 4 0.26214400000000000000e6
+28 7 2 3 0.26214400000000000000e6
+28 7 4 5 -0.26214400000000000000e6
+28 8 1 1 0.52428800000000000000e6
+29 1 2 5 0.26214400000000000000e6
+29 7 1 2 -0.26214400000000000000e6
+30 1 2 6 0.26214400000000000000e6
+30 3 2 3 -0.26214400000000000000e6
+31 1 1 8 -0.26214400000000000000e6
+31 1 2 7 0.26214400000000000000e6
+32 1 2 8 0.26214400000000000000e6
+32 1 2 9 0.52428800000000000000e6
+32 1 7 10 -0.26214400000000000000e6
+32 1 7 14 -0.52428800000000000000e6
+32 1 11 14 -0.26214400000000000000e6
+32 2 1 4 0.52428800000000000000e6
+32 3 3 4 0.26214400000000000000e6
+33 1 1 2 0.52428800000000000000e6
+33 1 2 3 -0.26214400000000000000e6
+33 1 2 10 0.26214400000000000000e6
+33 1 11 12 0.26214400000000000000e6
+33 3 2 3 -0.26214400000000000000e6
+34 1 1 12 -0.26214400000000000000e6
+34 1 2 11 0.26214400000000000000e6
+35 1 2 12 0.26214400000000000000e6
+35 5 2 5 -0.26214400000000000000e6
+36 1 2 14 0.26214400000000000000e6
+36 1 8 11 -0.26214400000000000000e6
+37 1 2 15 0.26214400000000000000e6
+37 1 11 12 -0.26214400000000000000e6
+38 1 3 3 0.26214400000000000000e6
+38 1 3 10 -0.13107200000000000000e6
+38 1 3 14 -0.26214400000000000000e6
+38 1 5 6 -0.26214400000000000000e6
+38 1 8 9 0.26214400000000000000e6
+38 1 12 12 -0.26214400000000000000e6
+38 1 12 13 0.26214400000000000000e6
+38 2 2 2 0.52428800000000000000e6
+38 7 2 3 -0.39321600000000000000e6
+38 7 4 5 0.52428800000000000000e6
+38 8 1 1 -0.10485760000000000000e7
+39 1 3 4 0.26214400000000000000e6
+39 7 1 2 -0.26214400000000000000e6
+40 1 3 5 0.26214400000000000000e6
+40 1 5 6 0.26214400000000000000e6
+40 1 8 9 -0.26214400000000000000e6
+40 1 12 13 -0.26214400000000000000e6
+40 7 2 3 0.52428800000000000000e6
+40 7 4 5 -0.52428800000000000000e6
+40 8 1 1 0.10485760000000000000e7
+41 1 3 6 0.26214400000000000000e6
+41 7 2 3 -0.26214400000000000000e6
+42 1 2 9 0.52428800000000000000e6
+42 1 3 7 0.26214400000000000000e6
+42 1 7 10 -0.26214400000000000000e6
+42 1 7 14 -0.52428800000000000000e6
+42 1 11 14 -0.26214400000000000000e6
+42 2 1 4 0.52428800000000000000e6
+42 3 3 4 0.26214400000000000000e6
+43 1 3 9 0.26214400000000000000e6
+43 1 5 8 -0.26214400000000000000e6
+44 1 3 11 0.26214400000000000000e6
+44 5 2 5 -0.26214400000000000000e6
+45 1 3 13 0.26214400000000000000e6
+45 1 5 12 -0.26214400000000000000e6
+46 1 3 15 0.26214400000000000000e6
+46 1 12 12 -0.52428800000000000000e6
+47 1 1 6 -0.13107200000000000000e6
+47 1 4 4 0.26214400000000000000e6
+48 1 4 5 0.26214400000000000000e6
+48 3 2 3 -0.26214400000000000000e6
+49 1 2 9 -0.26214400000000000000e6
+49 1 4 8 0.26214400000000000000e6
+50 1 4 9 0.26214400000000000000e6
+50 3 3 4 -0.26214400000000000000e6
+51 1 1 4 0.52428800000000000000e6
+51 1 4 6 -0.26214400000000000000e6
+51 1 4 10 0.26214400000000000000e6
+51 1 4 15 0.26214400000000000000e6
+51 7 1 2 -0.26214400000000000000e6
+52 1 2 13 -0.26214400000000000000e6
+52 1 4 12 0.26214400000000000000e6
+53 1 4 14 0.26214400000000000000e6
+53 3 4 5 -0.26214400000000000000e6
+54 1 5 5 0.26214400000000000000e6
+54 7 2 3 -0.13107200000000000000e6
+55 1 2 9 -0.26214400000000000000e6
+55 1 5 7 0.26214400000000000000e6
+56 1 5 9 0.26214400000000000000e6
+56 7 3 4 -0.26214400000000000000e6
+57 1 5 10 0.26214400000000000000e6
+57 1 8 9 -0.26214400000000000000e6
+58 1 2 13 -0.26214400000000000000e6
+58 1 5 11 0.26214400000000000000e6
+59 1 4 11 0.26214400000000000000e6
+59 1 5 13 0.26214400000000000000e6
+59 1 13 14 -0.26214400000000000000e6
+59 2 3 5 0.26214400000000000000e6
+60 1 5 14 0.26214400000000000000e6
+60 7 4 5 -0.26214400000000000000e6
+61 1 5 15 0.26214400000000000000e6
+61 1 12 13 -0.26214400000000000000e6
+62 1 6 7 0.26214400000000000000e6
+62 3 3 4 -0.26214400000000000000e6
+63 1 6 8 0.26214400000000000000e6
+63 7 3 4 -0.26214400000000000000e6
+64 1 1 6 0.52428800000000000000e6
+64 1 6 6 -0.52428800000000000000e6
+64 1 6 10 0.26214400000000000000e6
+64 1 6 15 0.26214400000000000000e6
+64 7 2 3 -0.26214400000000000000e6
+65 1 4 13 -0.26214400000000000000e6
+65 1 6 11 0.26214400000000000000e6
+66 1 4 11 0.26214400000000000000e6
+66 1 6 12 0.26214400000000000000e6
+66 1 13 14 -0.26214400000000000000e6
+66 2 3 5 0.26214400000000000000e6
+67 1 1 6 -0.26214400000000000000e6
+67 1 5 6 -0.26214400000000000000e6
+67 1 6 14 0.26214400000000000000e6
+67 2 3 3 -0.52428800000000000000e6
+68 1 1 10 -0.13107200000000000000e6
+68 1 7 7 0.26214400000000000000e6
+69 1 1 2 0.52428800000000000000e6
+69 1 2 3 -0.26214400000000000000e6
+69 1 7 8 0.26214400000000000000e6
+69 1 11 12 0.26214400000000000000e6
+69 3 2 3 -0.26214400000000000000e6
+70 1 1 4 0.52428800000000000000e6
+70 1 4 6 -0.26214400000000000000e6
+70 1 4 15 0.26214400000000000000e6
+70 1 7 9 0.26214400000000000000e6
+70 7 1 2 -0.26214400000000000000e6
+71 1 1 6 -0.13107200000000000000e6
+71 1 1 10 0.13107200000000000000e6
+71 1 3 14 -0.13107200000000000000e6
+71 1 5 6 -0.13107200000000000000e6
+71 1 7 11 0.26214400000000000000e6
+71 1 8 9 0.13107200000000000000e6
+71 1 14 15 0.13107200000000000000e6
+71 2 1 1 -0.52428800000000000000e6
+71 2 2 2 0.26214400000000000000e6
+71 2 5 5 -0.26214400000000000000e6
+72 1 7 12 0.26214400000000000000e6
+72 1 8 11 -0.26214400000000000000e6
+73 1 7 13 0.26214400000000000000e6
+73 3 4 5 -0.26214400000000000000e6
+74 1 7 15 0.26214400000000000000e6
+74 1 11 14 -0.26214400000000000000e6
+75 1 3 10 -0.13107200000000000000e6
+75 1 8 8 0.26214400000000000000e6
+76 1 1 8 0.52428800000000000000e6
+76 1 3 8 -0.26214400000000000000e6
+76 1 8 10 0.26214400000000000000e6
+76 1 8 15 0.26214400000000000000e6
+76 7 3 4 -0.26214400000000000000e6
+77 1 3 14 -0.26214400000000000000e6
+77 1 8 12 0.26214400000000000000e6
+78 1 8 13 0.26214400000000000000e6
+78 7 4 5 -0.26214400000000000000e6
+79 1 1 8 -0.26214400000000000000e6
+79 1 5 8 -0.26214400000000000000e6
+79 1 8 14 0.26214400000000000000e6
+79 2 2 4 -0.26214400000000000000e6
+80 1 1 6 0.26214400000000000000e6
+80 1 6 6 -0.26214400000000000000e6
+80 1 6 15 0.13107200000000000000e6
+80 1 9 9 0.26214400000000000000e6
+80 7 2 3 -0.13107200000000000000e6
+81 1 4 7 0.52428800000000000000e6
+81 1 5 8 -0.26214400000000000000e6
+81 1 6 9 -0.26214400000000000000e6
+81 1 9 10 0.26214400000000000000e6
+81 1 13 14 0.26214400000000000000e6
+82 1 9 11 0.26214400000000000000e6
+82 3 4 5 -0.26214400000000000000e6
+83 1 9 12 0.26214400000000000000e6
+83 7 4 5 -0.26214400000000000000e6
+84 1 1 6 -0.26214400000000000000e6
+84 1 5 6 -0.26214400000000000000e6
+84 1 9 13 0.26214400000000000000e6
+84 2 3 3 -0.52428800000000000000e6
+85 1 9 14 0.26214400000000000000e6
+85 1 10 13 -0.26214400000000000000e6
+86 1 9 15 0.26214400000000000000e6
+86 1 13 14 -0.26214400000000000000e6
+87 1 1 6 0.26214400000000000000e6
+87 1 1 10 0.26214400000000000000e6
+87 1 3 10 -0.13107200000000000000e6
+87 1 6 6 -0.26214400000000000000e6
+87 1 6 15 0.13107200000000000000e6
+87 1 10 10 0.26214400000000000000e6
+87 1 10 15 0.13107200000000000000e6
+87 7 2 3 -0.13107200000000000000e6
+88 1 7 14 -0.26214400000000000000e6
+88 1 10 11 0.26214400000000000000e6
+89 1 1 8 -0.26214400000000000000e6
+89 1 5 8 -0.26214400000000000000e6
+89 1 10 12 0.26214400000000000000e6
+89 2 2 4 -0.26214400000000000000e6
+90 1 1 10 -0.26214400000000000000e6
+90 1 8 9 -0.26214400000000000000e6
+90 1 10 14 0.26214400000000000000e6
+90 2 4 4 -0.52428800000000000000e6
+91 1 11 11 0.26214400000000000000e6
+91 1 12 13 0.13107200000000000000e6
+91 1 14 15 -0.13107200000000000000e6
+91 2 5 5 0.26214400000000000000e6
+92 1 4 15 -0.26214400000000000000e6
+92 1 11 13 0.26214400000000000000e6
+93 1 2 13 -0.52428800000000000000e6
+93 1 4 13 -0.26214400000000000000e6
+93 1 7 14 0.26214400000000000000e6
+93 1 11 14 0.52428800000000000000e6
+93 1 11 15 0.26214400000000000000e6
+93 2 1 5 -0.52428800000000000000e6
+93 5 2 5 -0.26214400000000000000e6
+94 1 8 15 -0.26214400000000000000e6
+94 1 12 14 0.26214400000000000000e6
+95 1 6 15 -0.13107200000000000000e6
+95 1 13 13 0.26214400000000000000e6
+96 1 4 11 0.52428800000000000000e6
+96 1 5 12 -0.26214400000000000000e6
+96 1 6 13 -0.26214400000000000000e6
+96 1 10 13 0.26214400000000000000e6
+96 1 13 15 0.26214400000000000000e6
+97 1 10 15 -0.13107200000000000000e6
+97 1 14 14 0.26214400000000000000e6
+98 1 6 15 -0.13107200000000000000e6
+98 1 10 15 0.13107200000000000000e6
+98 1 12 12 -0.26214400000000000000e6
+98 1 12 13 -0.26214400000000000000e6
+98 1 14 15 0.26214400000000000000e6
+98 1 15 15 0.26214400000000000000e6
+98 2 5 5 -0.52428800000000000000e6
+99 1 1 2 0.26214400000000000000e6
+99 1 8 11 -0.26214400000000000000e6
+99 2 1 2 0.26214400000000000000e6
+99 7 1 2 0.26214400000000000000e6
+100 1 1 4 0.26214400000000000000e6
+100 2 1 3 0.26214400000000000000e6
+100 3 2 3 0.26214400000000000000e6
+100 3 4 5 -0.26214400000000000000e6
+101 2 2 3 0.26214400000000000000e6
+101 8 1 1 -0.52428800000000000000e6
+102 1 1 12 0.26214400000000000000e6
+102 1 5 12 0.26214400000000000000e6
+102 1 8 15 -0.26214400000000000000e6
+102 2 2 5 0.26214400000000000000e6
+103 1 4 7 0.26214400000000000000e6
+103 1 10 13 -0.26214400000000000000e6
+103 2 3 4 0.26214400000000000000e6
+103 7 3 4 0.26214400000000000000e6
+104 1 1 6 0.13107200000000000000e6
+104 1 1 10 -0.13107200000000000000e6
+104 1 3 14 0.13107200000000000000e6
+104 1 5 6 0.13107200000000000000e6
+104 1 8 9 -0.13107200000000000000e6
+104 1 10 15 -0.26214400000000000000e6
+104 1 14 15 -0.13107200000000000000e6
+104 2 1 1 0.52428800000000000000e6
+104 2 2 2 -0.26214400000000000000e6
+104 2 4 5 0.26214400000000000000e6
+104 2 5 5 0.26214400000000000000e6
+104 7 4 5 0.26214400000000000000e6
+105 1 1 4 -0.13107200000000000000e6
+105 3 1 1 0.26214400000000000000e6
+106 3 1 2 0.26214400000000000000e6
+106 7 2 3 0.26214400000000000000e6
+106 7 4 5 -0.26214400000000000000e6
+106 8 1 1 0.52428800000000000000e6
+107 1 1 6 -0.26214400000000000000e6
+107 3 1 3 0.26214400000000000000e6
+108 1 4 7 -0.26214400000000000000e6
+108 3 1 4 0.26214400000000000000e6
+109 1 4 11 -0.26214400000000000000e6
+109 3 1 5 0.26214400000000000000e6
+110 3 2 2 0.26214400000000000000e6
+110 7 1 2 -0.13107200000000000000e6
+111 1 2 9 -0.26214400000000000000e6
+111 3 2 4 0.26214400000000000000e6
+112 1 2 13 -0.26214400000000000000e6
+112 3 2 5 0.26214400000000000000e6
+113 1 4 6 -0.13107200000000000000e6
+113 3 3 3 0.26214400000000000000e6
+114 1 4 13 -0.26214400000000000000e6
+114 3 3 5 0.26214400000000000000e6
+115 1 1 4 0.26214400000000000000e6
+115 1 4 6 -0.13107200000000000000e6
+115 1 4 15 0.13107200000000000000e6
+115 3 4 4 0.26214400000000000000e6
+115 7 1 2 -0.13107200000000000000e6
+116 1 4 15 -0.13107200000000000000e6
+116 3 5 5 0.26214400000000000000e6
+117 1 1 4 0.13107200000000000000e6
+117 3 2 3 0.13107200000000000000e6
+117 3 4 5 -0.13107200000000000000e6
+117 4 1 1 0.26214400000000000000e6
+118 1 1 2 -0.13107200000000000000e6
+118 5 1 1 0.26214400000000000000e6
+119 1 3 14 -0.26214400000000000000e6
+119 1 5 6 -0.26214400000000000000e6
+119 1 8 9 0.26214400000000000000e6
+119 1 12 13 0.26214400000000000000e6
+119 2 2 2 0.52428800000000000000e6
+119 5 1 2 0.26214400000000000000e6
+119 7 2 3 -0.52428800000000000000e6
+119 7 4 5 0.52428800000000000000e6
+119 8 1 1 -0.10485760000000000000e7
+120 5 1 3 0.26214400000000000000e6
+120 7 2 3 0.26214400000000000000e6
+120 7 4 5 -0.26214400000000000000e6
+120 8 1 1 0.52428800000000000000e6
+121 1 1 8 -0.26214400000000000000e6
+121 5 1 4 0.26214400000000000000e6
+122 1 1 12 -0.26214400000000000000e6
+122 5 1 5 0.26214400000000000000e6
+123 1 2 3 -0.13107200000000000000e6
+123 5 2 2 0.26214400000000000000e6
+124 5 2 3 0.26214400000000000000e6
+124 7 1 2 -0.26214400000000000000e6
+125 1 2 9 0.52428800000000000000e6
+125 1 7 10 -0.26214400000000000000e6
+125 1 7 14 -0.52428800000000000000e6
+125 1 11 14 -0.26214400000000000000e6
+125 2 1 4 0.52428800000000000000e6
+125 3 3 4 0.26214400000000000000e6
+125 5 2 4 0.26214400000000000000e6
+126 3 2 3 -0.13107200000000000000e6
+126 5 3 3 0.26214400000000000000e6
+127 1 2 9 -0.26214400000000000000e6
+127 5 3 4 0.26214400000000000000e6
+128 1 2 13 -0.26214400000000000000e6
+128 5 3 5 0.26214400000000000000e6
+129 1 1 2 0.26214400000000000000e6
+129 1 2 3 -0.13107200000000000000e6
+129 1 11 12 0.13107200000000000000e6
+129 3 2 3 -0.13107200000000000000e6
+129 5 4 4 0.26214400000000000000e6
+130 1 8 11 -0.26214400000000000000e6
+130 5 4 5 0.26214400000000000000e6
+131 1 11 12 -0.13107200000000000000e6
+131 5 5 5 0.26214400000000000000e6
+132 1 1 2 0.13107200000000000000e6
+132 1 8 11 -0.13107200000000000000e6
+132 6 1 1 0.26214400000000000000e6
+132 7 1 2 0.13107200000000000000e6
+133 7 1 1 0.26214400000000000000e6
+133 7 2 3 0.13107200000000000000e6
+133 7 4 5 -0.13107200000000000000e6
+133 8 1 1 0.26214400000000000000e6
+134 3 2 3 -0.26214400000000000000e6
+134 7 1 3 0.26214400000000000000e6
+135 1 2 9 -0.26214400000000000000e6
+135 7 1 4 0.26214400000000000000e6
+136 1 2 13 -0.26214400000000000000e6
+136 7 1 5 0.26214400000000000000e6
+137 1 5 6 0.13107200000000000000e6
+137 1 8 9 -0.13107200000000000000e6
+137 1 12 13 -0.13107200000000000000e6
+137 7 2 2 0.26214400000000000000e6
+137 7 2 3 0.26214400000000000000e6
+137 7 4 5 -0.26214400000000000000e6
+137 8 1 1 0.52428800000000000000e6
+138 1 5 8 -0.26214400000000000000e6
+138 7 2 4 0.26214400000000000000e6
+139 1 5 12 -0.26214400000000000000e6
+139 7 2 5 0.26214400000000000000e6
+140 1 5 6 -0.13107200000000000000e6
+140 7 3 3 0.26214400000000000000e6
+141 1 4 11 0.26214400000000000000e6
+141 1 13 14 -0.26214400000000000000e6
+141 2 3 5 0.26214400000000000000e6
+141 7 3 5 0.26214400000000000000e6
+142 1 8 9 -0.13107200000000000000e6
+142 7 4 4 0.26214400000000000000e6
+143 1 12 13 -0.13107200000000000000e6
+143 7 5 5 0.26214400000000000000e6
+*** ANSWER ***
+Failure
+*** END ***
+*** REQUEST ***
+""
+367
+8
+15 5 15 5 15 5 5 1
+0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.26214400000000000000e6 0.0 0.0 0.0 -0.26214400000000000000e6 0.0 -0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.78643200000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 -0.26214400000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 -0.52428800000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.10485760000000000000e7 0.0 -0.52428800000000000000e6 0.26214400000000000000e6 -0.52428800000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 -0.26214400000000000000e6 -0.52428800000000000000e6 0.0 -0.52428800000000000000e6 0.0 -0.26214400000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6 0.0 -0.52428800000000000000e6 0.0 0.26214400000000000000e6 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.10485760000000000000e7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6
+0 1 1 10 -0.65536000000000000000e5
+0 1 14 15 -0.65536000000000000000e5
+0 2 2 2 -0.13107200000000000000e6
+0 2 5 5 0.13107200000000000000e6
+0 3 1 4 0.65536000000000000000e5
+0 3 2 15 0.65536000000000000000e5
+0 5 2 5 -0.65536000000000000000e5
+0 5 8 11 0.65536000000000000000e5
+1 1 1 2 -0.26214400000000000000e6
+1 1 2 3 0.13107200000000000000e6
+1 1 8 11 0.26214400000000000000e6
+1 1 11 12 -0.13107200000000000000e6
+1 3 5 6 0.65536000000000000000e5
+1 3 5 10 -0.65536000000000000000e5
+1 3 8 13 -0.13107200000000000000e6
+1 3 12 13 -0.65536000000000000000e5
+1 5 3 6 0.65536000000000000000e5
+1 5 3 14 -0.13107200000000000000e6
+1 5 5 10 0.13107200000000000000e6
+1 5 14 15 0.13107200000000000000e6
+1 6 4 4 0.26214400000000000000e6
+2 1 1 8 0.13107200000000000000e6
+2 1 1 12 0.26214400000000000000e6
+2 1 3 12 -0.13107200000000000000e6
+2 1 4 11 0.13107200000000000000e6
+2 1 5 8 0.13107200000000000000e6
+2 1 12 15 0.13107200000000000000e6
+2 1 13 14 -0.13107200000000000000e6
+2 2 2 4 0.13107200000000000000e6
+2 4 1 5 0.13107200000000000000e6
+3 1 2 9 0.13107200000000000000e6
+3 1 6 7 0.26214400000000000000e6
+3 3 6 9 -0.13107200000000000000e6
+3 3 9 10 0.13107200000000000000e6
+3 3 13 14 0.13107200000000000000e6
+3 4 2 4 0.13107200000000000000e6
+3 5 10 13 -0.13107200000000000000e6
+4 1 4 7 0.26214400000000000000e6
+4 1 5 8 -0.13107200000000000000e6
+4 1 9 10 0.13107200000000000000e6
+4 1 13 14 0.13107200000000000000e6
+4 3 4 9 -0.13107200000000000000e6
+5 1 1 8 0.26214400000000000000e6
+5 1 3 8 -0.13107200000000000000e6
+5 1 8 15 0.13107200000000000000e6
+5 5 7 10 0.13107200000000000000e6
+5 7 3 4 -0.13107200000000000000e6
+6 3 2 15 0.13107200000000000000e6
+6 3 4 5 -0.13107200000000000000e6
+6 3 7 8 0.13107200000000000000e6
+6 5 1 4 0.26214400000000000000e6
+6 5 2 5 -0.13107200000000000000e6
+7 1 1 4 -0.52428800000000000000e6
+7 3 1 14 0.52428800000000000000e6
+7 3 5 6 -0.26214400000000000000e6
+7 3 5 10 0.26214400000000000000e6
+7 3 6 15 -0.13107200000000000000e6
+7 3 10 15 0.13107200000000000000e6
+7 3 14 15 0.26214400000000000000e6
+7 4 3 3 -0.52428800000000000000e6
+7 4 4 4 0.52428800000000000000e6
+7 5 9 12 -0.26214400000000000000e6
+7 5 12 13 -0.13107200000000000000e6
+7 5 14 15 -0.13107200000000000000e6
+7 7 1 2 0.26214400000000000000e6
+8 3 14 15 -0.13107200000000000000e6
+8 5 10 15 -0.13107200000000000000e6
+9 1 2 13 0.13107200000000000000e6
+9 1 4 13 0.26214400000000000000e6
+9 3 6 13 -0.13107200000000000000e6
+9 3 8 15 -0.26214400000000000000e6
+9 3 9 14 0.13107200000000000000e6
+9 6 3 5 0.13107200000000000000e6
+10 1 2 13 0.26214400000000000000e6
+10 5 5 12 -0.13107200000000000000e6
+10 5 6 13 -0.13107200000000000000e6
+10 5 8 15 -0.13107200000000000000e6
+10 5 10 13 0.13107200000000000000e6
+11 1 4 11 0.26214400000000000000e6
+11 1 8 15 -0.13107200000000000000e6
+11 1 10 13 0.13107200000000000000e6
+11 3 6 11 -0.13107200000000000000e6
+11 5 2 13 -0.13107200000000000000e6
+12 1 1 2 0.26214400000000000000e6
+12 1 2 3 -0.13107200000000000000e6
+12 1 11 12 0.13107200000000000000e6
+12 3 5 6 -0.65536000000000000000e5
+12 3 5 10 0.65536000000000000000e5
+12 3 10 15 -0.13107200000000000000e6
+12 3 12 13 0.65536000000000000000e5
+12 5 3 6 -0.65536000000000000000e5
+12 5 5 10 -0.13107200000000000000e6
+12 6 4 4 -0.26214400000000000000e6
+13 3 13 14 -0.13107200000000000000e6
+13 5 10 13 -0.13107200000000000000e6
+14 3 8 15 -0.13107200000000000000e6
+14 5 1 8 -0.13107200000000000000e6
+14 5 5 8 -0.13107200000000000000e6
+14 6 2 4 -0.13107200000000000000e6
+15 1 1 8 -0.13107200000000000000e6
+15 1 5 8 -0.13107200000000000000e6
+15 1 13 14 -0.13107200000000000000e6
+15 2 2 4 -0.13107200000000000000e6
+16 3 6 15 -0.13107200000000000000e6
+16 3 8 13 -0.13107200000000000000e6
+17 3 12 13 -0.13107200000000000000e6
+17 5 9 12 -0.13107200000000000000e6
+18 1 6 15 -0.13107200000000000000e6
+18 7 4 5 -0.13107200000000000000e6
+19 5 3 14 -0.13107200000000000000e6
+19 5 12 13 -0.13107200000000000000e6
+20 3 2 15 -0.13107200000000000000e6
+20 5 8 11 -0.13107200000000000000e6
+21 1 1 4 0.26214400000000000000e6
+21 1 8 11 -0.13107200000000000000e6
+21 3 1 14 -0.26214400000000000000e6
+21 3 5 6 0.13107200000000000000e6
+21 3 5 10 -0.13107200000000000000e6
+21 3 14 15 -0.13107200000000000000e6
+21 4 3 3 0.26214400000000000000e6
+21 4 4 4 -0.26214400000000000000e6
+21 5 9 12 0.13107200000000000000e6
+21 7 1 2 -0.13107200000000000000e6
+22 1 1 2 -0.52428800000000000000e6
+22 1 2 3 0.26214400000000000000e6
+22 1 11 12 -0.26214400000000000000e6
+22 3 1 6 -0.13107200000000000000e6
+22 3 1 14 0.26214400000000000000e6
+22 3 5 10 -0.26214400000000000000e6
+22 3 12 13 -0.13107200000000000000e6
+22 3 14 15 0.13107200000000000000e6
+22 4 3 3 -0.26214400000000000000e6
+22 5 3 6 0.13107200000000000000e6
+22 5 3 10 -0.13107200000000000000e6
+22 5 9 12 -0.13107200000000000000e6
+22 5 10 15 0.13107200000000000000e6
+23 1 2 9 0.26214400000000000000e6
+23 3 8 15 0.13107200000000000000e6
+23 3 9 14 -0.13107200000000000000e6
+23 5 5 8 -0.13107200000000000000e6
+23 5 6 9 -0.13107200000000000000e6
+24 1 2 9 0.13107200000000000000e6
+24 4 2 4 0.13107200000000000000e6
+24 5 1 8 0.26214400000000000000e6
+24 5 3 8 -0.13107200000000000000e6
+24 5 8 15 0.13107200000000000000e6
+24 5 10 13 -0.26214400000000000000e6
+25 1 10 13 -0.13107200000000000000e6
+25 5 7 10 -0.13107200000000000000e6
+26 3 1 6 -0.13107200000000000000e6
+26 3 5 6 -0.13107200000000000000e6
+26 3 5 10 -0.13107200000000000000e6
+26 4 3 3 -0.26214400000000000000e6
+27 3 8 13 -0.13107200000000000000e6
+27 5 5 10 -0.13107200000000000000e6
+28 2 3 3 -0.26214400000000000000e6
+28 3 1 4 -0.13107200000000000000e6
+28 3 4 5 -0.13107200000000000000e6
+28 3 7 8 -0.13107200000000000000e6
+29 5 3 10 -0.13107200000000000000e6
+29 5 9 12 -0.13107200000000000000e6
+30 1 3 10 -0.13107200000000000000e6
+30 7 4 5 -0.13107200000000000000e6
+31 1 1 2 0.26214400000000000000e6
+31 1 2 3 -0.13107200000000000000e6
+31 1 11 12 0.13107200000000000000e6
+31 3 1 14 -0.13107200000000000000e6
+31 3 5 6 -0.65536000000000000000e5
+31 3 5 10 0.65536000000000000000e5
+31 3 12 13 0.65536000000000000000e5
+31 5 3 6 -0.65536000000000000000e5
+32 3 6 13 -0.13107200000000000000e6
+32 5 6 9 -0.13107200000000000000e6
+33 1 2 9 0.13107200000000000000e6
+33 4 2 4 0.13107200000000000000e6
+33 5 6 13 -0.13107200000000000000e6
+33 5 10 13 -0.13107200000000000000e6
+34 3 6 11 -0.13107200000000000000e6
+34 7 3 4 -0.13107200000000000000e6
+35 1 2 13 0.13107200000000000000e6
+35 3 8 15 -0.13107200000000000000e6
+35 5 5 8 -0.13107200000000000000e6
+35 6 3 5 0.13107200000000000000e6
+36 1 4 11 0.13107200000000000000e6
+36 1 5 8 -0.13107200000000000000e6
+36 1 13 14 -0.13107200000000000000e6
+36 4 1 5 0.13107200000000000000e6
+37 1 2 9 -0.13107200000000000000e6
+37 1 4 13 -0.13107200000000000000e6
+38 5 3 8 -0.13107200000000000000e6
+38 5 5 12 -0.13107200000000000000e6
+39 1 3 8 -0.13107200000000000000e6
+39 5 2 13 -0.13107200000000000000e6
+40 1 2 13 -0.13107200000000000000e6
+40 5 1 8 -0.13107200000000000000e6
+41 1 1 8 -0.13107200000000000000e6
+41 1 4 11 -0.13107200000000000000e6
+42 1 1 1 0.26214400000000000000e6
+42 1 1 10 0.65536000000000000000e5
+42 1 14 15 0.65536000000000000000e5
+42 2 2 2 0.13107200000000000000e6
+42 2 5 5 -0.13107200000000000000e6
+42 3 1 4 -0.65536000000000000000e5
+42 3 2 15 -0.65536000000000000000e5
+42 5 2 5 0.65536000000000000000e5
+42 5 8 11 -0.65536000000000000000e5
+43 1 1 3 0.26214400000000000000e6
+43 2 2 2 0.52428800000000000000e6
+43 5 2 5 0.26214400000000000000e6
+43 5 8 11 -0.26214400000000000000e6
+44 1 1 5 0.26214400000000000000e6
+44 5 1 4 -0.26214400000000000000e6
+45 1 1 6 0.26214400000000000000e6
+45 3 1 4 -0.26214400000000000000e6
+46 1 1 7 0.26214400000000000000e6
+46 1 6 7 -0.13107200000000000000e6
+46 1 7 10 0.13107200000000000000e6
+46 1 11 14 0.13107200000000000000e6
+46 5 1 8 -0.13107200000000000000e6
+47 1 1 9 0.26214400000000000000e6
+47 1 4 7 -0.26214400000000000000e6
+48 1 1 11 0.26214400000000000000e6
+48 1 2 13 0.26214400000000000000e6
+48 1 11 14 -0.26214400000000000000e6
+48 2 1 5 0.26214400000000000000e6
+49 1 1 13 0.26214400000000000000e6
+49 1 4 11 -0.26214400000000000000e6
+50 1 1 10 0.13107200000000000000e6
+50 1 1 14 0.26214400000000000000e6
+50 1 14 15 0.13107200000000000000e6
+50 2 3 3 -0.26214400000000000000e6
+50 2 4 4 0.26214400000000000000e6
+50 3 1 4 -0.13107200000000000000e6
+50 3 4 5 -0.13107200000000000000e6
+50 3 7 8 0.13107200000000000000e6
+50 5 8 11 -0.13107200000000000000e6
+51 1 1 15 0.26214400000000000000e6
+51 1 14 15 -0.26214400000000000000e6
+51 2 5 5 0.52428800000000000000e6
+51 3 2 15 0.26214400000000000000e6
+52 1 2 2 0.26214400000000000000e6
+52 2 2 2 0.26214400000000000000e6
+52 5 2 5 0.13107200000000000000e6
+52 5 8 11 -0.13107200000000000000e6
+53 1 2 4 0.26214400000000000000e6
+53 5 1 4 -0.26214400000000000000e6
+54 1 2 5 0.26214400000000000000e6
+54 7 1 2 -0.26214400000000000000e6
+55 1 2 6 0.26214400000000000000e6
+55 3 5 6 -0.13107200000000000000e6
+55 3 5 10 0.13107200000000000000e6
+55 3 12 13 0.13107200000000000000e6
+55 5 3 6 -0.13107200000000000000e6
+56 1 1 8 -0.26214400000000000000e6
+56 1 2 7 0.26214400000000000000e6
+57 1 2 8 0.26214400000000000000e6
+57 5 1 8 -0.26214400000000000000e6
+58 1 1 2 0.52428800000000000000e6
+58 1 2 3 -0.26214400000000000000e6
+58 1 2 10 0.26214400000000000000e6
+58 1 11 12 0.26214400000000000000e6
+58 3 5 6 -0.13107200000000000000e6
+58 3 5 10 0.13107200000000000000e6
+58 3 12 13 0.13107200000000000000e6
+58 5 3 6 -0.13107200000000000000e6
+59 1 1 12 -0.26214400000000000000e6
+59 1 2 11 0.26214400000000000000e6
+60 1 2 12 0.26214400000000000000e6
+60 5 1 12 -0.26214400000000000000e6
+61 1 2 14 0.26214400000000000000e6
+61 1 8 11 -0.26214400000000000000e6
+62 1 2 15 0.26214400000000000000e6
+62 1 11 12 -0.26214400000000000000e6
+63 1 3 3 0.26214400000000000000e6
+63 1 3 10 -0.13107200000000000000e6
+63 2 2 2 0.52428800000000000000e6
+63 5 2 5 0.26214400000000000000e6
+63 5 2 15 -0.13107200000000000000e6
+63 5 8 11 -0.26214400000000000000e6
+63 7 2 3 0.13107200000000000000e6
+64 1 3 4 0.26214400000000000000e6
+64 7 1 2 -0.26214400000000000000e6
+65 1 3 5 0.26214400000000000000e6
+65 5 2 5 -0.26214400000000000000e6
+66 1 3 6 0.26214400000000000000e6
+66 7 2 3 -0.26214400000000000000e6
+67 1 3 7 0.26214400000000000000e6
+67 5 1 8 -0.26214400000000000000e6
+68 1 3 9 0.26214400000000000000e6
+68 1 5 8 -0.26214400000000000000e6
+69 1 3 11 0.26214400000000000000e6
+69 5 1 12 -0.26214400000000000000e6
+70 1 3 13 0.26214400000000000000e6
+70 5 2 13 -0.26214400000000000000e6
+71 1 3 14 0.26214400000000000000e6
+71 5 8 11 -0.26214400000000000000e6
+72 1 3 15 0.26214400000000000000e6
+72 5 2 15 -0.26214400000000000000e6
+73 1 4 4 0.26214400000000000000e6
+73 3 1 4 -0.13107200000000000000e6
+74 1 4 5 0.26214400000000000000e6
+74 3 5 6 -0.13107200000000000000e6
+74 3 5 10 0.13107200000000000000e6
+74 3 12 13 0.13107200000000000000e6
+74 5 3 6 -0.13107200000000000000e6
+75 1 4 6 0.26214400000000000000e6
+75 3 1 6 -0.26214400000000000000e6
+76 1 2 9 -0.26214400000000000000e6
+76 1 4 8 0.26214400000000000000e6
+77 1 4 9 0.26214400000000000000e6
+77 1 6 7 -0.26214400000000000000e6
+78 1 4 10 0.26214400000000000000e6
+78 3 1 6 -0.26214400000000000000e6
+78 3 1 14 0.52428800000000000000e6
+78 3 5 6 -0.26214400000000000000e6
+78 3 5 10 0.26214400000000000000e6
+78 3 14 15 0.26214400000000000000e6
+78 4 3 3 -0.52428800000000000000e6
+78 4 4 4 0.52428800000000000000e6
+78 5 9 12 -0.26214400000000000000e6
+79 1 2 13 -0.26214400000000000000e6
+79 1 4 12 0.26214400000000000000e6
+80 1 4 14 0.26214400000000000000e6
+80 3 1 14 -0.26214400000000000000e6
+81 1 1 4 0.52428800000000000000e6
+81 1 4 15 0.26214400000000000000e6
+81 3 1 14 -0.52428800000000000000e6
+81 3 5 6 0.26214400000000000000e6
+81 3 5 10 -0.26214400000000000000e6
+81 3 14 15 -0.26214400000000000000e6
+81 4 3 3 0.52428800000000000000e6
+81 4 4 4 -0.52428800000000000000e6
+81 5 9 12 0.26214400000000000000e6
+81 7 1 2 -0.26214400000000000000e6
+82 1 5 5 0.26214400000000000000e6
+82 7 2 3 -0.13107200000000000000e6
+83 1 5 6 0.26214400000000000000e6
+83 3 4 5 -0.26214400000000000000e6
+84 1 2 9 -0.26214400000000000000e6
+84 1 5 7 0.26214400000000000000e6
+85 1 5 9 0.26214400000000000000e6
+85 7 3 4 -0.26214400000000000000e6
+86 1 5 10 0.26214400000000000000e6
+86 3 7 8 -0.26214400000000000000e6
+87 1 2 13 -0.26214400000000000000e6
+87 1 5 11 0.26214400000000000000e6
+88 1 5 12 0.26214400000000000000e6
+88 5 2 13 -0.26214400000000000000e6
+89 1 4 11 0.26214400000000000000e6
+89 1 5 13 0.26214400000000000000e6
+89 1 13 14 -0.26214400000000000000e6
+89 4 1 5 0.26214400000000000000e6
+90 1 5 14 0.26214400000000000000e6
+90 7 4 5 -0.26214400000000000000e6
+91 1 5 15 0.26214400000000000000e6
+91 3 2 15 -0.26214400000000000000e6
+92 1 6 8 0.26214400000000000000e6
+92 7 3 4 -0.26214400000000000000e6
+93 1 6 9 0.26214400000000000000e6
+93 3 4 9 -0.26214400000000000000e6
+94 1 6 6 -0.52428800000000000000e6
+94 1 6 10 0.26214400000000000000e6
+94 1 6 15 0.26214400000000000000e6
+94 3 1 4 0.52428800000000000000e6
+94 7 2 3 -0.26214400000000000000e6
+95 1 4 13 -0.26214400000000000000e6
+95 1 6 11 0.26214400000000000000e6
+96 1 4 11 0.26214400000000000000e6
+96 1 6 12 0.26214400000000000000e6
+96 1 13 14 -0.26214400000000000000e6
+96 4 1 5 0.26214400000000000000e6
+97 1 6 13 0.26214400000000000000e6
+97 3 6 11 -0.26214400000000000000e6
+98 1 6 14 0.26214400000000000000e6
+98 2 3 3 -0.52428800000000000000e6
+98 3 1 4 -0.26214400000000000000e6
+98 3 4 5 -0.26214400000000000000e6
+99 1 1 10 -0.13107200000000000000e6
+99 1 7 7 0.26214400000000000000e6
+100 1 1 2 0.52428800000000000000e6
+100 1 2 3 -0.26214400000000000000e6
+100 1 7 8 0.26214400000000000000e6
+100 1 11 12 0.26214400000000000000e6
+100 3 5 6 -0.13107200000000000000e6
+100 3 5 10 0.13107200000000000000e6
+100 3 12 13 0.13107200000000000000e6
+100 5 3 6 -0.13107200000000000000e6
+101 1 7 9 0.26214400000000000000e6
+101 3 1 6 -0.26214400000000000000e6
+101 3 1 14 0.52428800000000000000e6
+101 3 5 6 -0.26214400000000000000e6
+101 3 5 10 0.26214400000000000000e6
+101 3 14 15 0.26214400000000000000e6
+101 4 3 3 -0.52428800000000000000e6
+101 4 4 4 0.52428800000000000000e6
+101 5 9 12 -0.26214400000000000000e6
+102 1 1 10 0.13107200000000000000e6
+102 1 7 11 0.26214400000000000000e6
+102 1 14 15 0.13107200000000000000e6
+102 2 3 3 -0.26214400000000000000e6
+102 2 4 4 0.26214400000000000000e6
+102 3 1 4 -0.13107200000000000000e6
+102 3 4 5 -0.13107200000000000000e6
+102 3 7 8 0.13107200000000000000e6
+102 5 8 11 -0.13107200000000000000e6
+103 1 7 12 0.26214400000000000000e6
+103 1 8 11 -0.26214400000000000000e6
+104 1 7 13 0.26214400000000000000e6
+104 3 1 14 -0.26214400000000000000e6
+105 1 7 15 0.26214400000000000000e6
+105 1 11 14 -0.26214400000000000000e6
+106 1 3 10 -0.13107200000000000000e6
+106 1 8 8 0.26214400000000000000e6
+107 1 8 9 0.26214400000000000000e6
+107 3 7 8 -0.26214400000000000000e6
+108 1 8 10 0.26214400000000000000e6
+108 5 7 10 -0.26214400000000000000e6
+109 1 8 12 0.26214400000000000000e6
+109 5 8 11 -0.26214400000000000000e6
+110 1 8 13 0.26214400000000000000e6
+110 7 4 5 -0.26214400000000000000e6
+111 1 1 8 -0.26214400000000000000e6
+111 1 5 8 -0.26214400000000000000e6
+111 1 8 14 0.26214400000000000000e6
+111 2 2 4 -0.26214400000000000000e6
+112 1 6 6 -0.26214400000000000000e6
+112 1 6 15 0.13107200000000000000e6
+112 1 9 9 0.26214400000000000000e6
+112 3 1 4 0.26214400000000000000e6
+112 7 2 3 -0.13107200000000000000e6
+113 1 9 11 0.26214400000000000000e6
+113 3 1 14 -0.26214400000000000000e6
+114 1 9 12 0.26214400000000000000e6
+114 7 4 5 -0.26214400000000000000e6
+115 1 9 13 0.26214400000000000000e6
+115 2 3 3 -0.52428800000000000000e6
+115 3 1 4 -0.26214400000000000000e6
+115 3 4 5 -0.26214400000000000000e6
+116 1 9 14 0.26214400000000000000e6
+116 1 10 13 -0.26214400000000000000e6
+117 1 9 15 0.26214400000000000000e6
+117 1 13 14 -0.26214400000000000000e6
+118 1 1 10 0.26214400000000000000e6
+118 1 3 10 -0.13107200000000000000e6
+118 1 6 6 -0.26214400000000000000e6
+118 1 6 15 0.13107200000000000000e6
+118 1 10 10 0.26214400000000000000e6
+118 1 10 15 0.13107200000000000000e6
+118 3 1 4 0.26214400000000000000e6
+118 7 2 3 -0.13107200000000000000e6
+119 1 7 14 -0.26214400000000000000e6
+119 1 10 11 0.26214400000000000000e6
+120 1 1 8 -0.26214400000000000000e6
+120 1 5 8 -0.26214400000000000000e6
+120 1 10 12 0.26214400000000000000e6
+120 2 2 4 -0.26214400000000000000e6
+121 1 1 10 -0.26214400000000000000e6
+121 1 10 14 0.26214400000000000000e6
+121 2 4 4 -0.52428800000000000000e6
+121 3 7 8 -0.26214400000000000000e6
+122 1 11 11 0.26214400000000000000e6
+122 1 14 15 -0.13107200000000000000e6
+122 2 5 5 0.26214400000000000000e6
+122 3 2 15 0.13107200000000000000e6
+123 1 1 4 0.52428800000000000000e6
+123 1 11 13 0.26214400000000000000e6
+123 3 1 14 -0.52428800000000000000e6
+123 3 5 6 0.26214400000000000000e6
+123 3 5 10 -0.26214400000000000000e6
+123 3 14 15 -0.26214400000000000000e6
+123 4 3 3 0.52428800000000000000e6
+123 4 4 4 -0.52428800000000000000e6
+123 5 9 12 0.26214400000000000000e6
+123 7 1 2 -0.26214400000000000000e6
+124 1 2 13 -0.52428800000000000000e6
+124 1 4 13 -0.26214400000000000000e6
+124 1 7 14 0.26214400000000000000e6
+124 1 11 14 0.52428800000000000000e6
+124 1 11 15 0.26214400000000000000e6
+124 2 1 5 -0.52428800000000000000e6
+124 5 1 12 -0.26214400000000000000e6
+125 1 12 12 0.26214400000000000000e6
+125 5 2 15 -0.13107200000000000000e6
+126 1 12 13 0.26214400000000000000e6
+126 3 2 15 -0.26214400000000000000e6
+127 1 8 15 -0.26214400000000000000e6
+127 1 12 14 0.26214400000000000000e6
+128 1 6 15 -0.13107200000000000000e6
+128 1 13 13 0.26214400000000000000e6
+129 1 4 11 0.52428800000000000000e6
+129 1 10 13 0.26214400000000000000e6
+129 1 13 15 0.26214400000000000000e6
+129 3 6 11 -0.26214400000000000000e6
+129 5 2 13 -0.26214400000000000000e6
+130 1 10 15 -0.13107200000000000000e6
+130 1 14 14 0.26214400000000000000e6
+131 1 6 15 -0.13107200000000000000e6
+131 1 10 15 0.13107200000000000000e6
+131 1 14 15 0.26214400000000000000e6
+131 1 15 15 0.26214400000000000000e6
+131 2 5 5 -0.52428800000000000000e6
+131 3 2 15 -0.26214400000000000000e6
+131 5 2 15 -0.13107200000000000000e6
+132 2 1 1 0.26214400000000000000e6
+132 2 2 2 -0.13107200000000000000e6
+132 2 3 3 -0.13107200000000000000e6
+132 2 4 4 0.13107200000000000000e6
+132 2 5 5 0.13107200000000000000e6
+132 3 2 15 0.65536000000000000000e5
+132 3 4 5 -0.65536000000000000000e5
+132 3 7 8 0.65536000000000000000e5
+132 5 1 4 0.13107200000000000000e6
+132 5 2 5 -0.65536000000000000000e5
+133 1 1 2 0.26214400000000000000e6
+133 1 8 11 -0.26214400000000000000e6
+133 2 1 2 0.26214400000000000000e6
+133 7 1 2 0.26214400000000000000e6
+134 1 1 4 0.26214400000000000000e6
+134 2 1 3 0.26214400000000000000e6
+134 3 1 14 -0.26214400000000000000e6
+134 3 5 6 0.13107200000000000000e6
+134 3 5 10 -0.13107200000000000000e6
+134 3 12 13 -0.13107200000000000000e6
+134 5 3 6 0.13107200000000000000e6
+135 1 2 9 0.26214400000000000000e6
+135 1 6 7 0.13107200000000000000e6
+135 1 7 10 -0.13107200000000000000e6
+135 1 7 14 -0.26214400000000000000e6
+135 1 11 14 -0.13107200000000000000e6
+135 2 1 4 0.26214400000000000000e6
+135 5 1 8 0.13107200000000000000e6
+136 2 2 3 0.26214400000000000000e6
+136 5 1 4 0.26214400000000000000e6
+136 7 2 3 0.26214400000000000000e6
+136 7 4 5 -0.26214400000000000000e6
+137 1 1 12 0.26214400000000000000e6
+137 1 8 15 -0.26214400000000000000e6
+137 2 2 5 0.26214400000000000000e6
+137 5 2 13 0.26214400000000000000e6
+138 1 4 7 0.26214400000000000000e6
+138 1 10 13 -0.26214400000000000000e6
+138 2 3 4 0.26214400000000000000e6
+138 7 3 4 0.26214400000000000000e6
+139 2 3 5 0.26214400000000000000e6
+139 4 1 5 -0.26214400000000000000e6
+140 1 1 10 -0.13107200000000000000e6
+140 1 10 15 -0.26214400000000000000e6
+140 1 14 15 -0.13107200000000000000e6
+140 2 3 3 0.26214400000000000000e6
+140 2 4 4 -0.26214400000000000000e6
+140 2 4 5 0.26214400000000000000e6
+140 3 1 4 0.13107200000000000000e6
+140 3 4 5 0.13107200000000000000e6
+140 3 7 8 -0.13107200000000000000e6
+140 5 8 11 0.13107200000000000000e6
+140 7 4 5 0.26214400000000000000e6
+141 1 1 4 -0.13107200000000000000e6
+141 3 1 1 0.26214400000000000000e6
+142 3 1 2 0.26214400000000000000e6
+142 5 1 4 -0.26214400000000000000e6
+143 3 1 3 0.26214400000000000000e6
+143 7 1 2 -0.26214400000000000000e6
+144 3 1 5 0.26214400000000000000e6
+144 3 5 6 -0.13107200000000000000e6
+144 3 5 10 0.13107200000000000000e6
+144 3 12 13 0.13107200000000000000e6
+144 5 3 6 -0.13107200000000000000e6
+145 1 4 7 -0.26214400000000000000e6
+145 3 1 7 0.26214400000000000000e6
+146 1 2 9 -0.26214400000000000000e6
+146 3 1 8 0.26214400000000000000e6
+147 1 6 7 -0.26214400000000000000e6
+147 3 1 9 0.26214400000000000000e6
+148 3 1 6 -0.26214400000000000000e6
+148 3 1 10 0.26214400000000000000e6
+148 3 1 14 0.52428800000000000000e6
+148 3 5 6 -0.26214400000000000000e6
+148 3 5 10 0.26214400000000000000e6
+148 3 14 15 0.26214400000000000000e6
+148 4 3 3 -0.52428800000000000000e6
+148 4 4 4 0.52428800000000000000e6
+148 5 9 12 -0.26214400000000000000e6
+149 1 4 11 -0.26214400000000000000e6
+149 3 1 11 0.26214400000000000000e6
+150 1 2 13 -0.26214400000000000000e6
+150 3 1 12 0.26214400000000000000e6
+151 1 4 13 -0.26214400000000000000e6
+151 3 1 13 0.26214400000000000000e6
+152 1 1 4 0.52428800000000000000e6
+152 3 1 14 -0.52428800000000000000e6
+152 3 1 15 0.26214400000000000000e6
+152 3 5 6 0.26214400000000000000e6
+152 3 5 10 -0.26214400000000000000e6
+152 3 14 15 -0.26214400000000000000e6
+152 4 3 3 0.52428800000000000000e6
+152 4 4 4 -0.52428800000000000000e6
+152 5 9 12 0.26214400000000000000e6
+152 7 1 2 -0.26214400000000000000e6
+153 3 2 2 0.26214400000000000000e6
+153 7 1 2 -0.13107200000000000000e6
+154 3 2 3 0.26214400000000000000e6
+154 5 2 5 -0.26214400000000000000e6
+155 3 2 4 0.26214400000000000000e6
+155 3 5 6 -0.13107200000000000000e6
+155 3 5 10 0.13107200000000000000e6
+155 3 12 13 0.13107200000000000000e6
+155 5 3 6 -0.13107200000000000000e6
+156 3 2 5 0.26214400000000000000e6
+156 7 2 3 -0.26214400000000000000e6
+157 3 2 6 0.26214400000000000000e6
+157 3 4 5 -0.26214400000000000000e6
+158 1 2 9 -0.26214400000000000000e6
+158 3 2 7 0.26214400000000000000e6
+159 1 5 8 -0.26214400000000000000e6
+159 3 2 8 0.26214400000000000000e6
+160 3 2 9 0.26214400000000000000e6
+160 7 3 4 -0.26214400000000000000e6
+161 3 2 10 0.26214400000000000000e6
+161 3 7 8 -0.26214400000000000000e6
+162 1 2 13 -0.26214400000000000000e6
+162 3 2 11 0.26214400000000000000e6
+163 3 2 12 0.26214400000000000000e6
+163 5 2 13 -0.26214400000000000000e6
+164 1 4 11 0.26214400000000000000e6
+164 1 13 14 -0.26214400000000000000e6
+164 3 2 13 0.26214400000000000000e6
+164 4 1 5 0.26214400000000000000e6
+165 3 2 14 0.26214400000000000000e6
+165 7 4 5 -0.26214400000000000000e6
+166 1 2 3 0.13107200000000000000e6
+166 3 3 3 0.26214400000000000000e6
+166 5 3 14 -0.13107200000000000000e6
+166 6 2 2 0.26214400000000000000e6
+167 3 3 4 0.26214400000000000000e6
+167 7 2 3 -0.26214400000000000000e6
+168 3 3 5 0.26214400000000000000e6
+168 5 3 6 -0.26214400000000000000e6
+169 1 2 3 -0.26214400000000000000e6
+169 3 3 6 0.26214400000000000000e6
+169 5 3 14 0.26214400000000000000e6
+169 5 5 10 -0.26214400000000000000e6
+169 5 12 13 -0.26214400000000000000e6
+169 6 2 2 -0.52428800000000000000e6
+169 7 1 2 -0.52428800000000000000e6
+170 1 5 8 -0.26214400000000000000e6
+170 3 3 7 0.26214400000000000000e6
+171 3 3 8 0.26214400000000000000e6
+171 5 5 8 -0.26214400000000000000e6
+172 1 2 9 0.26214400000000000000e6
+172 3 3 9 0.26214400000000000000e6
+172 4 2 4 0.26214400000000000000e6
+172 5 10 13 -0.26214400000000000000e6
+173 3 3 10 0.26214400000000000000e6
+173 5 5 10 -0.26214400000000000000e6
+174 3 3 11 0.26214400000000000000e6
+174 5 2 13 -0.26214400000000000000e6
+175 3 3 12 0.26214400000000000000e6
+175 5 5 12 -0.26214400000000000000e6
+176 1 2 13 0.26214400000000000000e6
+176 3 3 13 0.26214400000000000000e6
+176 3 8 15 -0.26214400000000000000e6
+176 6 3 5 0.26214400000000000000e6
+177 3 3 14 0.26214400000000000000e6
+177 5 9 12 -0.26214400000000000000e6
+178 3 3 15 0.26214400000000000000e6
+178 5 12 13 -0.26214400000000000000e6
+179 3 1 6 -0.13107200000000000000e6
+179 3 4 4 0.26214400000000000000e6
+180 1 6 6 -0.52428800000000000000e6
+180 3 4 6 0.26214400000000000000e6
+181 1 6 7 -0.26214400000000000000e6
+181 3 4 7 0.26214400000000000000e6
+182 3 4 8 0.26214400000000000000e6
+182 7 3 4 -0.26214400000000000000e6
+183 1 6 6 -0.52428800000000000000e6
+183 1 6 15 0.26214400000000000000e6
+183 3 1 4 0.52428800000000000000e6
+183 3 4 10 0.26214400000000000000e6
+183 7 2 3 -0.26214400000000000000e6
+184 1 4 13 -0.26214400000000000000e6
+184 3 4 11 0.26214400000000000000e6
+185 1 4 11 0.26214400000000000000e6
+185 1 13 14 -0.26214400000000000000e6
+185 3 4 12 0.26214400000000000000e6
+185 4 1 5 0.26214400000000000000e6
+186 3 4 13 0.26214400000000000000e6
+186 3 6 11 -0.26214400000000000000e6
+187 2 3 3 -0.52428800000000000000e6
+187 3 1 4 -0.26214400000000000000e6
+187 3 4 5 -0.26214400000000000000e6
+187 3 4 14 0.26214400000000000000e6
+188 1 6 15 -0.26214400000000000000e6
+188 3 4 15 0.26214400000000000000e6
+189 1 2 3 -0.13107200000000000000e6
+189 3 5 5 0.26214400000000000000e6
+189 5 3 14 0.13107200000000000000e6
+189 5 5 10 -0.13107200000000000000e6
+189 5 12 13 -0.13107200000000000000e6
+189 6 2 2 -0.26214400000000000000e6
+189 7 1 2 -0.26214400000000000000e6
+190 3 5 7 0.26214400000000000000e6
+190 7 3 4 -0.26214400000000000000e6
+191 1 2 9 0.26214400000000000000e6
+191 3 5 8 0.26214400000000000000e6
+191 4 2 4 0.26214400000000000000e6
+191 5 10 13 -0.26214400000000000000e6
+192 3 5 9 0.26214400000000000000e6
+192 5 6 9 -0.26214400000000000000e6
+193 1 4 11 0.26214400000000000000e6
+193 1 13 14 -0.26214400000000000000e6
+193 3 5 11 0.26214400000000000000e6
+193 4 1 5 0.26214400000000000000e6
+194 1 2 13 0.26214400000000000000e6
+194 3 5 12 0.26214400000000000000e6
+194 3 8 15 -0.26214400000000000000e6
+194 6 3 5 0.26214400000000000000e6
+195 3 5 13 0.26214400000000000000e6
+195 5 6 13 -0.26214400000000000000e6
+196 3 5 14 0.26214400000000000000e6
+196 3 8 13 -0.26214400000000000000e6
+197 3 5 15 0.26214400000000000000e6
+197 3 12 13 -0.26214400000000000000e6
+198 3 4 9 -0.26214400000000000000e6
+198 3 6 7 0.26214400000000000000e6
+199 3 6 8 0.26214400000000000000e6
+199 5 6 9 -0.26214400000000000000e6
+200 1 2 3 -0.26214400000000000000e6
+200 3 1 6 0.52428800000000000000e6
+200 3 6 6 -0.52428800000000000000e6
+200 3 6 10 0.26214400000000000000e6
+200 3 6 15 0.26214400000000000000e6
+200 5 3 14 0.26214400000000000000e6
+200 5 5 10 -0.26214400000000000000e6
+200 5 12 13 -0.26214400000000000000e6
+200 6 2 2 -0.52428800000000000000e6
+200 7 1 2 -0.52428800000000000000e6
+201 3 6 12 0.26214400000000000000e6
+201 5 6 13 -0.26214400000000000000e6
+202 3 1 6 -0.26214400000000000000e6
+202 3 5 6 -0.26214400000000000000e6
+202 3 6 14 0.26214400000000000000e6
+202 4 3 3 -0.52428800000000000000e6
+203 3 1 6 -0.13107200000000000000e6
+203 3 1 14 0.26214400000000000000e6
+203 3 5 6 -0.13107200000000000000e6
+203 3 5 10 0.13107200000000000000e6
+203 3 7 7 0.26214400000000000000e6
+203 3 14 15 0.13107200000000000000e6
+203 4 3 3 -0.26214400000000000000e6
+203 4 4 4 0.26214400000000000000e6
+203 5 9 12 -0.13107200000000000000e6
+204 1 6 6 -0.52428800000000000000e6
+204 1 6 15 0.26214400000000000000e6
+204 3 1 4 0.52428800000000000000e6
+204 3 7 9 0.26214400000000000000e6
+204 7 2 3 -0.26214400000000000000e6
+205 1 9 10 -0.26214400000000000000e6
+205 3 7 10 0.26214400000000000000e6
+206 3 1 14 -0.26214400000000000000e6
+206 3 7 11 0.26214400000000000000e6
+207 3 7 12 0.26214400000000000000e6
+207 7 4 5 -0.26214400000000000000e6
+208 2 3 3 -0.52428800000000000000e6
+208 3 1 4 -0.26214400000000000000e6
+208 3 4 5 -0.26214400000000000000e6
+208 3 7 13 0.26214400000000000000e6
+209 1 10 13 -0.26214400000000000000e6
+209 3 7 14 0.26214400000000000000e6
+210 1 13 14 -0.26214400000000000000e6
+210 3 7 15 0.26214400000000000000e6
+211 3 8 8 0.26214400000000000000e6
+211 5 5 10 -0.13107200000000000000e6
+212 3 5 10 -0.26214400000000000000e6
+212 3 8 9 0.26214400000000000000e6
+213 1 2 9 0.52428800000000000000e6
+213 3 8 10 0.26214400000000000000e6
+213 3 8 15 0.26214400000000000000e6
+213 5 5 8 -0.26214400000000000000e6
+213 5 6 9 -0.26214400000000000000e6
+214 3 8 11 0.26214400000000000000e6
+214 7 4 5 -0.26214400000000000000e6
+215 3 8 12 0.26214400000000000000e6
+215 5 9 12 -0.26214400000000000000e6
+216 3 8 14 0.26214400000000000000e6
+216 5 10 13 -0.26214400000000000000e6
+217 1 2 3 -0.13107200000000000000e6
+217 3 1 6 0.26214400000000000000e6
+217 3 6 6 -0.26214400000000000000e6
+217 3 6 15 0.13107200000000000000e6
+217 3 9 9 0.26214400000000000000e6
+217 5 3 14 0.13107200000000000000e6
+217 5 5 10 -0.13107200000000000000e6
+217 5 12 13 -0.13107200000000000000e6
+217 6 2 2 -0.26214400000000000000e6
+217 7 1 2 -0.26214400000000000000e6
+218 2 3 3 -0.52428800000000000000e6
+218 3 1 4 -0.26214400000000000000e6
+218 3 4 5 -0.26214400000000000000e6
+218 3 9 11 0.26214400000000000000e6
+219 3 8 13 -0.26214400000000000000e6
+219 3 9 12 0.26214400000000000000e6
+220 3 1 6 -0.26214400000000000000e6
+220 3 5 6 -0.26214400000000000000e6
+220 3 9 13 0.26214400000000000000e6
+220 4 3 3 -0.52428800000000000000e6
+221 3 9 15 0.26214400000000000000e6
+221 3 13 14 -0.26214400000000000000e6
+222 1 2 3 -0.13107200000000000000e6
+222 3 1 6 0.52428800000000000000e6
+222 3 1 14 -0.52428800000000000000e6
+222 3 5 6 0.26214400000000000000e6
+222 3 5 10 -0.26214400000000000000e6
+222 3 6 6 -0.26214400000000000000e6
+222 3 6 15 0.13107200000000000000e6
+222 3 10 10 0.26214400000000000000e6
+222 3 10 15 0.13107200000000000000e6
+222 3 14 15 -0.26214400000000000000e6
+222 4 3 3 0.52428800000000000000e6
+222 4 4 4 -0.52428800000000000000e6
+222 5 3 14 0.13107200000000000000e6
+222 5 5 10 -0.26214400000000000000e6
+222 5 9 12 0.26214400000000000000e6
+222 5 12 13 -0.13107200000000000000e6
+222 6 2 2 -0.26214400000000000000e6
+222 7 1 2 -0.26214400000000000000e6
+223 1 10 13 -0.26214400000000000000e6
+223 3 10 11 0.26214400000000000000e6
+224 3 10 12 0.26214400000000000000e6
+224 5 10 13 -0.26214400000000000000e6
+225 3 9 14 -0.26214400000000000000e6
+225 3 10 13 0.26214400000000000000e6
+226 3 1 6 -0.26214400000000000000e6
+226 3 1 14 0.52428800000000000000e6
+226 3 5 6 -0.26214400000000000000e6
+226 3 10 14 0.26214400000000000000e6
+226 3 14 15 0.26214400000000000000e6
+226 4 3 3 -0.52428800000000000000e6
+226 5 9 12 -0.26214400000000000000e6
+227 1 1 4 0.26214400000000000000e6
+227 3 1 14 -0.26214400000000000000e6
+227 3 5 6 0.13107200000000000000e6
+227 3 5 10 -0.13107200000000000000e6
+227 3 11 11 0.26214400000000000000e6
+227 3 14 15 -0.13107200000000000000e6
+227 4 3 3 0.26214400000000000000e6
+227 4 4 4 -0.26214400000000000000e6
+227 5 9 12 0.13107200000000000000e6
+227 7 1 2 -0.13107200000000000000e6
+228 3 2 15 -0.26214400000000000000e6
+228 3 11 12 0.26214400000000000000e6
+229 1 6 15 -0.26214400000000000000e6
+229 3 11 13 0.26214400000000000000e6
+230 1 13 14 -0.26214400000000000000e6
+230 3 11 14 0.26214400000000000000e6
+231 1 4 11 0.52428800000000000000e6
+231 1 10 13 0.26214400000000000000e6
+231 3 6 11 -0.26214400000000000000e6
+231 3 11 15 0.26214400000000000000e6
+231 5 2 13 -0.26214400000000000000e6
+232 3 12 12 0.26214400000000000000e6
+232 5 12 13 -0.13107200000000000000e6
+233 3 8 15 -0.26214400000000000000e6
+233 3 12 14 0.26214400000000000000e6
+234 1 2 13 0.52428800000000000000e6
+234 3 12 15 0.26214400000000000000e6
+234 5 5 12 -0.26214400000000000000e6
+234 5 6 13 -0.26214400000000000000e6
+234 5 10 13 0.26214400000000000000e6
+235 3 6 15 -0.13107200000000000000e6
+235 3 13 13 0.26214400000000000000e6
+236 1 2 13 0.26214400000000000000e6
+236 1 4 13 0.52428800000000000000e6
+236 3 6 13 -0.26214400000000000000e6
+236 3 8 15 -0.26214400000000000000e6
+236 3 9 14 0.26214400000000000000e6
+236 3 13 15 0.26214400000000000000e6
+236 6 3 5 0.26214400000000000000e6
+237 3 10 15 -0.13107200000000000000e6
+237 3 14 14 0.26214400000000000000e6
+238 1 1 4 -0.52428800000000000000e6
+238 3 1 14 0.52428800000000000000e6
+238 3 5 6 -0.26214400000000000000e6
+238 3 5 10 0.26214400000000000000e6
+238 3 6 15 -0.13107200000000000000e6
+238 3 10 15 0.13107200000000000000e6
+238 3 14 15 0.26214400000000000000e6
+238 3 15 15 0.26214400000000000000e6
+238 4 3 3 -0.52428800000000000000e6
+238 4 4 4 0.52428800000000000000e6
+238 5 9 12 -0.26214400000000000000e6
+238 5 12 13 -0.13107200000000000000e6
+238 7 1 2 0.26214400000000000000e6
+239 1 1 4 0.13107200000000000000e6
+239 3 1 14 -0.13107200000000000000e6
+239 3 5 6 0.65536000000000000000e5
+239 3 5 10 -0.65536000000000000000e5
+239 3 12 13 -0.65536000000000000000e5
+239 4 1 1 0.26214400000000000000e6
+239 5 3 6 0.65536000000000000000e5
+240 4 1 2 0.26214400000000000000e6
+240 5 1 4 0.26214400000000000000e6
+240 7 2 3 0.26214400000000000000e6
+240 7 4 5 -0.26214400000000000000e6
+241 2 3 3 -0.52428800000000000000e6
+241 4 1 3 0.26214400000000000000e6
+242 1 4 7 0.26214400000000000000e6
+242 1 10 13 -0.26214400000000000000e6
+242 4 1 4 0.26214400000000000000e6
+242 7 3 4 0.26214400000000000000e6
+243 4 2 2 0.26214400000000000000e6
+243 5 3 6 0.13107200000000000000e6
+243 5 9 12 -0.13107200000000000000e6
+243 7 1 2 0.13107200000000000000e6
+244 1 2 3 0.26214400000000000000e6
+244 3 5 6 0.13107200000000000000e6
+244 3 5 10 -0.13107200000000000000e6
+244 3 8 13 -0.26214400000000000000e6
+244 3 12 13 -0.13107200000000000000e6
+244 4 2 3 0.26214400000000000000e6
+244 5 3 6 0.13107200000000000000e6
+244 5 3 14 -0.26214400000000000000e6
+244 5 5 10 0.26214400000000000000e6
+244 5 12 13 0.26214400000000000000e6
+244 6 2 2 0.52428800000000000000e6
+244 7 1 2 0.52428800000000000000e6
+245 4 2 5 0.26214400000000000000e6
+245 6 3 5 -0.26214400000000000000e6
+246 1 6 7 0.26214400000000000000e6
+246 3 9 14 -0.26214400000000000000e6
+246 4 3 4 0.26214400000000000000e6
+246 5 6 9 0.26214400000000000000e6
+247 1 4 13 0.26214400000000000000e6
+247 3 13 14 -0.26214400000000000000e6
+247 4 3 5 0.26214400000000000000e6
+247 5 6 13 0.26214400000000000000e6
+248 3 1 14 0.26214400000000000000e6
+248 3 8 13 0.26214400000000000000e6
+248 3 10 15 -0.26214400000000000000e6
+248 4 4 5 0.26214400000000000000e6
+249 1 1 4 -0.26214400000000000000e6
+249 3 1 14 0.26214400000000000000e6
+249 3 5 6 -0.13107200000000000000e6
+249 3 5 10 0.13107200000000000000e6
+249 3 12 13 0.13107200000000000000e6
+249 4 3 3 -0.26214400000000000000e6
+249 4 4 4 0.26214400000000000000e6
+249 4 5 5 0.26214400000000000000e6
+249 5 9 12 -0.13107200000000000000e6
+249 7 1 2 0.13107200000000000000e6
+250 1 1 2 -0.13107200000000000000e6
+250 5 1 1 0.26214400000000000000e6
+251 2 2 2 0.52428800000000000000e6
+251 5 1 2 0.26214400000000000000e6
+251 5 2 5 0.26214400000000000000e6
+251 5 8 11 -0.26214400000000000000e6
+252 1 2 3 -0.26214400000000000000e6
+252 5 1 3 0.26214400000000000000e6
+253 5 1 5 0.26214400000000000000e6
+253 7 1 2 -0.26214400000000000000e6
+254 3 5 6 -0.13107200000000000000e6
+254 3 5 10 0.13107200000000000000e6
+254 3 12 13 0.13107200000000000000e6
+254 5 1 6 0.26214400000000000000e6
+254 5 3 6 -0.13107200000000000000e6
+255 1 1 8 -0.26214400000000000000e6
+255 5 1 7 0.26214400000000000000e6
+256 1 2 9 -0.26214400000000000000e6
+256 5 1 9 0.26214400000000000000e6
+257 1 1 2 0.52428800000000000000e6
+257 1 2 3 -0.26214400000000000000e6
+257 1 11 12 0.26214400000000000000e6
+257 3 5 6 -0.13107200000000000000e6
+257 3 5 10 0.13107200000000000000e6
+257 3 12 13 0.13107200000000000000e6
+257 5 1 10 0.26214400000000000000e6
+257 5 3 6 -0.13107200000000000000e6
+258 1 1 12 -0.26214400000000000000e6
+258 5 1 11 0.26214400000000000000e6
+259 1 2 13 -0.26214400000000000000e6
+259 5 1 13 0.26214400000000000000e6
+260 1 8 11 -0.26214400000000000000e6
+260 5 1 14 0.26214400000000000000e6
+261 1 11 12 -0.26214400000000000000e6
+261 5 1 15 0.26214400000000000000e6
+262 1 2 3 -0.13107200000000000000e6
+262 5 2 2 0.26214400000000000000e6
+263 1 3 10 -0.26214400000000000000e6
+263 2 2 2 0.10485760000000000000e7
+263 5 2 3 0.26214400000000000000e6
+263 5 2 5 0.52428800000000000000e6
+263 5 2 15 -0.26214400000000000000e6
+263 5 8 11 -0.52428800000000000000e6
+263 7 2 3 0.26214400000000000000e6
+264 5 2 4 0.26214400000000000000e6
+264 7 1 2 -0.26214400000000000000e6
+265 5 2 6 0.26214400000000000000e6
+265 7 2 3 -0.26214400000000000000e6
+266 5 1 8 -0.26214400000000000000e6
+266 5 2 7 0.26214400000000000000e6
+267 1 3 8 -0.26214400000000000000e6
+267 5 2 8 0.26214400000000000000e6
+268 1 5 8 -0.26214400000000000000e6
+268 5 2 9 0.26214400000000000000e6
+269 1 3 10 -0.26214400000000000000e6
+269 5 2 10 0.26214400000000000000e6
+270 5 1 12 -0.26214400000000000000e6
+270 5 2 11 0.26214400000000000000e6
+271 1 3 12 -0.26214400000000000000e6
+271 5 2 12 0.26214400000000000000e6
+272 5 2 14 0.26214400000000000000e6
+272 5 8 11 -0.26214400000000000000e6
+273 1 2 3 -0.26214400000000000000e6
+273 5 3 3 0.26214400000000000000e6
+273 5 3 6 0.13107200000000000000e6
+273 5 3 10 -0.13107200000000000000e6
+273 5 3 15 -0.13107200000000000000e6
+274 5 2 5 -0.26214400000000000000e6
+274 5 3 4 0.26214400000000000000e6
+275 1 2 3 0.26214400000000000000e6
+275 5 3 5 0.26214400000000000000e6
+275 5 3 14 -0.26214400000000000000e6
+275 6 2 2 0.52428800000000000000e6
+276 1 3 8 -0.26214400000000000000e6
+276 5 3 7 0.26214400000000000000e6
+277 5 3 9 0.26214400000000000000e6
+277 5 5 8 -0.26214400000000000000e6
+278 1 3 12 -0.26214400000000000000e6
+278 5 3 11 0.26214400000000000000e6
+279 1 2 13 -0.26214400000000000000e6
+279 3 8 15 0.26214400000000000000e6
+279 5 1 8 -0.26214400000000000000e6
+279 5 1 12 -0.52428800000000000000e6
+279 5 3 12 0.26214400000000000000e6
+279 5 5 8 -0.26214400000000000000e6
+279 5 12 15 -0.26214400000000000000e6
+279 6 2 4 -0.26214400000000000000e6
+279 6 3 5 -0.26214400000000000000e6
+280 5 3 13 0.26214400000000000000e6
+280 5 5 12 -0.26214400000000000000e6
+281 3 5 6 -0.65536000000000000000e5
+281 3 5 10 0.65536000000000000000e5
+281 3 12 13 0.65536000000000000000e5
+281 5 3 6 -0.65536000000000000000e5
+281 5 4 4 0.26214400000000000000e6
+282 5 4 5 0.26214400000000000000e6
+282 7 2 3 -0.26214400000000000000e6
+283 3 4 5 -0.26214400000000000000e6
+283 5 4 6 0.26214400000000000000e6
+284 1 2 9 -0.26214400000000000000e6
+284 5 4 7 0.26214400000000000000e6
+285 1 5 8 -0.26214400000000000000e6
+285 5 4 8 0.26214400000000000000e6
+286 5 4 9 0.26214400000000000000e6
+286 7 3 4 -0.26214400000000000000e6
+287 3 7 8 -0.26214400000000000000e6
+287 5 4 10 0.26214400000000000000e6
+288 1 2 13 -0.26214400000000000000e6
+288 5 4 11 0.26214400000000000000e6
+289 5 2 13 -0.26214400000000000000e6
+289 5 4 12 0.26214400000000000000e6
+290 1 4 11 0.26214400000000000000e6
+290 1 13 14 -0.26214400000000000000e6
+290 4 1 5 0.26214400000000000000e6
+290 5 4 13 0.26214400000000000000e6
+291 5 4 14 0.26214400000000000000e6
+291 7 4 5 -0.26214400000000000000e6
+292 3 2 15 -0.26214400000000000000e6
+292 5 4 15 0.26214400000000000000e6
+293 5 3 6 -0.13107200000000000000e6
+293 5 5 5 0.26214400000000000000e6
+294 1 2 3 -0.26214400000000000000e6
+294 5 3 14 0.26214400000000000000e6
+294 5 5 6 0.26214400000000000000e6
+294 5 5 10 -0.26214400000000000000e6
+294 5 12 13 -0.26214400000000000000e6
+294 6 2 2 -0.52428800000000000000e6
+294 7 1 2 -0.52428800000000000000e6
+295 1 5 8 -0.26214400000000000000e6
+295 5 5 7 0.26214400000000000000e6
+296 1 2 9 0.26214400000000000000e6
+296 4 2 4 0.26214400000000000000e6
+296 5 5 9 0.26214400000000000000e6
+296 5 10 13 -0.26214400000000000000e6
+297 5 2 13 -0.26214400000000000000e6
+297 5 5 11 0.26214400000000000000e6
+298 1 2 13 0.26214400000000000000e6
+298 3 8 15 -0.26214400000000000000e6
+298 5 5 13 0.26214400000000000000e6
+298 6 3 5 0.26214400000000000000e6
+299 5 5 14 0.26214400000000000000e6
+299 5 9 12 -0.26214400000000000000e6
+300 5 5 15 0.26214400000000000000e6
+300 5 12 13 -0.26214400000000000000e6
+301 3 5 6 -0.13107200000000000000e6
+301 5 6 6 0.26214400000000000000e6
+302 5 6 7 0.26214400000000000000e6
+302 7 3 4 -0.26214400000000000000e6
+303 1 2 9 0.26214400000000000000e6
+303 4 2 4 0.26214400000000000000e6
+303 5 6 8 0.26214400000000000000e6
+303 5 10 13 -0.26214400000000000000e6
+304 3 5 10 -0.26214400000000000000e6
+304 5 6 10 0.26214400000000000000e6
+305 1 4 11 0.26214400000000000000e6
+305 1 13 14 -0.26214400000000000000e6
+305 4 1 5 0.26214400000000000000e6
+305 5 6 11 0.26214400000000000000e6
+306 1 2 13 0.26214400000000000000e6
+306 3 8 15 -0.26214400000000000000e6
+306 5 6 12 0.26214400000000000000e6
+306 6 3 5 0.26214400000000000000e6
+307 3 8 13 -0.26214400000000000000e6
+307 5 6 14 0.26214400000000000000e6
+308 3 12 13 -0.26214400000000000000e6
+308 5 6 15 0.26214400000000000000e6
+309 1 1 2 0.26214400000000000000e6
+309 1 2 3 -0.13107200000000000000e6
+309 1 11 12 0.13107200000000000000e6
+309 3 5 6 -0.65536000000000000000e5
+309 3 5 10 0.65536000000000000000e5
+309 3 12 13 0.65536000000000000000e5
+309 5 3 6 -0.65536000000000000000e5
+309 5 7 7 0.26214400000000000000e6
+310 1 3 10 -0.26214400000000000000e6
+310 5 7 8 0.26214400000000000000e6
+311 3 7 8 -0.26214400000000000000e6
+311 5 7 9 0.26214400000000000000e6
+312 1 8 11 -0.26214400000000000000e6
+312 5 7 11 0.26214400000000000000e6
+313 5 7 12 0.26214400000000000000e6
+313 5 8 11 -0.26214400000000000000e6
+314 5 7 13 0.26214400000000000000e6
+314 7 4 5 -0.26214400000000000000e6
+315 1 1 8 -0.26214400000000000000e6
+315 1 5 8 -0.26214400000000000000e6
+315 2 2 4 -0.26214400000000000000e6
+315 5 7 14 0.26214400000000000000e6
+316 1 8 15 -0.26214400000000000000e6
+316 5 7 15 0.26214400000000000000e6
+317 5 3 10 -0.13107200000000000000e6
+317 5 8 8 0.26214400000000000000e6
+318 5 5 10 -0.26214400000000000000e6
+318 5 8 9 0.26214400000000000000e6
+319 1 2 9 0.26214400000000000000e6
+319 4 2 4 0.26214400000000000000e6
+319 5 1 8 0.52428800000000000000e6
+319 5 3 8 -0.26214400000000000000e6
+319 5 8 10 0.26214400000000000000e6
+319 5 8 15 0.26214400000000000000e6
+319 5 10 13 -0.26214400000000000000e6
+320 5 3 14 -0.26214400000000000000e6
+320 5 8 12 0.26214400000000000000e6
+321 5 8 13 0.26214400000000000000e6
+321 5 9 12 -0.26214400000000000000e6
+322 5 1 8 -0.26214400000000000000e6
+322 5 5 8 -0.26214400000000000000e6
+322 5 8 14 0.26214400000000000000e6
+322 6 2 4 -0.26214400000000000000e6
+323 3 5 10 -0.13107200000000000000e6
+323 5 9 9 0.26214400000000000000e6
+324 1 2 9 0.52428800000000000000e6
+324 3 8 15 0.26214400000000000000e6
+324 5 5 8 -0.26214400000000000000e6
+324 5 6 9 -0.26214400000000000000e6
+324 5 9 10 0.26214400000000000000e6
+325 5 9 11 0.26214400000000000000e6
+325 7 4 5 -0.26214400000000000000e6
+326 3 8 13 -0.26214400000000000000e6
+326 5 9 13 0.26214400000000000000e6
+327 5 9 14 0.26214400000000000000e6
+327 5 10 13 -0.26214400000000000000e6
+328 3 8 15 -0.26214400000000000000e6
+328 5 9 15 0.26214400000000000000e6
+329 1 1 2 -0.52428800000000000000e6
+329 1 2 3 0.26214400000000000000e6
+329 1 11 12 -0.26214400000000000000e6
+329 3 5 6 0.13107200000000000000e6
+329 3 5 10 -0.26214400000000000000e6
+329 3 12 13 -0.13107200000000000000e6
+329 5 3 6 0.13107200000000000000e6
+329 5 3 10 -0.13107200000000000000e6
+329 5 10 10 0.26214400000000000000e6
+329 5 10 15 0.13107200000000000000e6
+330 1 1 8 -0.26214400000000000000e6
+330 1 5 8 -0.26214400000000000000e6
+330 2 2 4 -0.26214400000000000000e6
+330 5 10 11 0.26214400000000000000e6
+331 5 1 8 -0.26214400000000000000e6
+331 5 5 8 -0.26214400000000000000e6
+331 5 10 12 0.26214400000000000000e6
+331 6 2 4 -0.26214400000000000000e6
+332 1 1 2 0.52428800000000000000e6
+332 1 2 3 -0.26214400000000000000e6
+332 1 11 12 0.26214400000000000000e6
+332 3 5 6 -0.13107200000000000000e6
+332 3 5 10 0.13107200000000000000e6
+332 3 12 13 0.13107200000000000000e6
+332 5 3 6 -0.13107200000000000000e6
+332 5 5 10 -0.26214400000000000000e6
+332 5 10 14 0.26214400000000000000e6
+332 6 4 4 -0.52428800000000000000e6
+333 1 11 12 -0.13107200000000000000e6
+333 5 11 11 0.26214400000000000000e6
+334 5 2 15 -0.26214400000000000000e6
+334 5 11 12 0.26214400000000000000e6
+335 3 2 15 -0.26214400000000000000e6
+335 5 11 13 0.26214400000000000000e6
+336 1 8 15 -0.26214400000000000000e6
+336 5 11 14 0.26214400000000000000e6
+337 1 12 15 -0.26214400000000000000e6
+337 5 11 15 0.26214400000000000000e6
+338 5 3 15 -0.13107200000000000000e6
+338 5 12 12 0.26214400000000000000e6
+339 5 8 15 -0.26214400000000000000e6
+339 5 12 14 0.26214400000000000000e6
+340 3 12 13 -0.13107200000000000000e6
+340 5 13 13 0.26214400000000000000e6
+341 3 8 15 -0.26214400000000000000e6
+341 5 13 14 0.26214400000000000000e6
+342 1 2 13 0.52428800000000000000e6
+342 5 5 12 -0.26214400000000000000e6
+342 5 6 13 -0.26214400000000000000e6
+342 5 10 13 0.26214400000000000000e6
+342 5 13 15 0.26214400000000000000e6
+343 5 10 15 -0.13107200000000000000e6
+343 5 14 14 0.26214400000000000000e6
+344 1 11 12 0.26214400000000000000e6
+344 3 12 13 -0.13107200000000000000e6
+344 5 3 15 -0.13107200000000000000e6
+344 5 10 15 0.13107200000000000000e6
+344 5 15 15 0.26214400000000000000e6
+345 1 1 2 0.13107200000000000000e6
+345 1 8 11 -0.13107200000000000000e6
+345 6 1 1 0.26214400000000000000e6
+345 7 1 2 0.13107200000000000000e6
+346 2 2 2 -0.52428800000000000000e6
+346 6 1 2 0.26214400000000000000e6
+347 5 1 4 0.26214400000000000000e6
+347 6 1 3 0.26214400000000000000e6
+347 7 2 3 0.26214400000000000000e6
+347 7 4 5 -0.26214400000000000000e6
+348 2 2 4 -0.26214400000000000000e6
+348 6 1 4 0.26214400000000000000e6
+349 1 1 12 0.26214400000000000000e6
+349 1 8 15 -0.26214400000000000000e6
+349 5 2 13 0.26214400000000000000e6
+349 6 1 5 0.26214400000000000000e6
+350 5 3 6 0.26214400000000000000e6
+350 5 9 12 -0.26214400000000000000e6
+350 6 2 3 0.26214400000000000000e6
+350 7 1 2 0.26214400000000000000e6
+351 5 1 12 0.26214400000000000000e6
+351 5 5 12 0.26214400000000000000e6
+351 5 8 15 -0.26214400000000000000e6
+351 6 2 5 0.26214400000000000000e6
+352 1 2 3 0.13107200000000000000e6
+352 3 5 6 0.65536000000000000000e5
+352 3 5 10 -0.65536000000000000000e5
+352 3 8 13 -0.13107200000000000000e6
+352 3 12 13 -0.65536000000000000000e5
+352 5 3 6 0.65536000000000000000e5
+352 5 3 14 -0.13107200000000000000e6
+352 5 5 10 0.13107200000000000000e6
+352 5 12 13 0.13107200000000000000e6
+352 6 2 2 0.26214400000000000000e6
+352 6 3 3 0.26214400000000000000e6
+352 7 1 2 0.26214400000000000000e6
+353 4 2 4 -0.26214400000000000000e6
+353 6 3 4 0.26214400000000000000e6
+354 1 8 11 0.26214400000000000000e6
+354 5 9 12 0.26214400000000000000e6
+354 5 10 15 -0.26214400000000000000e6
+354 6 4 5 0.26214400000000000000e6
+355 1 11 12 0.13107200000000000000e6
+355 5 12 13 0.13107200000000000000e6
+355 5 14 15 -0.13107200000000000000e6
+355 6 5 5 0.26214400000000000000e6
+356 5 1 4 -0.13107200000000000000e6
+356 7 1 1 0.26214400000000000000e6
+357 3 5 6 -0.13107200000000000000e6
+357 3 5 10 0.13107200000000000000e6
+357 3 12 13 0.13107200000000000000e6
+357 5 3 6 -0.13107200000000000000e6
+357 7 1 3 0.26214400000000000000e6
+358 1 2 9 -0.26214400000000000000e6
+358 7 1 4 0.26214400000000000000e6
+359 1 2 13 -0.26214400000000000000e6
+359 7 1 5 0.26214400000000000000e6
+360 5 2 5 -0.13107200000000000000e6
+360 7 2 2 0.26214400000000000000e6
+361 1 5 8 -0.26214400000000000000e6
+361 7 2 4 0.26214400000000000000e6
+362 5 2 13 -0.26214400000000000000e6
+362 7 2 5 0.26214400000000000000e6
+363 3 4 5 -0.13107200000000000000e6
+363 7 3 3 0.26214400000000000000e6
+364 1 4 11 0.26214400000000000000e6
+364 1 13 14 -0.26214400000000000000e6
+364 4 1 5 0.26214400000000000000e6
+364 7 3 5 0.26214400000000000000e6
+365 3 7 8 -0.13107200000000000000e6
+365 7 4 4 0.26214400000000000000e6
+366 3 2 15 -0.13107200000000000000e6
+366 7 5 5 0.26214400000000000000e6
+367 5 1 4 0.13107200000000000000e6
+367 7 2 3 0.13107200000000000000e6
+367 7 4 5 -0.13107200000000000000e6
+367 8 1 1 0.26214400000000000000e6
+*** ANSWER ***
+Failure
+*** END ***
+*** REQUEST ***
+""
+1085
+8
+35 15 15 5 15 5 15 5
+0.0 0.0 0.0 0.26214400000000000000e6 -0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.78643200000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 -0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.13107200000000000000e6 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.78643200000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.10485760000000000000e7 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 -0.52428800000000000000e6 0.52428800000000000000e6 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.78643200000000000000e6 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.78643200000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.52428800000000000000e6 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.52428800000000000000e6 -0.78643200000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 -0.52428800000000000000e6 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.78643200000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 -0.52428800000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 -0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.78643200000000000000e6 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.52428800000000000000e6 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.10485760000000000000e7 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.52428800000000000000e6 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6 0.0 0.0 0.0 0.52428800000000000000e6 0.0 0.0 0.26214400000000000000e6 0.0 0.26214400000000000000e6 0.26214400000000000000e6 0.26214400000000000000e6 0.0 0.0 0.0 0.0 -0.52428800000000000000e6 0.0 0.0 0.0 0.0 0.0 0.26214400000000000000e6
+0 1 1 8 0.65536000000000000000e5
+0 1 2 33 0.65536000000000000000e5
+0 1 11 30 -0.65536000000000000000e5
+0 1 16 35 -0.32768000000000000000e5
+0 1 20 35 0.32768000000000000000e5
+0 1 23 34 -0.32768000000000000000e5
+0 1 34 35 0.32768000000000000000e5
+0 2 1 3 -0.65536000000000000000e5
+0 2 1 15 0.65536000000000000000e5
+0 2 7 7 0.13107200000000000000e6
+0 5 2 5 -0.65536000000000000000e5
+0 5 8 11 0.65536000000000000000e5
+0 7 1 10 0.65536000000000000000e5
+1 1 1 24 -0.26214400000000000000e6
+1 1 2 21 -0.52428800000000000000e6
+1 1 3 22 0.26214400000000000000e6
+1 1 4 35 -0.13107200000000000000e6
+1 1 12 27 -0.26214400000000000000e6
+1 1 19 34 0.13107200000000000000e6
+1 1 21 28 0.13107200000000000000e6
+1 1 24 31 0.13107200000000000000e6
+1 1 26 29 -0.13107200000000000000e6
+1 1 30 33 0.52428800000000000000e6
+1 1 32 35 0.13107200000000000000e6
+1 2 9 15 -0.52428800000000000000e6
+1 2 12 14 0.13107200000000000000e6
+1 2 13 15 0.13107200000000000000e6
+1 4 1 5 -0.26214400000000000000e6
+1 7 13 14 -0.52428800000000000000e6
+2 1 12 27 0.13107200000000000000e6
+2 1 13 32 -0.13107200000000000000e6
+2 1 18 25 0.13107200000000000000e6
+2 1 21 28 0.26214400000000000000e6
+2 1 28 35 0.13107200000000000000e6
+2 2 8 14 0.13107200000000000000e6
+2 7 13 14 -0.13107200000000000000e6
+3 1 1 34 0.26214400000000000000e6
+3 1 3 34 -0.13107200000000000000e6
+3 1 16 31 -0.13107200000000000000e6
+3 1 27 30 0.13107200000000000000e6
+3 1 31 34 0.13107200000000000000e6
+4 1 2 9 0.13107200000000000000e6
+4 1 2 33 0.26214400000000000000e6
+4 1 4 7 -0.13107200000000000000e6
+4 1 4 19 0.13107200000000000000e6
+4 1 18 33 0.13107200000000000000e6
+4 1 32 33 0.13107200000000000000e6
+4 2 5 5 0.26214400000000000000e6
+4 5 2 5 0.26214400000000000000e6
+4 7 5 14 -0.13107200000000000000e6
+4 7 6 15 -0.13107200000000000000e6
+5 1 2 9 -0.13107200000000000000e6
+5 1 2 33 -0.26214400000000000000e6
+5 1 4 7 0.13107200000000000000e6
+5 1 4 19 -0.13107200000000000000e6
+5 1 8 31 -0.13107200000000000000e6
+5 1 11 34 0.13107200000000000000e6
+5 1 16 35 0.13107200000000000000e6
+5 1 20 35 -0.13107200000000000000e6
+5 1 32 33 -0.13107200000000000000e6
+5 2 1 15 -0.26214400000000000000e6
+5 2 5 5 -0.26214400000000000000e6
+5 2 12 12 0.26214400000000000000e6
+5 2 15 15 -0.26214400000000000000e6
+5 5 2 5 -0.26214400000000000000e6
+5 7 5 14 0.13107200000000000000e6
+6 1 17 24 0.26214400000000000000e6
+6 1 18 25 -0.13107200000000000000e6
+6 1 19 26 -0.13107200000000000000e6
+6 1 19 30 0.13107200000000000000e6
+6 1 30 33 0.13107200000000000000e6
+7 1 1 34 -0.52428800000000000000e6
+7 1 5 24 0.26214400000000000000e6
+7 1 6 13 -0.13107200000000000000e6
+7 1 7 22 0.26214400000000000000e6
+7 1 14 29 -0.13107200000000000000e6
+7 1 20 27 0.13107200000000000000e6
+7 1 27 34 0.13107200000000000000e6
+7 1 31 34 -0.26214400000000000000e6
+7 2 1 11 0.52428800000000000000e6
+7 2 2 8 -0.13107200000000000000e6
+7 2 11 15 0.26214400000000000000e6
+7 5 1 8 -0.13107200000000000000e6
+7 5 1 12 0.26214400000000000000e6
+7 5 10 13 -0.26214400000000000000e6
+7 7 4 13 0.26214400000000000000e6
+8 2 1 3 0.26214400000000000000e6
+8 2 3 3 -0.26214400000000000000e6
+8 2 5 5 -0.26214400000000000000e6
+8 2 8 8 0.26214400000000000000e6
+8 2 12 12 0.26214400000000000000e6
+9 1 11 22 0.26214400000000000000e6
+9 1 12 35 0.13107200000000000000e6
+9 1 17 28 0.13107200000000000000e6
+9 3 8 13 -0.13107200000000000000e6
+9 5 3 14 -0.13107200000000000000e6
+10 1 1 8 0.13107200000000000000e6
+10 1 2 33 0.13107200000000000000e6
+10 1 11 26 -0.13107200000000000000e6
+10 2 1 1 0.52428800000000000000e6
+10 2 1 3 -0.13107200000000000000e6
+10 2 1 15 0.13107200000000000000e6
+10 2 7 7 0.26214400000000000000e6
+10 5 1 4 0.26214400000000000000e6
+10 5 2 5 -0.13107200000000000000e6
+10 7 1 10 0.13107200000000000000e6
+11 1 1 24 -0.52428800000000000000e6
+11 1 2 21 -0.52428800000000000000e6
+11 1 4 23 0.13107200000000000000e6
+11 1 4 35 -0.26214400000000000000e6
+11 1 10 25 -0.13107200000000000000e6
+11 1 13 28 -0.26214400000000000000e6
+11 1 15 18 0.13107200000000000000e6
+11 1 21 28 0.26214400000000000000e6
+11 1 25 28 0.26214400000000000000e6
+11 1 30 33 0.52428800000000000000e6
+11 1 32 35 0.13107200000000000000e6
+11 2 8 10 0.13107200000000000000e6
+11 2 9 15 -0.52428800000000000000e6
+11 2 12 14 0.26214400000000000000e6
+11 4 1 5 -0.52428800000000000000e6
+11 5 7 10 0.13107200000000000000e6
+11 7 13 14 -0.52428800000000000000e6
+12 1 1 24 -0.13107200000000000000e6
+12 1 18 25 0.13107200000000000000e6
+12 1 25 32 0.13107200000000000000e6
+12 1 30 33 0.13107200000000000000e6
+12 2 6 12 0.13107200000000000000e6
+12 2 9 15 -0.13107200000000000000e6
+12 4 1 5 -0.13107200000000000000e6
+12 5 2 13 0.26214400000000000000e6
+12 7 3 12 -0.13107200000000000000e6
+12 7 13 14 -0.26214400000000000000e6
+13 1 1 24 0.26214400000000000000e6
+13 1 17 24 0.13107200000000000000e6
+13 1 24 31 0.13107200000000000000e6
+13 3 6 11 -0.13107200000000000000e6
+13 5 2 13 -0.13107200000000000000e6
+14 1 5 20 0.26214400000000000000e6
+14 1 15 18 -0.13107200000000000000e6
+14 1 16 19 -0.13107200000000000000e6
+14 1 19 20 0.13107200000000000000e6
+14 1 19 34 0.13107200000000000000e6
+15 1 1 20 0.26214400000000000000e6
+15 1 3 20 -0.13107200000000000000e6
+15 1 17 20 0.13107200000000000000e6
+15 1 27 30 0.13107200000000000000e6
+15 3 9 10 -0.13107200000000000000e6
+16 1 4 19 -0.13107200000000000000e6
+16 1 15 16 -0.13107200000000000000e6
+16 1 18 19 0.13107200000000000000e6
+16 1 18 33 0.13107200000000000000e6
+16 7 1 10 0.26214400000000000000e6
+17 1 4 19 0.13107200000000000000e6
+17 1 11 34 0.13107200000000000000e6
+17 1 15 16 0.13107200000000000000e6
+17 1 18 19 -0.13107200000000000000e6
+17 1 20 35 -0.13107200000000000000e6
+17 2 7 7 -0.52428800000000000000e6
+17 2 8 8 0.26214400000000000000e6
+17 2 9 9 0.26214400000000000000e6
+17 2 10 10 -0.26214400000000000000e6
+17 7 1 10 -0.26214400000000000000e6
+18 1 9 16 -0.13107200000000000000e6
+18 1 10 13 -0.26214400000000000000e6
+18 1 12 27 0.52428800000000000000e6
+18 1 13 28 -0.26214400000000000000e6
+18 1 15 18 0.26214400000000000000e6
+18 1 18 25 -0.13107200000000000000e6
+18 1 21 28 0.26214400000000000000e6
+18 1 25 28 0.26214400000000000000e6
+18 2 3 9 0.13107200000000000000e6
+18 2 6 8 -0.26214400000000000000e6
+18 2 8 10 0.26214400000000000000e6
+18 2 12 14 0.26214400000000000000e6
+18 5 2 9 0.13107200000000000000e6
+18 5 7 10 0.26214400000000000000e6
+18 7 9 10 0.13107200000000000000e6
+18 7 13 14 0.13107200000000000000e6
+19 1 4 15 -0.13107200000000000000e6
+19 1 10 13 -0.13107200000000000000e6
+19 1 15 18 0.13107200000000000000e6
+19 1 25 28 0.13107200000000000000e6
+19 5 2 9 0.26214400000000000000e6
+20 1 6 13 -0.13107200000000000000e6
+20 1 12 19 0.13107200000000000000e6
+20 1 22 29 0.13107200000000000000e6
+20 3 2 7 0.26214400000000000000e6
+20 7 6 7 -0.13107200000000000000e6
+21 1 5 20 0.13107200000000000000e6
+21 1 10 13 0.26214400000000000000e6
+21 1 12 27 -0.52428800000000000000e6
+21 1 13 28 0.26214400000000000000e6
+21 1 15 18 -0.26214400000000000000e6
+21 1 17 24 0.26214400000000000000e6
+21 1 21 28 -0.26214400000000000000e6
+21 1 25 28 -0.26214400000000000000e6
+21 1 30 33 0.13107200000000000000e6
+21 2 1 9 -0.26214400000000000000e6
+21 2 6 8 0.26214400000000000000e6
+21 2 8 10 -0.26214400000000000000e6
+21 2 9 15 -0.13107200000000000000e6
+21 2 12 14 -0.26214400000000000000e6
+21 3 4 9 -0.13107200000000000000e6
+21 5 2 9 -0.13107200000000000000e6
+21 5 7 10 -0.26214400000000000000e6
+21 7 13 14 -0.13107200000000000000e6
+22 1 1 16 -0.13107200000000000000e6
+22 1 1 20 0.13107200000000000000e6
+22 1 1 34 -0.39321600000000000000e6
+22 1 5 24 0.26214400000000000000e6
+22 1 7 22 0.26214400000000000000e6
+22 1 31 34 -0.26214400000000000000e6
+22 2 1 7 -0.26214400000000000000e6
+22 2 1 11 0.52428800000000000000e6
+22 2 11 15 0.26214400000000000000e6
+22 3 2 7 -0.26214400000000000000e6
+22 5 1 8 -0.13107200000000000000e6
+22 5 1 12 0.26214400000000000000e6
+22 5 10 13 -0.26214400000000000000e6
+22 7 4 13 0.26214400000000000000e6
+23 1 2 9 0.13107200000000000000e6
+23 1 9 10 -0.13107200000000000000e6
+23 1 15 16 0.13107200000000000000e6
+23 2 5 5 0.26214400000000000000e6
+23 3 4 5 0.26214400000000000000e6
+23 7 5 14 -0.13107200000000000000e6
+23 7 6 15 0.13107200000000000000e6
+24 3 4 5 0.13107200000000000000e6
+24 5 1 4 -0.26214400000000000000e6
+24 5 2 5 0.13107200000000000000e6
+24 6 1 3 -0.26214400000000000000e6
+24 7 1 10 -0.13107200000000000000e6
+24 7 12 13 0.13107200000000000000e6
+24 7 14 15 -0.13107200000000000000e6
+24 8 2 2 0.26214400000000000000e6
+24 8 3 3 0.26214400000000000000e6
+24 8 4 4 -0.26214400000000000000e6
+25 1 1 8 0.26214400000000000000e6
+25 1 2 9 -0.13107200000000000000e6
+25 1 8 31 0.13107200000000000000e6
+25 1 9 10 0.13107200000000000000e6
+25 1 11 26 -0.26214400000000000000e6
+25 1 15 16 -0.13107200000000000000e6
+25 1 16 35 -0.13107200000000000000e6
+25 2 6 6 0.26214400000000000000e6
+25 2 9 9 -0.26214400000000000000e6
+25 7 5 14 0.13107200000000000000e6
+26 7 1 2 0.26214400000000000000e6
+26 7 2 3 -0.13107200000000000000e6
+26 7 4 5 -0.13107200000000000000e6
+26 7 7 8 0.13107200000000000000e6
+26 7 11 12 0.13107200000000000000e6
+27 1 2 33 0.13107200000000000000e6
+27 3 4 5 -0.13107200000000000000e6
+27 5 1 4 0.26214400000000000000e6
+27 5 2 5 -0.13107200000000000000e6
+27 7 1 10 0.13107200000000000000e6
+28 2 4 6 0.13107200000000000000e6
+28 2 4 10 -0.13107200000000000000e6
+28 2 11 13 -0.13107200000000000000e6
+28 4 1 1 -0.52428800000000000000e6
+28 5 9 12 0.13107200000000000000e6
+28 7 1 2 -0.13107200000000000000e6
+28 7 3 4 -0.13107200000000000000e6
+29 1 1 4 0.26214400000000000000e6
+29 1 3 4 -0.13107200000000000000e6
+29 1 3 18 0.13107200000000000000e6
+29 1 4 31 0.13107200000000000000e6
+29 7 3 4 -0.13107200000000000000e6
+30 1 24 31 0.26214400000000000000e6
+30 1 25 32 -0.13107200000000000000e6
+30 1 26 33 -0.13107200000000000000e6
+30 1 28 35 -0.13107200000000000000e6
+30 1 30 33 0.13107200000000000000e6
+31 1 1 24 0.26214400000000000000e6
+31 1 2 21 0.52428800000000000000e6
+31 1 3 22 -0.26214400000000000000e6
+31 1 4 35 0.13107200000000000000e6
+31 1 12 27 0.26214400000000000000e6
+31 1 21 28 -0.26214400000000000000e6
+31 1 24 31 -0.13107200000000000000e6
+31 1 25 28 -0.26214400000000000000e6
+31 1 30 33 -0.26214400000000000000e6
+31 1 32 35 -0.13107200000000000000e6
+31 2 9 15 0.26214400000000000000e6
+31 2 12 14 -0.26214400000000000000e6
+31 2 13 15 -0.13107200000000000000e6
+31 4 1 5 0.26214400000000000000e6
+31 7 13 14 0.26214400000000000000e6
+32 1 26 35 -0.13107200000000000000e6
+32 7 14 15 -0.13107200000000000000e6
+33 1 23 34 -0.13107200000000000000e6
+33 1 32 33 -0.13107200000000000000e6
+34 1 12 35 -0.13107200000000000000e6
+34 2 11 13 -0.26214400000000000000e6
+34 3 6 15 -0.13107200000000000000e6
+34 3 10 15 0.13107200000000000000e6
+34 3 12 13 -0.26214400000000000000e6
+34 3 14 15 0.26214400000000000000e6
+34 7 11 12 -0.13107200000000000000e6
+35 1 12 27 -0.13107200000000000000e6
+35 1 18 25 -0.13107200000000000000e6
+35 1 30 33 -0.13107200000000000000e6
+35 2 8 14 -0.13107200000000000000e6
+36 1 16 35 -0.13107200000000000000e6
+36 1 18 33 -0.13107200000000000000e6
+37 1 23 30 -0.13107200000000000000e6
+37 7 14 15 -0.13107200000000000000e6
+38 1 17 32 -0.13107200000000000000e6
+38 3 14 15 -0.13107200000000000000e6
+39 1 26 33 -0.13107200000000000000e6
+39 7 13 14 -0.13107200000000000000e6
+40 1 1 24 0.26214400000000000000e6
+40 1 2 21 0.52428800000000000000e6
+40 1 3 22 -0.26214400000000000000e6
+40 1 4 35 0.13107200000000000000e6
+40 1 12 27 0.26214400000000000000e6
+40 1 21 28 -0.13107200000000000000e6
+40 1 25 28 -0.26214400000000000000e6
+40 1 30 33 -0.26214400000000000000e6
+40 1 32 35 -0.13107200000000000000e6
+40 2 9 15 0.26214400000000000000e6
+40 2 12 14 -0.13107200000000000000e6
+40 4 1 5 0.26214400000000000000e6
+40 7 13 14 0.26214400000000000000e6
+41 1 8 35 -0.13107200000000000000e6
+41 1 22 29 -0.13107200000000000000e6
+42 1 13 32 -0.13107200000000000000e6
+42 1 25 32 -0.13107200000000000000e6
+43 1 3 34 -0.13107200000000000000e6
+43 1 6 21 0.26214400000000000000e6
+43 1 7 22 -0.13107200000000000000e6
+43 5 10 13 0.13107200000000000000e6
+43 7 4 13 -0.13107200000000000000e6
+44 1 21 28 -0.13107200000000000000e6
+44 1 24 31 -0.13107200000000000000e6
+45 1 15 18 -0.13107200000000000000e6
+45 1 19 34 -0.13107200000000000000e6
+45 2 8 10 -0.13107200000000000000e6
+45 5 7 10 -0.13107200000000000000e6
+46 1 8 31 0.26214400000000000000e6
+46 1 10 33 -0.13107200000000000000e6
+46 1 15 30 -0.13107200000000000000e6
+46 1 26 35 0.13107200000000000000e6
+46 7 12 13 -0.13107200000000000000e6
+47 1 18 33 -0.13107200000000000000e6
+47 1 20 23 -0.13107200000000000000e6
+48 1 17 28 -0.13107200000000000000e6
+48 3 10 15 -0.13107200000000000000e6
+49 1 12 27 -0.26214400000000000000e6
+49 1 13 28 0.13107200000000000000e6
+49 1 15 18 -0.13107200000000000000e6
+49 1 21 28 -0.13107200000000000000e6
+49 1 25 28 -0.13107200000000000000e6
+49 1 26 29 -0.13107200000000000000e6
+49 2 8 10 -0.13107200000000000000e6
+49 2 12 14 -0.13107200000000000000e6
+49 5 7 10 -0.13107200000000000000e6
+50 1 18 25 -0.13107200000000000000e6
+50 7 13 14 -0.13107200000000000000e6
+51 1 16 31 -0.13107200000000000000e6
+51 5 10 13 -0.13107200000000000000e6
+52 1 13 28 -0.13107200000000000000e6
+52 1 25 28 -0.13107200000000000000e6
+53 1 6 13 -0.13107200000000000000e6
+53 1 22 29 -0.13107200000000000000e6
+53 2 2 8 -0.13107200000000000000e6
+53 5 1 8 -0.13107200000000000000e6
+54 1 12 27 -0.13107200000000000000e6
+54 1 30 33 -0.13107200000000000000e6
+54 2 9 15 0.13107200000000000000e6
+54 7 13 14 0.13107200000000000000e6
+55 1 10 33 -0.13107200000000000000e6
+55 3 4 5 -0.13107200000000000000e6
+55 7 5 6 -0.13107200000000000000e6
+55 8 3 3 -0.26214400000000000000e6
+56 7 5 14 -0.13107200000000000000e6
+56 7 6 15 -0.13107200000000000000e6
+57 3 6 15 -0.13107200000000000000e6
+57 3 8 13 -0.13107200000000000000e6
+58 1 2 9 -0.26214400000000000000e6
+58 1 15 30 -0.13107200000000000000e6
+58 3 4 5 0.13107200000000000000e6
+58 5 1 4 -0.26214400000000000000e6
+58 6 1 3 -0.26214400000000000000e6
+58 7 5 6 0.13107200000000000000e6
+58 7 12 13 -0.13107200000000000000e6
+58 7 14 15 -0.13107200000000000000e6
+58 8 3 3 0.26214400000000000000e6
+59 3 12 13 -0.13107200000000000000e6
+59 5 9 12 -0.13107200000000000000e6
+60 1 2 9 -0.13107200000000000000e6
+60 1 8 31 -0.13107200000000000000e6
+60 5 1 4 -0.13107200000000000000e6
+60 6 1 3 -0.13107200000000000000e6
+61 1 2 9 0.13107200000000000000e6
+61 1 4 7 -0.13107200000000000000e6
+61 1 4 19 0.13107200000000000000e6
+61 1 20 23 -0.13107200000000000000e6
+61 1 23 34 -0.13107200000000000000e6
+61 2 1 3 0.26214400000000000000e6
+61 2 3 3 -0.26214400000000000000e6
+61 2 8 8 0.26214400000000000000e6
+61 2 12 12 0.26214400000000000000e6
+61 5 2 5 0.26214400000000000000e6
+61 5 8 11 -0.26214400000000000000e6
+62 5 3 14 -0.13107200000000000000e6
+62 7 11 12 -0.13107200000000000000e6
+63 1 2 33 -0.13107200000000000000e6
+63 5 8 11 -0.13107200000000000000e6
+64 1 11 22 -0.13107200000000000000e6
+64 2 11 13 0.13107200000000000000e6
+64 3 12 13 0.13107200000000000000e6
+64 3 14 15 -0.13107200000000000000e6
+65 1 4 11 0.26214400000000000000e6
+65 1 4 13 -0.13107200000000000000e6
+65 1 12 27 0.13107200000000000000e6
+65 1 13 32 0.13107200000000000000e6
+65 1 19 30 -0.13107200000000000000e6
+65 2 3 9 0.13107200000000000000e6
+65 2 8 14 0.13107200000000000000e6
+65 5 2 9 0.13107200000000000000e6
+65 5 7 10 0.26214400000000000000e6
+65 7 9 10 -0.13107200000000000000e6
+66 1 10 29 -0.13107200000000000000e6
+66 1 11 26 0.26214400000000000000e6
+66 1 16 35 0.13107200000000000000e6
+66 1 18 19 -0.13107200000000000000e6
+66 7 5 14 -0.13107200000000000000e6
+67 1 13 20 -0.13107200000000000000e6
+67 1 15 30 -0.13107200000000000000e6
+68 1 2 17 0.26214400000000000000e6
+68 1 3 18 -0.13107200000000000000e6
+68 1 17 32 0.13107200000000000000e6
+68 2 4 6 -0.13107200000000000000e6
+68 3 1 6 -0.13107200000000000000e6
+68 3 1 14 0.26214400000000000000e6
+68 3 5 6 -0.13107200000000000000e6
+68 3 5 10 -0.13107200000000000000e6
+68 3 14 15 0.13107200000000000000e6
+68 5 9 12 -0.13107200000000000000e6
+69 1 19 26 -0.13107200000000000000e6
+69 7 9 10 -0.13107200000000000000e6
+70 1 12 27 -0.26214400000000000000e6
+70 1 13 28 0.13107200000000000000e6
+70 1 15 18 -0.26214400000000000000e6
+70 1 21 28 -0.13107200000000000000e6
+70 1 25 28 -0.13107200000000000000e6
+70 2 8 10 -0.13107200000000000000e6
+70 2 12 14 -0.13107200000000000000e6
+70 5 7 10 -0.13107200000000000000e6
+71 1 12 19 -0.13107200000000000000e6
+71 1 14 29 -0.13107200000000000000e6
+72 1 4 11 0.26214400000000000000e6
+72 1 4 13 -0.13107200000000000000e6
+72 1 13 32 0.13107200000000000000e6
+72 1 18 25 -0.26214400000000000000e6
+72 2 3 9 0.13107200000000000000e6
+72 5 2 9 0.13107200000000000000e6
+73 1 3 20 -0.13107200000000000000e6
+73 5 10 13 -0.13107200000000000000e6
+74 1 17 24 -0.13107200000000000000e6
+74 5 7 10 -0.13107200000000000000e6
+75 1 10 29 -0.13107200000000000000e6
+75 1 15 16 -0.13107200000000000000e6
+76 1 15 30 -0.13107200000000000000e6
+76 3 4 5 -0.13107200000000000000e6
+76 7 1 10 0.13107200000000000000e6
+76 7 5 6 -0.13107200000000000000e6
+76 8 3 3 -0.26214400000000000000e6
+76 8 4 4 0.26214400000000000000e6
+77 2 4 6 -0.13107200000000000000e6
+77 3 1 6 -0.13107200000000000000e6
+77 3 5 6 -0.13107200000000000000e6
+77 3 5 10 -0.13107200000000000000e6
+78 1 4 19 -0.13107200000000000000e6
+78 7 5 14 -0.13107200000000000000e6
+79 3 8 13 -0.13107200000000000000e6
+79 7 7 8 -0.13107200000000000000e6
+80 1 11 26 -0.13107200000000000000e6
+80 7 1 10 -0.13107200000000000000e6
+81 1 2 9 -0.26214400000000000000e6
+81 1 4 19 0.26214400000000000000e6
+81 1 13 20 -0.13107200000000000000e6
+81 1 20 23 -0.26214400000000000000e6
+81 1 23 30 -0.13107200000000000000e6
+81 2 8 8 0.52428800000000000000e6
+81 3 4 5 0.13107200000000000000e6
+81 5 1 4 -0.26214400000000000000e6
+81 6 1 3 -0.26214400000000000000e6
+81 7 1 10 -0.13107200000000000000e6
+81 7 5 6 0.13107200000000000000e6
+81 7 14 15 -0.13107200000000000000e6
+81 8 3 3 0.26214400000000000000e6
+81 8 4 4 -0.26214400000000000000e6
+82 1 3 18 -0.13107200000000000000e6
+82 5 9 12 -0.13107200000000000000e6
+83 1 2 9 -0.13107200000000000000e6
+83 1 4 19 0.13107200000000000000e6
+83 1 20 23 -0.13107200000000000000e6
+83 2 8 8 0.26214400000000000000e6
+83 5 1 4 -0.13107200000000000000e6
+83 6 1 3 -0.13107200000000000000e6
+84 1 2 17 -0.13107200000000000000e6
+84 3 1 14 -0.13107200000000000000e6
+85 1 1 24 0.13107200000000000000e6
+85 1 9 16 -0.13107200000000000000e6
+85 1 19 26 -0.13107200000000000000e6
+85 1 26 33 -0.13107200000000000000e6
+85 1 30 33 -0.13107200000000000000e6
+85 2 6 12 -0.13107200000000000000e6
+85 2 9 15 0.13107200000000000000e6
+85 3 6 11 -0.26214400000000000000e6
+85 4 1 5 0.13107200000000000000e6
+85 7 13 14 0.26214400000000000000e6
+86 1 10 13 -0.13107200000000000000e6
+86 1 10 25 -0.13107200000000000000e6
+87 1 5 24 -0.26214400000000000000e6
+87 1 8 23 0.13107200000000000000e6
+87 1 8 35 -0.13107200000000000000e6
+87 1 14 29 -0.13107200000000000000e6
+87 7 6 7 -0.13107200000000000000e6
+88 1 1 24 -0.13107200000000000000e6
+88 1 18 25 -0.13107200000000000000e6
+88 1 30 33 0.13107200000000000000e6
+88 2 3 9 0.13107200000000000000e6
+88 2 6 12 0.13107200000000000000e6
+88 2 9 15 -0.13107200000000000000e6
+88 4 1 5 -0.13107200000000000000e6
+88 5 2 9 0.13107200000000000000e6
+88 7 13 14 -0.26214400000000000000e6
+89 1 7 14 -0.13107200000000000000e6
+89 7 4 13 -0.13107200000000000000e6
+90 1 10 13 0.13107200000000000000e6
+90 1 12 27 -0.26214400000000000000e6
+90 1 13 28 0.13107200000000000000e6
+90 1 15 18 -0.13107200000000000000e6
+90 1 21 28 -0.13107200000000000000e6
+90 1 25 28 -0.13107200000000000000e6
+90 2 6 8 0.13107200000000000000e6
+90 2 8 10 -0.13107200000000000000e6
+90 2 12 14 -0.13107200000000000000e6
+90 3 6 11 -0.13107200000000000000e6
+90 5 7 10 -0.13107200000000000000e6
+91 1 3 22 -0.26214400000000000000e6
+91 1 4 15 -0.13107200000000000000e6
+91 1 4 23 0.13107200000000000000e6
+91 1 4 35 -0.13107200000000000000e6
+91 1 13 28 -0.13107200000000000000e6
+92 1 6 13 -0.13107200000000000000e6
+92 1 8 23 -0.13107200000000000000e6
+93 1 1 24 0.13107200000000000000e6
+93 1 30 33 -0.13107200000000000000e6
+93 2 9 15 0.13107200000000000000e6
+93 4 1 5 0.13107200000000000000e6
+93 5 2 9 -0.13107200000000000000e6
+93 7 13 14 0.13107200000000000000e6
+94 1 5 24 -0.13107200000000000000e6
+94 3 2 7 -0.13107200000000000000e6
+95 1 4 13 -0.13107200000000000000e6
+95 7 3 12 -0.13107200000000000000e6
+96 1 3 20 -0.13107200000000000000e6
+96 1 3 34 -0.13107200000000000000e6
+96 1 7 14 0.13107200000000000000e6
+96 1 7 22 -0.13107200000000000000e6
+96 5 1 8 -0.26214400000000000000e6
+97 1 4 11 -0.13107200000000000000e6
+97 5 2 13 -0.13107200000000000000e6
+98 1 6 21 -0.13107200000000000000e6
+98 5 1 8 -0.13107200000000000000e6
+99 1 1 24 -0.13107200000000000000e6
+99 1 4 11 -0.65536000000000000000e5
+99 1 10 13 0.65536000000000000000e5
+99 1 12 27 -0.13107200000000000000e6
+99 1 13 28 0.65536000000000000000e5
+99 1 15 18 -0.65536000000000000000e5
+99 1 25 28 -0.65536000000000000000e5
+99 2 6 8 0.65536000000000000000e5
+99 2 8 10 -0.65536000000000000000e5
+99 2 12 14 -0.65536000000000000000e5
+100 1 1 1 0.26214400000000000000e6
+100 1 1 8 -0.65536000000000000000e5
+100 1 2 33 -0.65536000000000000000e5
+100 1 11 30 0.65536000000000000000e5
+100 1 16 35 0.32768000000000000000e5
+100 1 20 35 -0.32768000000000000000e5
+100 1 23 34 0.32768000000000000000e5
+100 1 34 35 -0.32768000000000000000e5
+100 2 1 3 0.65536000000000000000e5
+100 2 1 15 -0.65536000000000000000e5
+100 2 7 7 -0.13107200000000000000e6
+100 5 2 5 0.65536000000000000000e5
+100 5 8 11 -0.65536000000000000000e5
+100 7 1 10 -0.65536000000000000000e5
+101 1 1 2 0.26214400000000000000e6
+101 1 1 4 -0.13107200000000000000e6
+101 1 1 32 0.13107200000000000000e6
+101 1 2 17 0.13107200000000000000e6
+101 3 5 6 -0.65536000000000000000e5
+101 3 5 10 0.65536000000000000000e5
+101 3 12 13 0.65536000000000000000e5
+101 7 3 4 -0.65536000000000000000e5
+102 1 1 3 0.26214400000000000000e6
+102 2 1 3 0.26214400000000000000e6
+102 5 2 5 0.26214400000000000000e6
+102 5 8 11 -0.26214400000000000000e6
+103 1 1 5 0.26214400000000000000e6
+103 3 1 14 -0.26214400000000000000e6
+103 3 5 6 0.13107200000000000000e6
+103 3 5 10 -0.13107200000000000000e6
+103 3 12 13 -0.13107200000000000000e6
+103 4 1 1 0.52428800000000000000e6
+103 7 3 4 0.13107200000000000000e6
+104 1 1 6 0.26214400000000000000e6
+104 5 1 4 -0.26214400000000000000e6
+105 1 1 7 0.26214400000000000000e6
+105 7 1 2 -0.26214400000000000000e6
+106 1 1 9 0.26214400000000000000e6
+106 3 5 6 -0.13107200000000000000e6
+106 3 5 10 0.13107200000000000000e6
+106 3 12 13 0.13107200000000000000e6
+106 7 3 4 -0.13107200000000000000e6
+107 1 1 10 0.26214400000000000000e6
+107 3 1 6 -0.26214400000000000000e6
+108 1 1 11 0.26214400000000000000e6
+108 1 1 34 0.52428800000000000000e6
+108 1 5 24 -0.26214400000000000000e6
+108 1 7 22 -0.26214400000000000000e6
+108 1 31 34 0.26214400000000000000e6
+108 2 1 7 0.26214400000000000000e6
+108 2 1 11 -0.52428800000000000000e6
+108 2 11 15 -0.26214400000000000000e6
+108 3 2 7 0.26214400000000000000e6
+108 5 1 12 -0.26214400000000000000e6
+108 5 10 13 0.26214400000000000000e6
+108 7 4 13 -0.26214400000000000000e6
+109 1 1 12 0.26214400000000000000e6
+109 1 4 11 -0.13107200000000000000e6
+109 1 10 13 0.13107200000000000000e6
+109 1 12 27 -0.26214400000000000000e6
+109 1 13 28 0.13107200000000000000e6
+109 1 15 18 -0.13107200000000000000e6
+109 1 25 28 -0.13107200000000000000e6
+109 2 6 8 0.13107200000000000000e6
+109 2 8 10 -0.13107200000000000000e6
+109 2 12 14 -0.13107200000000000000e6
+110 1 1 13 0.26214400000000000000e6
+110 5 1 8 -0.26214400000000000000e6
+111 1 1 14 0.26214400000000000000e6
+111 1 10 13 -0.26214400000000000000e6
+111 1 12 27 0.52428800000000000000e6
+111 1 13 28 -0.26214400000000000000e6
+111 1 15 18 0.26214400000000000000e6
+111 1 17 24 -0.26214400000000000000e6
+111 1 21 28 0.26214400000000000000e6
+111 1 25 28 0.26214400000000000000e6
+111 2 1 9 0.26214400000000000000e6
+111 2 6 8 -0.26214400000000000000e6
+111 2 8 10 0.26214400000000000000e6
+111 2 12 14 0.26214400000000000000e6
+111 5 7 10 0.26214400000000000000e6
+112 1 1 15 0.26214400000000000000e6
+112 3 2 7 -0.26214400000000000000e6
+113 1 1 17 0.26214400000000000000e6
+113 1 11 30 -0.26214400000000000000e6
+113 2 7 7 0.52428800000000000000e6
+113 7 1 10 0.26214400000000000000e6
+114 1 1 18 0.26214400000000000000e6
+114 1 2 17 -0.26214400000000000000e6
+115 1 1 19 0.26214400000000000000e6
+115 2 4 6 -0.26214400000000000000e6
+115 2 4 10 0.26214400000000000000e6
+115 3 1 6 -0.26214400000000000000e6
+115 3 1 14 0.52428800000000000000e6
+115 3 5 6 -0.26214400000000000000e6
+115 3 5 10 0.26214400000000000000e6
+115 3 14 15 0.26214400000000000000e6
+115 5 9 12 -0.26214400000000000000e6
+116 1 1 21 0.26214400000000000000e6
+116 1 1 34 -0.26214400000000000000e6
+116 1 6 21 0.26214400000000000000e6
+116 2 1 11 0.26214400000000000000e6
+117 1 1 22 0.26214400000000000000e6
+117 1 2 21 -0.26214400000000000000e6
+118 1 1 23 0.26214400000000000000e6
+118 5 1 12 -0.26214400000000000000e6
+119 1 1 25 0.26214400000000000000e6
+119 1 6 21 -0.26214400000000000000e6
+120 1 1 26 0.26214400000000000000e6
+120 1 5 24 -0.26214400000000000000e6
+121 1 1 8 -0.13107200000000000000e6
+121 1 1 27 0.26214400000000000000e6
+121 1 2 33 -0.13107200000000000000e6
+121 1 11 30 0.13107200000000000000e6
+121 1 16 35 0.65536000000000000000e5
+121 1 20 35 -0.65536000000000000000e5
+121 1 23 34 0.65536000000000000000e5
+121 1 34 35 -0.65536000000000000000e5
+121 2 1 1 -0.52428800000000000000e6
+121 2 1 3 0.13107200000000000000e6
+121 2 1 15 -0.13107200000000000000e6
+121 2 7 7 -0.26214400000000000000e6
+121 5 1 4 -0.26214400000000000000e6
+121 5 2 5 0.13107200000000000000e6
+121 5 8 11 -0.13107200000000000000e6
+121 7 1 10 -0.13107200000000000000e6
+122 1 1 28 0.26214400000000000000e6
+122 1 11 22 -0.26214400000000000000e6
+123 1 1 29 0.26214400000000000000e6
+123 3 1 14 -0.26214400000000000000e6
+124 1 1 30 0.26214400000000000000e6
+124 1 1 34 0.52428800000000000000e6
+124 1 5 24 -0.26214400000000000000e6
+124 1 7 22 -0.26214400000000000000e6
+124 1 31 34 0.26214400000000000000e6
+124 2 1 11 -0.52428800000000000000e6
+124 2 11 15 -0.26214400000000000000e6
+124 5 1 12 -0.26214400000000000000e6
+124 5 10 13 0.26214400000000000000e6
+124 7 4 13 -0.26214400000000000000e6
+125 1 1 31 0.26214400000000000000e6
+125 1 2 33 0.26214400000000000000e6
+125 1 16 35 -0.13107200000000000000e6
+125 1 20 35 0.13107200000000000000e6
+125 1 23 34 -0.13107200000000000000e6
+125 1 34 35 0.13107200000000000000e6
+125 2 1 15 0.26214400000000000000e6
+126 1 1 33 0.26214400000000000000e6
+126 2 11 13 0.26214400000000000000e6
+126 3 12 13 0.26214400000000000000e6
+126 3 14 15 -0.26214400000000000000e6
+127 1 1 35 0.26214400000000000000e6
+127 1 6 21 -0.52428800000000000000e6
+127 1 7 22 0.26214400000000000000e6
+127 1 31 34 -0.26214400000000000000e6
+127 2 11 15 0.26214400000000000000e6
+127 5 10 13 -0.26214400000000000000e6
+127 7 4 13 0.26214400000000000000e6
+128 1 2 2 0.26214400000000000000e6
+128 2 1 3 0.13107200000000000000e6
+128 5 2 5 0.13107200000000000000e6
+128 5 8 11 -0.13107200000000000000e6
+129 1 1 4 -0.26214400000000000000e6
+129 1 2 3 0.26214400000000000000e6
+130 1 2 4 0.26214400000000000000e6
+130 1 4 7 0.26214400000000000000e6
+130 1 20 23 -0.26214400000000000000e6
+130 1 23 34 -0.26214400000000000000e6
+130 2 1 3 0.52428800000000000000e6
+130 2 5 5 -0.52428800000000000000e6
+130 2 8 8 0.52428800000000000000e6
+130 2 12 12 0.52428800000000000000e6
+130 5 8 11 -0.52428800000000000000e6
+130 7 5 14 0.26214400000000000000e6
+131 1 2 5 0.26214400000000000000e6
+131 5 1 4 -0.26214400000000000000e6
+132 1 2 6 0.26214400000000000000e6
+132 7 1 2 -0.26214400000000000000e6
+133 1 2 7 0.26214400000000000000e6
+133 5 2 5 -0.26214400000000000000e6
+134 1 2 8 0.26214400000000000000e6
+134 3 5 6 -0.13107200000000000000e6
+134 3 5 10 0.13107200000000000000e6
+134 3 12 13 0.13107200000000000000e6
+134 7 3 4 -0.13107200000000000000e6
+135 1 2 10 0.26214400000000000000e6
+135 3 4 5 -0.26214400000000000000e6
+136 1 2 11 0.26214400000000000000e6
+136 1 4 11 -0.13107200000000000000e6
+136 1 10 13 0.13107200000000000000e6
+136 1 12 27 -0.26214400000000000000e6
+136 1 13 28 0.13107200000000000000e6
+136 1 15 18 -0.13107200000000000000e6
+136 1 25 28 -0.13107200000000000000e6
+136 2 6 8 0.13107200000000000000e6
+136 2 8 10 -0.13107200000000000000e6
+136 2 12 14 -0.13107200000000000000e6
+137 1 2 12 0.26214400000000000000e6
+137 5 1 8 -0.26214400000000000000e6
+138 1 2 13 0.26214400000000000000e6
+138 1 4 11 -0.26214400000000000000e6
+139 1 2 14 0.26214400000000000000e6
+139 3 2 7 -0.26214400000000000000e6
+140 1 2 15 0.26214400000000000000e6
+140 5 2 9 -0.26214400000000000000e6
+141 1 2 16 0.26214400000000000000e6
+141 1 10 13 0.26214400000000000000e6
+141 1 12 27 -0.52428800000000000000e6
+141 1 13 28 0.26214400000000000000e6
+141 1 15 18 -0.26214400000000000000e6
+141 1 21 28 -0.26214400000000000000e6
+141 1 25 28 -0.26214400000000000000e6
+141 2 6 8 0.26214400000000000000e6
+141 2 8 10 -0.26214400000000000000e6
+141 2 12 14 -0.26214400000000000000e6
+141 5 7 10 -0.26214400000000000000e6
+142 1 2 18 0.26214400000000000000e6
+142 1 4 19 0.26214400000000000000e6
+142 1 20 23 -0.26214400000000000000e6
+142 2 8 8 0.52428800000000000000e6
+143 1 2 19 0.26214400000000000000e6
+143 7 1 10 -0.26214400000000000000e6
+144 1 2 20 0.26214400000000000000e6
+144 5 7 10 -0.26214400000000000000e6
+145 1 2 22 0.26214400000000000000e6
+145 5 1 12 -0.26214400000000000000e6
+146 1 2 23 0.26214400000000000000e6
+146 1 3 22 -0.26214400000000000000e6
+147 1 2 24 0.26214400000000000000e6
+147 1 6 21 -0.26214400000000000000e6
+148 1 2 25 0.26214400000000000000e6
+148 5 2 13 -0.26214400000000000000e6
+149 1 1 24 0.26214400000000000000e6
+149 1 2 26 0.26214400000000000000e6
+149 1 30 33 -0.26214400000000000000e6
+149 2 9 15 0.26214400000000000000e6
+149 4 1 5 0.26214400000000000000e6
+149 7 13 14 0.26214400000000000000e6
+150 1 2 27 0.26214400000000000000e6
+150 1 11 22 -0.26214400000000000000e6
+151 1 2 28 0.26214400000000000000e6
+151 5 8 11 -0.26214400000000000000e6
+152 1 2 9 -0.26214400000000000000e6
+152 1 2 29 0.26214400000000000000e6
+152 5 1 4 -0.26214400000000000000e6
+152 6 1 3 -0.26214400000000000000e6
+153 1 2 30 0.26214400000000000000e6
+153 1 12 27 -0.26214400000000000000e6
+154 1 1 32 -0.26214400000000000000e6
+154 1 2 31 0.26214400000000000000e6
+155 1 2 9 -0.26214400000000000000e6
+155 1 2 32 0.26214400000000000000e6
+155 1 4 7 0.26214400000000000000e6
+155 1 4 19 -0.26214400000000000000e6
+155 1 23 34 -0.26214400000000000000e6
+155 2 5 5 -0.52428800000000000000e6
+155 2 12 12 0.52428800000000000000e6
+155 5 2 5 -0.52428800000000000000e6
+155 7 5 14 0.26214400000000000000e6
+156 1 2 34 0.26214400000000000000e6
+156 1 21 28 -0.26214400000000000000e6
+157 1 1 24 0.26214400000000000000e6
+157 1 2 21 0.52428800000000000000e6
+157 1 2 35 0.26214400000000000000e6
+157 1 3 22 -0.26214400000000000000e6
+157 1 12 27 0.26214400000000000000e6
+157 1 30 33 -0.26214400000000000000e6
+157 2 9 15 0.26214400000000000000e6
+157 4 1 5 0.26214400000000000000e6
+157 7 13 14 0.26214400000000000000e6
+158 1 3 3 0.26214400000000000000e6
+158 1 4 7 0.13107200000000000000e6
+158 1 20 23 -0.13107200000000000000e6
+158 1 23 34 -0.13107200000000000000e6
+158 2 1 3 0.26214400000000000000e6
+158 2 5 5 -0.26214400000000000000e6
+158 2 8 8 0.26214400000000000000e6
+158 2 12 12 0.26214400000000000000e6
+158 5 8 11 -0.26214400000000000000e6
+158 7 5 14 0.13107200000000000000e6
+159 1 3 5 0.26214400000000000000e6
+159 7 1 2 -0.26214400000000000000e6
+160 1 3 6 0.26214400000000000000e6
+160 5 2 5 -0.26214400000000000000e6
+161 1 3 7 0.26214400000000000000e6
+161 7 2 3 -0.26214400000000000000e6
+162 1 2 9 -0.26214400000000000000e6
+162 1 3 8 0.26214400000000000000e6
+163 1 3 9 0.26214400000000000000e6
+163 7 3 4 -0.26214400000000000000e6
+164 1 3 10 0.26214400000000000000e6
+164 7 4 5 -0.26214400000000000000e6
+165 1 3 11 0.26214400000000000000e6
+165 5 1 8 -0.26214400000000000000e6
+166 1 3 12 0.26214400000000000000e6
+166 1 4 11 -0.26214400000000000000e6
+167 1 3 13 0.26214400000000000000e6
+167 1 3 20 -0.26214400000000000000e6
+167 1 3 34 -0.26214400000000000000e6
+167 1 7 14 0.26214400000000000000e6
+167 5 1 8 -0.52428800000000000000e6
+168 1 3 14 0.26214400000000000000e6
+168 5 2 9 -0.26214400000000000000e6
+169 1 3 15 0.26214400000000000000e6
+169 1 6 13 -0.26214400000000000000e6
+170 1 3 16 0.26214400000000000000e6
+170 1 7 14 -0.26214400000000000000e6
+171 1 3 17 0.26214400000000000000e6
+171 1 4 19 0.26214400000000000000e6
+171 1 20 23 -0.26214400000000000000e6
+171 2 8 8 0.52428800000000000000e6
+172 1 3 19 0.26214400000000000000e6
+172 7 7 8 -0.26214400000000000000e6
+173 1 3 21 0.26214400000000000000e6
+173 5 1 12 -0.26214400000000000000e6
+174 1 3 23 0.26214400000000000000e6
+174 1 6 13 -0.26214400000000000000e6
+174 1 8 23 0.26214400000000000000e6
+174 2 2 8 -0.26214400000000000000e6
+174 5 1 8 -0.26214400000000000000e6
+174 5 1 12 -0.52428800000000000000e6
+174 5 12 15 -0.26214400000000000000e6
+175 1 3 24 0.26214400000000000000e6
+175 5 2 13 -0.26214400000000000000e6
+176 1 3 25 0.26214400000000000000e6
+176 1 7 22 -0.26214400000000000000e6
+177 1 3 26 0.26214400000000000000e6
+177 1 8 23 -0.26214400000000000000e6
+178 1 3 27 0.26214400000000000000e6
+178 5 8 11 -0.26214400000000000000e6
+179 1 3 28 0.26214400000000000000e6
+179 5 3 14 -0.26214400000000000000e6
+180 1 3 29 0.26214400000000000000e6
+180 5 9 12 -0.26214400000000000000e6
+181 1 3 30 0.26214400000000000000e6
+181 1 6 13 -0.26214400000000000000e6
+181 2 2 8 -0.26214400000000000000e6
+181 5 1 8 -0.26214400000000000000e6
+182 1 2 9 -0.26214400000000000000e6
+182 1 3 31 0.26214400000000000000e6
+182 1 4 7 0.26214400000000000000e6
+182 1 4 19 -0.26214400000000000000e6
+182 1 23 34 -0.26214400000000000000e6
+182 2 5 5 -0.52428800000000000000e6
+182 2 12 12 0.52428800000000000000e6
+182 5 2 5 -0.52428800000000000000e6
+182 7 5 14 0.26214400000000000000e6
+183 1 3 32 0.26214400000000000000e6
+183 1 4 31 -0.26214400000000000000e6
+184 1 3 33 0.26214400000000000000e6
+184 7 11 12 -0.26214400000000000000e6
+185 1 3 35 0.26214400000000000000e6
+185 5 12 15 -0.26214400000000000000e6
+186 1 4 4 0.26214400000000000000e6
+186 1 4 7 0.52428800000000000000e6
+186 1 13 20 -0.13107200000000000000e6
+186 1 15 30 0.26214400000000000000e6
+186 1 20 23 -0.52428800000000000000e6
+186 1 23 30 -0.26214400000000000000e6
+186 1 23 34 -0.52428800000000000000e6
+186 1 32 32 -0.26214400000000000000e6
+186 2 1 3 0.52428800000000000000e6
+186 2 5 5 -0.10485760000000000000e7
+186 2 8 8 0.10485760000000000000e7
+186 2 12 12 0.10485760000000000000e7
+186 3 4 5 -0.13107200000000000000e6
+186 5 1 4 0.26214400000000000000e6
+186 5 2 5 -0.65536000000000000000e6
+186 5 8 11 -0.52428800000000000000e6
+186 6 1 3 0.26214400000000000000e6
+186 7 1 10 -0.13107200000000000000e6
+186 7 5 6 -0.13107200000000000000e6
+186 7 5 14 0.52428800000000000000e6
+186 7 12 13 0.13107200000000000000e6
+186 7 14 15 0.13107200000000000000e6
+186 8 2 2 -0.26214400000000000000e6
+186 8 3 3 -0.26214400000000000000e6
+186 8 4 4 -0.26214400000000000000e6
+187 1 4 5 0.26214400000000000000e6
+187 5 2 5 -0.26214400000000000000e6
+188 1 4 6 0.26214400000000000000e6
+188 7 2 3 -0.26214400000000000000e6
+189 1 4 8 0.26214400000000000000e6
+189 7 3 4 -0.26214400000000000000e6
+190 1 2 9 -0.52428800000000000000e6
+190 1 4 9 0.26214400000000000000e6
+190 1 15 30 -0.26214400000000000000e6
+190 3 4 5 0.26214400000000000000e6
+190 5 1 4 -0.52428800000000000000e6
+190 5 2 5 0.26214400000000000000e6
+190 6 1 3 -0.52428800000000000000e6
+190 7 5 6 0.26214400000000000000e6
+190 7 14 15 -0.26214400000000000000e6
+190 8 2 2 0.52428800000000000000e6
+190 8 3 3 0.52428800000000000000e6
+191 1 2 9 0.26214400000000000000e6
+191 1 4 10 0.26214400000000000000e6
+191 2 5 5 0.52428800000000000000e6
+191 7 5 14 -0.26214400000000000000e6
+192 1 3 20 -0.26214400000000000000e6
+192 1 3 34 -0.26214400000000000000e6
+192 1 4 12 0.26214400000000000000e6
+192 1 7 14 0.26214400000000000000e6
+192 5 1 8 -0.52428800000000000000e6
+193 1 4 14 0.26214400000000000000e6
+193 1 6 13 -0.26214400000000000000e6
+194 1 4 16 0.26214400000000000000e6
+194 1 18 25 -0.26214400000000000000e6
+194 2 3 9 0.26214400000000000000e6
+194 5 2 9 0.26214400000000000000e6
+195 1 3 18 -0.26214400000000000000e6
+195 1 4 17 0.26214400000000000000e6
+196 1 4 18 0.26214400000000000000e6
+196 1 4 19 0.52428800000000000000e6
+196 1 13 20 -0.26214400000000000000e6
+196 1 15 30 0.26214400000000000000e6
+196 1 20 23 -0.52428800000000000000e6
+196 1 23 30 -0.26214400000000000000e6
+196 2 8 8 0.10485760000000000000e7
+196 7 1 10 -0.26214400000000000000e6
+196 8 4 4 -0.52428800000000000000e6
+197 1 4 11 0.52428800000000000000e6
+197 1 4 13 -0.26214400000000000000e6
+197 1 4 20 0.26214400000000000000e6
+197 1 13 32 0.26214400000000000000e6
+197 1 18 25 -0.26214400000000000000e6
+197 2 3 9 0.26214400000000000000e6
+197 5 2 9 0.26214400000000000000e6
+198 1 3 22 -0.26214400000000000000e6
+198 1 4 21 0.26214400000000000000e6
+199 1 4 22 0.26214400000000000000e6
+199 1 6 13 -0.26214400000000000000e6
+199 1 8 23 0.26214400000000000000e6
+199 2 2 8 -0.26214400000000000000e6
+199 5 1 8 -0.26214400000000000000e6
+199 5 1 12 -0.52428800000000000000e6
+199 5 12 15 -0.26214400000000000000e6
+200 1 4 24 0.26214400000000000000e6
+200 1 7 22 -0.26214400000000000000e6
+201 1 4 25 0.26214400000000000000e6
+201 7 3 12 -0.26214400000000000000e6
+202 1 3 22 -0.52428800000000000000e6
+202 1 4 23 0.26214400000000000000e6
+202 1 4 26 0.26214400000000000000e6
+202 1 4 35 -0.26214400000000000000e6
+202 1 13 28 -0.26214400000000000000e6
+203 1 4 27 0.26214400000000000000e6
+203 5 3 14 -0.26214400000000000000e6
+204 1 4 28 0.26214400000000000000e6
+204 1 20 23 -0.26214400000000000000e6
+204 1 23 34 -0.26214400000000000000e6
+204 2 1 3 0.52428800000000000000e6
+204 2 3 3 -0.52428800000000000000e6
+204 2 5 5 -0.52428800000000000000e6
+204 2 8 8 0.52428800000000000000e6
+204 2 12 12 0.52428800000000000000e6
+204 5 8 11 -0.52428800000000000000e6
+204 7 5 14 0.26214400000000000000e6
+205 1 2 9 -0.52428800000000000000e6
+205 1 4 29 0.26214400000000000000e6
+205 1 15 30 -0.26214400000000000000e6
+205 3 4 5 0.26214400000000000000e6
+205 5 1 4 -0.52428800000000000000e6
+205 6 1 3 -0.52428800000000000000e6
+205 7 5 6 0.26214400000000000000e6
+205 7 14 15 -0.26214400000000000000e6
+205 8 3 3 0.52428800000000000000e6
+206 1 4 30 0.26214400000000000000e6
+206 1 13 28 -0.26214400000000000000e6
+207 1 2 9 -0.52428800000000000000e6
+207 1 4 7 0.52428800000000000000e6
+207 1 4 19 -0.52428800000000000000e6
+207 1 4 32 0.26214400000000000000e6
+207 1 23 30 -0.26214400000000000000e6
+207 1 23 34 -0.52428800000000000000e6
+207 1 32 32 -0.52428800000000000000e6
+207 2 5 5 -0.10485760000000000000e7
+207 2 12 12 0.10485760000000000000e7
+207 5 2 5 -0.10485760000000000000e7
+207 7 5 14 0.52428800000000000000e6
+207 7 12 13 0.26214400000000000000e6
+208 1 2 9 0.26214400000000000000e6
+208 1 4 7 -0.26214400000000000000e6
+208 1 4 19 0.26214400000000000000e6
+208 1 4 33 0.26214400000000000000e6
+208 2 5 5 0.52428800000000000000e6
+208 5 2 5 0.52428800000000000000e6
+208 7 5 14 -0.26214400000000000000e6
+209 1 4 34 0.26214400000000000000e6
+209 1 13 32 -0.26214400000000000000e6
+210 1 1 8 -0.13107200000000000000e6
+210 1 5 5 0.26214400000000000000e6
+211 1 5 6 0.26214400000000000000e6
+211 3 5 6 -0.13107200000000000000e6
+211 3 5 10 0.13107200000000000000e6
+211 3 12 13 0.13107200000000000000e6
+211 7 3 4 -0.13107200000000000000e6
+212 1 2 9 -0.26214400000000000000e6
+212 1 5 7 0.26214400000000000000e6
+213 1 5 8 0.26214400000000000000e6
+213 3 1 6 -0.26214400000000000000e6
+214 1 5 9 0.26214400000000000000e6
+214 3 4 5 -0.26214400000000000000e6
+215 1 5 10 0.26214400000000000000e6
+215 1 9 10 0.26214400000000000000e6
+215 1 10 29 -0.26214400000000000000e6
+215 2 6 6 0.52428800000000000000e6
+216 1 5 11 0.26214400000000000000e6
+216 1 10 13 -0.26214400000000000000e6
+216 1 12 27 0.52428800000000000000e6
+216 1 13 28 -0.26214400000000000000e6
+216 1 15 18 0.26214400000000000000e6
+216 1 17 24 -0.26214400000000000000e6
+216 1 21 28 0.26214400000000000000e6
+216 1 25 28 0.26214400000000000000e6
+216 2 1 9 0.26214400000000000000e6
+216 2 6 8 -0.26214400000000000000e6
+216 2 8 10 0.26214400000000000000e6
+216 2 12 14 0.26214400000000000000e6
+216 5 7 10 0.26214400000000000000e6
+217 1 5 12 0.26214400000000000000e6
+217 3 2 7 -0.26214400000000000000e6
+218 1 5 13 0.26214400000000000000e6
+218 5 2 9 -0.26214400000000000000e6
+219 1 1 16 -0.26214400000000000000e6
+219 1 5 14 0.26214400000000000000e6
+220 1 5 15 0.26214400000000000000e6
+220 1 10 13 0.26214400000000000000e6
+220 1 12 27 -0.52428800000000000000e6
+220 1 13 28 0.26214400000000000000e6
+220 1 15 18 -0.26214400000000000000e6
+220 1 21 28 -0.26214400000000000000e6
+220 1 25 28 -0.26214400000000000000e6
+220 2 6 8 0.26214400000000000000e6
+220 2 8 10 -0.26214400000000000000e6
+220 2 12 14 -0.26214400000000000000e6
+220 5 7 10 -0.26214400000000000000e6
+221 1 5 16 0.26214400000000000000e6
+221 3 4 9 -0.26214400000000000000e6
+222 1 5 17 0.26214400000000000000e6
+222 2 4 6 -0.26214400000000000000e6
+222 2 4 10 0.26214400000000000000e6
+222 3 1 6 -0.26214400000000000000e6
+222 3 1 14 0.52428800000000000000e6
+222 3 5 6 -0.26214400000000000000e6
+222 3 5 10 0.26214400000000000000e6
+222 3 14 15 0.26214400000000000000e6
+222 5 9 12 -0.26214400000000000000e6
+223 1 5 18 0.26214400000000000000e6
+223 7 1 10 -0.26214400000000000000e6
+224 1 5 19 0.26214400000000000000e6
+224 1 10 29 -0.26214400000000000000e6
+224 1 11 26 0.52428800000000000000e6
+224 1 15 16 0.26214400000000000000e6
+224 1 16 35 0.26214400000000000000e6
+224 2 9 9 0.52428800000000000000e6
+224 7 5 14 -0.26214400000000000000e6
+225 1 1 24 -0.26214400000000000000e6
+225 1 5 21 0.26214400000000000000e6
+226 1 5 22 0.26214400000000000000e6
+226 1 6 21 -0.26214400000000000000e6
+227 1 5 23 0.26214400000000000000e6
+227 5 2 13 -0.26214400000000000000e6
+228 1 1 24 0.26214400000000000000e6
+228 1 5 25 0.26214400000000000000e6
+228 1 30 33 -0.26214400000000000000e6
+228 2 9 15 0.26214400000000000000e6
+228 4 1 5 0.26214400000000000000e6
+228 7 13 14 0.26214400000000000000e6
+229 1 5 26 0.26214400000000000000e6
+229 3 6 11 -0.26214400000000000000e6
+230 1 5 27 0.26214400000000000000e6
+230 3 1 14 -0.26214400000000000000e6
+231 1 2 9 -0.26214400000000000000e6
+231 1 5 28 0.26214400000000000000e6
+231 5 1 4 -0.26214400000000000000e6
+231 6 1 3 -0.26214400000000000000e6
+232 1 5 29 0.26214400000000000000e6
+232 1 11 26 -0.26214400000000000000e6
+233 1 5 30 0.26214400000000000000e6
+233 1 17 24 -0.26214400000000000000e6
+234 1 5 31 0.26214400000000000000e6
+234 2 11 13 0.26214400000000000000e6
+234 3 12 13 0.26214400000000000000e6
+234 3 14 15 -0.26214400000000000000e6
+235 1 2 33 -0.26214400000000000000e6
+235 1 5 32 0.26214400000000000000e6
+236 1 5 33 0.26214400000000000000e6
+236 1 8 31 -0.26214400000000000000e6
+237 1 5 34 0.26214400000000000000e6
+237 1 30 33 -0.26214400000000000000e6
+237 2 9 15 0.26214400000000000000e6
+237 7 13 14 0.26214400000000000000e6
+238 1 5 35 0.26214400000000000000e6
+238 1 24 31 -0.26214400000000000000e6
+239 1 2 9 -0.13107200000000000000e6
+239 1 6 6 0.26214400000000000000e6
+240 1 6 7 0.26214400000000000000e6
+240 7 3 4 -0.26214400000000000000e6
+241 1 6 8 0.26214400000000000000e6
+241 3 4 5 -0.26214400000000000000e6
+242 1 6 9 0.26214400000000000000e6
+242 7 4 5 -0.26214400000000000000e6
+243 1 6 10 0.26214400000000000000e6
+243 3 5 6 -0.26214400000000000000e6
+244 1 6 11 0.26214400000000000000e6
+244 3 2 7 -0.26214400000000000000e6
+245 1 6 12 0.26214400000000000000e6
+245 5 2 9 -0.26214400000000000000e6
+246 1 6 14 0.26214400000000000000e6
+246 1 10 13 0.26214400000000000000e6
+246 1 12 27 -0.52428800000000000000e6
+246 1 13 28 0.26214400000000000000e6
+246 1 15 18 -0.26214400000000000000e6
+246 1 21 28 -0.26214400000000000000e6
+246 1 25 28 -0.26214400000000000000e6
+246 2 6 8 0.26214400000000000000e6
+246 2 8 10 -0.26214400000000000000e6
+246 2 12 14 -0.26214400000000000000e6
+246 5 7 10 -0.26214400000000000000e6
+247 1 6 15 0.26214400000000000000e6
+247 1 7 14 -0.26214400000000000000e6
+248 1 6 16 0.26214400000000000000e6
+248 7 6 7 -0.26214400000000000000e6
+249 1 6 17 0.26214400000000000000e6
+249 7 1 10 -0.26214400000000000000e6
+250 1 6 18 0.26214400000000000000e6
+250 7 7 8 -0.26214400000000000000e6
+251 1 6 19 0.26214400000000000000e6
+251 3 5 10 -0.26214400000000000000e6
+252 1 6 20 0.26214400000000000000e6
+252 1 12 19 -0.26214400000000000000e6
+253 1 6 22 0.26214400000000000000e6
+253 5 2 13 -0.26214400000000000000e6
+254 1 6 23 0.26214400000000000000e6
+254 1 7 22 -0.26214400000000000000e6
+255 1 1 24 0.26214400000000000000e6
+255 1 6 24 0.26214400000000000000e6
+255 1 30 33 -0.26214400000000000000e6
+255 2 9 15 0.26214400000000000000e6
+255 4 1 5 0.26214400000000000000e6
+255 7 13 14 0.26214400000000000000e6
+256 1 6 25 0.26214400000000000000e6
+256 1 8 23 -0.26214400000000000000e6
+257 1 6 26 0.26214400000000000000e6
+257 7 4 13 -0.26214400000000000000e6
+258 1 2 9 -0.26214400000000000000e6
+258 1 6 27 0.26214400000000000000e6
+258 5 1 4 -0.26214400000000000000e6
+258 6 1 3 -0.26214400000000000000e6
+259 1 6 28 0.26214400000000000000e6
+259 5 9 12 -0.26214400000000000000e6
+260 1 6 29 0.26214400000000000000e6
+260 3 8 13 -0.26214400000000000000e6
+261 1 6 30 0.26214400000000000000e6
+261 5 10 13 -0.26214400000000000000e6
+262 1 2 33 -0.26214400000000000000e6
+262 1 6 31 0.26214400000000000000e6
+263 1 6 32 0.26214400000000000000e6
+263 7 11 12 -0.26214400000000000000e6
+264 1 6 33 0.26214400000000000000e6
+264 3 12 13 -0.26214400000000000000e6
+265 1 6 34 0.26214400000000000000e6
+265 1 22 29 -0.26214400000000000000e6
+266 1 6 21 0.52428800000000000000e6
+266 1 6 35 0.26214400000000000000e6
+266 1 7 22 -0.26214400000000000000e6
+266 5 10 13 0.26214400000000000000e6
+266 7 4 13 -0.26214400000000000000e6
+267 1 2 9 -0.26214400000000000000e6
+267 1 7 7 0.26214400000000000000e6
+267 1 15 30 -0.13107200000000000000e6
+267 3 4 5 0.13107200000000000000e6
+267 5 1 4 -0.26214400000000000000e6
+267 5 2 5 0.13107200000000000000e6
+267 6 1 3 -0.26214400000000000000e6
+267 7 5 6 0.13107200000000000000e6
+267 7 14 15 -0.13107200000000000000e6
+267 8 2 2 0.26214400000000000000e6
+267 8 3 3 0.26214400000000000000e6
+268 1 7 8 0.26214400000000000000e6
+268 7 4 5 -0.26214400000000000000e6
+269 1 2 9 0.26214400000000000000e6
+269 1 7 9 0.26214400000000000000e6
+269 2 5 5 0.52428800000000000000e6
+269 7 5 14 -0.26214400000000000000e6
+270 1 7 10 0.26214400000000000000e6
+270 7 5 6 -0.26214400000000000000e6
+271 1 7 11 0.26214400000000000000e6
+271 5 2 9 -0.26214400000000000000e6
+272 1 6 13 -0.26214400000000000000e6
+272 1 7 12 0.26214400000000000000e6
+273 1 4 15 -0.26214400000000000000e6
+273 1 7 13 0.26214400000000000000e6
+274 1 7 15 0.26214400000000000000e6
+274 1 18 25 -0.26214400000000000000e6
+274 2 3 9 0.26214400000000000000e6
+274 5 2 9 0.26214400000000000000e6
+275 1 7 16 0.26214400000000000000e6
+275 1 10 13 -0.26214400000000000000e6
+276 1 7 17 0.26214400000000000000e6
+276 7 7 8 -0.26214400000000000000e6
+277 1 4 19 -0.26214400000000000000e6
+277 1 7 18 0.26214400000000000000e6
+278 1 7 19 0.26214400000000000000e6
+278 1 15 30 -0.26214400000000000000e6
+278 7 1 10 0.26214400000000000000e6
+278 8 4 4 0.52428800000000000000e6
+279 1 7 20 0.26214400000000000000e6
+279 1 15 18 -0.26214400000000000000e6
+280 1 7 21 0.26214400000000000000e6
+280 5 2 13 -0.26214400000000000000e6
+281 1 7 23 0.26214400000000000000e6
+281 7 3 12 -0.26214400000000000000e6
+282 1 7 24 0.26214400000000000000e6
+282 1 8 23 -0.26214400000000000000e6
+283 1 3 22 -0.52428800000000000000e6
+283 1 4 23 0.26214400000000000000e6
+283 1 4 35 -0.26214400000000000000e6
+283 1 7 25 0.26214400000000000000e6
+283 1 13 28 -0.26214400000000000000e6
+284 1 1 24 -0.26214400000000000000e6
+284 1 7 26 0.26214400000000000000e6
+284 1 30 33 0.26214400000000000000e6
+284 2 6 12 0.26214400000000000000e6
+284 2 9 15 -0.26214400000000000000e6
+284 4 1 5 -0.26214400000000000000e6
+284 7 13 14 -0.52428800000000000000e6
+285 1 7 27 0.26214400000000000000e6
+285 5 9 12 -0.26214400000000000000e6
+286 1 2 9 -0.52428800000000000000e6
+286 1 7 28 0.26214400000000000000e6
+286 1 15 30 -0.26214400000000000000e6
+286 3 4 5 0.26214400000000000000e6
+286 5 1 4 -0.52428800000000000000e6
+286 6 1 3 -0.52428800000000000000e6
+286 7 5 6 0.26214400000000000000e6
+286 7 14 15 -0.26214400000000000000e6
+286 8 3 3 0.52428800000000000000e6
+287 1 7 29 0.26214400000000000000e6
+287 7 5 14 -0.26214400000000000000e6
+288 1 7 30 0.26214400000000000000e6
+288 1 18 25 -0.26214400000000000000e6
+289 1 7 31 0.26214400000000000000e6
+289 7 11 12 -0.26214400000000000000e6
+290 1 2 9 0.26214400000000000000e6
+290 1 4 7 -0.26214400000000000000e6
+290 1 4 19 0.26214400000000000000e6
+290 1 7 32 0.26214400000000000000e6
+290 2 5 5 0.52428800000000000000e6
+290 5 2 5 0.52428800000000000000e6
+290 7 5 14 -0.26214400000000000000e6
+291 1 7 33 0.26214400000000000000e6
+291 7 12 13 -0.26214400000000000000e6
+292 1 7 34 0.26214400000000000000e6
+292 1 25 28 -0.26214400000000000000e6
+293 1 7 35 0.26214400000000000000e6
+293 1 25 32 -0.26214400000000000000e6
+294 1 8 8 0.26214400000000000000e6
+294 1 9 10 0.13107200000000000000e6
+294 1 10 29 -0.13107200000000000000e6
+294 2 6 6 0.26214400000000000000e6
+295 1 8 9 0.26214400000000000000e6
+295 3 5 6 -0.26214400000000000000e6
+296 1 8 10 0.26214400000000000000e6
+296 1 10 17 -0.26214400000000000000e6
+296 3 1 6 -0.52428800000000000000e6
+296 3 6 15 -0.26214400000000000000e6
+296 7 4 5 0.26214400000000000000e6
+297 1 1 16 -0.26214400000000000000e6
+297 1 8 11 0.26214400000000000000e6
+298 1 8 12 0.26214400000000000000e6
+298 1 10 13 0.26214400000000000000e6
+298 1 12 27 -0.52428800000000000000e6
+298 1 13 28 0.26214400000000000000e6
+298 1 15 18 -0.26214400000000000000e6
+298 1 21 28 -0.26214400000000000000e6
+298 1 25 28 -0.26214400000000000000e6
+298 2 6 8 0.26214400000000000000e6
+298 2 8 10 -0.26214400000000000000e6
+298 2 12 14 -0.26214400000000000000e6
+298 5 7 10 -0.26214400000000000000e6
+299 1 7 14 -0.26214400000000000000e6
+299 1 8 13 0.26214400000000000000e6
+300 1 8 14 0.26214400000000000000e6
+300 3 4 9 -0.26214400000000000000e6
+301 1 8 15 0.26214400000000000000e6
+301 7 6 7 -0.26214400000000000000e6
+302 1 1 16 -0.52428800000000000000e6
+302 1 7 14 0.26214400000000000000e6
+302 1 8 16 0.26214400000000000000e6
+302 1 16 31 -0.26214400000000000000e6
+302 3 9 10 -0.26214400000000000000e6
+303 1 8 17 0.26214400000000000000e6
+303 1 10 29 -0.26214400000000000000e6
+303 1 11 26 0.52428800000000000000e6
+303 1 15 16 0.26214400000000000000e6
+303 1 16 35 0.26214400000000000000e6
+303 2 9 9 0.52428800000000000000e6
+303 7 5 14 -0.26214400000000000000e6
+304 1 8 18 0.26214400000000000000e6
+304 3 5 10 -0.26214400000000000000e6
+305 1 8 19 0.26214400000000000000e6
+305 1 10 17 -0.26214400000000000000e6
+306 1 8 20 0.26214400000000000000e6
+306 3 9 10 -0.26214400000000000000e6
+307 1 5 24 -0.26214400000000000000e6
+307 1 8 21 0.26214400000000000000e6
+308 1 1 24 0.26214400000000000000e6
+308 1 8 22 0.26214400000000000000e6
+308 1 30 33 -0.26214400000000000000e6
+308 2 9 15 0.26214400000000000000e6
+308 4 1 5 0.26214400000000000000e6
+308 7 13 14 0.26214400000000000000e6
+309 1 8 24 0.26214400000000000000e6
+309 3 6 11 -0.26214400000000000000e6
+310 1 8 25 0.26214400000000000000e6
+310 7 4 13 -0.26214400000000000000e6
+311 1 5 24 -0.52428800000000000000e6
+311 1 8 23 0.26214400000000000000e6
+311 1 8 26 0.26214400000000000000e6
+311 1 8 35 -0.26214400000000000000e6
+311 1 14 29 -0.26214400000000000000e6
+312 1 8 27 0.26214400000000000000e6
+312 1 11 26 -0.26214400000000000000e6
+313 1 8 28 0.26214400000000000000e6
+313 3 8 13 -0.26214400000000000000e6
+314 1 8 29 0.26214400000000000000e6
+314 2 4 6 -0.26214400000000000000e6
+314 3 1 6 -0.26214400000000000000e6
+314 3 5 6 -0.26214400000000000000e6
+315 1 8 30 0.26214400000000000000e6
+315 1 14 29 -0.26214400000000000000e6
+316 1 8 32 0.26214400000000000000e6
+316 3 12 13 -0.26214400000000000000e6
+317 1 8 33 0.26214400000000000000e6
+317 3 6 15 -0.26214400000000000000e6
+318 1 8 34 0.26214400000000000000e6
+318 1 16 31 -0.26214400000000000000e6
+319 1 9 9 0.26214400000000000000e6
+319 7 5 6 -0.13107200000000000000e6
+320 1 9 11 0.26214400000000000000e6
+320 1 10 13 0.26214400000000000000e6
+320 1 12 27 -0.52428800000000000000e6
+320 1 13 28 0.26214400000000000000e6
+320 1 15 18 -0.26214400000000000000e6
+320 1 21 28 -0.26214400000000000000e6
+320 1 25 28 -0.26214400000000000000e6
+320 2 6 8 0.26214400000000000000e6
+320 2 8 10 -0.26214400000000000000e6
+320 2 12 14 -0.26214400000000000000e6
+320 5 7 10 -0.26214400000000000000e6
+321 1 7 14 -0.26214400000000000000e6
+321 1 9 12 0.26214400000000000000e6
+322 1 9 13 0.26214400000000000000e6
+322 1 18 25 -0.26214400000000000000e6
+322 2 3 9 0.26214400000000000000e6
+322 5 2 9 0.26214400000000000000e6
+323 1 9 14 0.26214400000000000000e6
+323 7 6 7 -0.26214400000000000000e6
+324 1 9 15 0.26214400000000000000e6
+324 1 10 13 -0.26214400000000000000e6
+325 1 9 17 0.26214400000000000000e6
+325 3 5 10 -0.26214400000000000000e6
+326 1 9 18 0.26214400000000000000e6
+326 1 15 30 -0.26214400000000000000e6
+326 7 1 10 0.26214400000000000000e6
+326 8 4 4 0.52428800000000000000e6
+327 1 9 19 0.26214400000000000000e6
+327 1 15 16 -0.26214400000000000000e6
+328 1 9 20 0.26214400000000000000e6
+328 7 9 10 -0.26214400000000000000e6
+329 1 1 24 0.26214400000000000000e6
+329 1 9 21 0.26214400000000000000e6
+329 1 30 33 -0.26214400000000000000e6
+329 2 9 15 0.26214400000000000000e6
+329 4 1 5 0.26214400000000000000e6
+329 7 13 14 0.26214400000000000000e6
+330 1 8 23 -0.26214400000000000000e6
+330 1 9 22 0.26214400000000000000e6
+331 1 3 22 -0.52428800000000000000e6
+331 1 4 23 0.26214400000000000000e6
+331 1 4 35 -0.26214400000000000000e6
+331 1 9 23 0.26214400000000000000e6
+331 1 13 28 -0.26214400000000000000e6
+332 1 9 24 0.26214400000000000000e6
+332 7 4 13 -0.26214400000000000000e6
+333 1 1 24 -0.26214400000000000000e6
+333 1 9 25 0.26214400000000000000e6
+333 1 30 33 0.26214400000000000000e6
+333 2 6 12 0.26214400000000000000e6
+333 2 9 15 -0.26214400000000000000e6
+333 4 1 5 -0.26214400000000000000e6
+333 7 13 14 -0.52428800000000000000e6
+334 1 9 26 0.26214400000000000000e6
+334 1 10 25 -0.26214400000000000000e6
+335 1 9 27 0.26214400000000000000e6
+335 3 8 13 -0.26214400000000000000e6
+336 1 9 28 0.26214400000000000000e6
+336 7 5 14 -0.26214400000000000000e6
+337 1 9 29 0.26214400000000000000e6
+337 3 4 5 -0.26214400000000000000e6
+337 7 5 6 -0.26214400000000000000e6
+337 8 3 3 -0.52428800000000000000e6
+338 1 9 30 0.26214400000000000000e6
+338 1 12 27 -0.52428800000000000000e6
+338 1 13 28 0.26214400000000000000e6
+338 1 15 18 -0.26214400000000000000e6
+338 1 21 28 -0.26214400000000000000e6
+338 1 25 28 -0.26214400000000000000e6
+338 2 8 10 -0.26214400000000000000e6
+338 2 12 14 -0.26214400000000000000e6
+338 5 7 10 -0.26214400000000000000e6
+339 1 9 31 0.26214400000000000000e6
+339 3 12 13 -0.26214400000000000000e6
+340 1 9 32 0.26214400000000000000e6
+340 7 12 13 -0.26214400000000000000e6
+341 1 9 33 0.26214400000000000000e6
+341 7 6 15 -0.26214400000000000000e6
+342 1 9 34 0.26214400000000000000e6
+342 7 13 14 -0.26214400000000000000e6
+343 1 1 24 0.52428800000000000000e6
+343 1 2 21 0.10485760000000000000e7
+343 1 3 22 -0.52428800000000000000e6
+343 1 4 35 0.26214400000000000000e6
+343 1 9 35 0.26214400000000000000e6
+343 1 12 27 0.52428800000000000000e6
+343 1 21 28 -0.26214400000000000000e6
+343 1 25 28 -0.26214400000000000000e6
+343 1 30 33 -0.52428800000000000000e6
+343 1 32 35 -0.26214400000000000000e6
+343 2 9 15 0.52428800000000000000e6
+343 2 12 14 -0.26214400000000000000e6
+343 4 1 5 0.52428800000000000000e6
+343 7 13 14 0.52428800000000000000e6
+344 1 9 10 0.26214400000000000000e6
+344 1 10 10 0.26214400000000000000e6
+344 1 10 19 -0.13107200000000000000e6
+344 1 10 29 -0.26214400000000000000e6
+344 1 10 33 -0.13107200000000000000e6
+344 2 6 6 0.52428800000000000000e6
+344 7 5 6 0.13107200000000000000e6
+345 1 10 11 0.26214400000000000000e6
+345 3 4 9 -0.26214400000000000000e6
+346 1 10 12 0.26214400000000000000e6
+346 7 6 7 -0.26214400000000000000e6
+347 1 1 16 -0.52428800000000000000e6
+347 1 7 14 0.26214400000000000000e6
+347 1 10 14 0.26214400000000000000e6
+347 1 16 31 -0.26214400000000000000e6
+347 3 9 10 -0.26214400000000000000e6
+348 1 9 16 -0.26214400000000000000e6
+348 1 10 15 0.26214400000000000000e6
+349 1 10 13 0.26214400000000000000e6
+349 1 10 16 0.26214400000000000000e6
+349 1 16 19 -0.26214400000000000000e6
+349 1 26 29 -0.26214400000000000000e6
+349 3 4 9 -0.52428800000000000000e6
+350 1 10 18 0.26214400000000000000e6
+350 1 15 16 -0.26214400000000000000e6
+351 1 10 20 0.26214400000000000000e6
+351 1 16 19 -0.26214400000000000000e6
+352 1 10 21 0.26214400000000000000e6
+352 3 6 11 -0.26214400000000000000e6
+353 1 10 22 0.26214400000000000000e6
+353 7 4 13 -0.26214400000000000000e6
+354 1 1 24 -0.26214400000000000000e6
+354 1 10 23 0.26214400000000000000e6
+354 1 30 33 0.26214400000000000000e6
+354 2 6 12 0.26214400000000000000e6
+354 2 9 15 -0.26214400000000000000e6
+354 4 1 5 -0.26214400000000000000e6
+354 7 13 14 -0.52428800000000000000e6
+355 1 5 24 -0.52428800000000000000e6
+355 1 8 23 0.26214400000000000000e6
+355 1 8 35 -0.26214400000000000000e6
+355 1 10 24 0.26214400000000000000e6
+355 1 14 29 -0.26214400000000000000e6
+356 1 1 24 0.26214400000000000000e6
+356 1 10 26 0.26214400000000000000e6
+356 1 19 26 -0.26214400000000000000e6
+356 1 26 33 -0.26214400000000000000e6
+356 1 30 33 -0.26214400000000000000e6
+356 2 6 12 -0.26214400000000000000e6
+356 2 9 15 0.26214400000000000000e6
+356 3 6 11 -0.52428800000000000000e6
+356 4 1 5 0.26214400000000000000e6
+356 7 13 14 0.52428800000000000000e6
+357 1 10 27 0.26214400000000000000e6
+357 2 4 6 -0.26214400000000000000e6
+357 3 1 6 -0.26214400000000000000e6
+357 3 5 6 -0.26214400000000000000e6
+358 1 10 28 0.26214400000000000000e6
+358 3 4 5 -0.26214400000000000000e6
+358 7 5 6 -0.26214400000000000000e6
+358 8 3 3 -0.52428800000000000000e6
+359 1 10 30 0.26214400000000000000e6
+359 1 19 26 -0.26214400000000000000e6
+360 1 10 31 0.26214400000000000000e6
+360 3 6 15 -0.26214400000000000000e6
+361 1 10 32 0.26214400000000000000e6
+361 7 6 15 -0.26214400000000000000e6
+362 1 10 34 0.26214400000000000000e6
+362 1 26 29 -0.26214400000000000000e6
+363 1 10 35 0.26214400000000000000e6
+363 1 26 33 -0.26214400000000000000e6
+364 1 11 11 0.26214400000000000000e6
+364 1 11 30 -0.13107200000000000000e6
+364 2 7 7 0.26214400000000000000e6
+364 7 1 10 0.13107200000000000000e6
+365 1 2 17 -0.26214400000000000000e6
+365 1 11 12 0.26214400000000000000e6
+366 1 4 19 0.26214400000000000000e6
+366 1 11 13 0.26214400000000000000e6
+366 1 20 23 -0.26214400000000000000e6
+366 2 8 8 0.52428800000000000000e6
+367 1 11 14 0.26214400000000000000e6
+367 2 4 6 -0.26214400000000000000e6
+367 2 4 10 0.26214400000000000000e6
+367 3 1 6 -0.26214400000000000000e6
+367 3 1 14 0.52428800000000000000e6
+367 3 5 6 -0.26214400000000000000e6
+367 3 5 10 0.26214400000000000000e6
+367 3 14 15 0.26214400000000000000e6
+367 5 9 12 -0.26214400000000000000e6
+368 1 11 15 0.26214400000000000000e6
+368 7 1 10 -0.26214400000000000000e6
+369 1 10 29 -0.26214400000000000000e6
+369 1 11 16 0.26214400000000000000e6
+369 1 11 26 0.52428800000000000000e6
+369 1 15 16 0.26214400000000000000e6
+369 1 16 35 0.26214400000000000000e6
+369 2 9 9 0.52428800000000000000e6
+369 7 5 14 -0.26214400000000000000e6
+370 1 1 20 -0.26214400000000000000e6
+370 1 11 17 0.26214400000000000000e6
+371 1 11 18 0.26214400000000000000e6
+371 5 7 10 -0.26214400000000000000e6
+372 1 5 20 -0.26214400000000000000e6
+372 1 11 19 0.26214400000000000000e6
+373 1 10 29 -0.26214400000000000000e6
+373 1 11 20 0.26214400000000000000e6
+373 1 11 26 0.52428800000000000000e6
+373 1 11 30 0.52428800000000000000e6
+373 1 16 35 0.26214400000000000000e6
+373 1 18 19 0.26214400000000000000e6
+373 1 20 23 -0.26214400000000000000e6
+373 1 20 35 0.26214400000000000000e6
+373 2 10 10 0.52428800000000000000e6
+373 7 5 14 -0.26214400000000000000e6
+374 1 1 8 -0.13107200000000000000e6
+374 1 2 33 -0.13107200000000000000e6
+374 1 11 21 0.26214400000000000000e6
+374 1 11 30 0.13107200000000000000e6
+374 1 16 35 0.65536000000000000000e5
+374 1 20 35 -0.65536000000000000000e5
+374 1 23 34 0.65536000000000000000e5
+374 1 34 35 -0.65536000000000000000e5
+374 2 1 1 -0.52428800000000000000e6
+374 2 1 3 0.13107200000000000000e6
+374 2 1 15 -0.13107200000000000000e6
+374 2 7 7 -0.26214400000000000000e6
+374 5 1 4 -0.26214400000000000000e6
+374 5 2 5 0.13107200000000000000e6
+374 5 8 11 -0.13107200000000000000e6
+374 7 1 10 -0.13107200000000000000e6
+375 1 11 23 0.26214400000000000000e6
+375 5 8 11 -0.26214400000000000000e6
+376 1 11 24 0.26214400000000000000e6
+376 3 1 14 -0.26214400000000000000e6
+377 1 2 9 -0.26214400000000000000e6
+377 1 11 25 0.26214400000000000000e6
+377 5 1 4 -0.26214400000000000000e6
+377 6 1 3 -0.26214400000000000000e6
+378 1 1 34 0.52428800000000000000e6
+378 1 5 24 -0.26214400000000000000e6
+378 1 7 22 -0.26214400000000000000e6
+378 1 11 27 0.26214400000000000000e6
+378 1 31 34 0.26214400000000000000e6
+378 2 1 11 -0.52428800000000000000e6
+378 2 11 15 -0.26214400000000000000e6
+378 5 1 12 -0.26214400000000000000e6
+378 5 10 13 0.26214400000000000000e6
+378 7 4 13 -0.26214400000000000000e6
+379 1 11 28 0.26214400000000000000e6
+379 1 12 27 -0.26214400000000000000e6
+380 1 11 29 0.26214400000000000000e6
+380 1 17 24 -0.26214400000000000000e6
+381 1 1 34 -0.26214400000000000000e6
+381 1 11 31 0.26214400000000000000e6
+382 1 11 32 0.26214400000000000000e6
+382 1 21 28 -0.26214400000000000000e6
+383 1 11 33 0.26214400000000000000e6
+383 1 30 33 -0.26214400000000000000e6
+383 2 9 15 0.26214400000000000000e6
+383 7 13 14 0.26214400000000000000e6
+384 1 11 35 0.26214400000000000000e6
+384 1 16 35 -0.13107200000000000000e6
+384 1 20 35 0.13107200000000000000e6
+384 1 23 34 -0.13107200000000000000e6
+384 1 34 35 0.13107200000000000000e6
+385 1 4 19 0.13107200000000000000e6
+385 1 12 12 0.26214400000000000000e6
+385 1 20 23 -0.13107200000000000000e6
+385 2 8 8 0.26214400000000000000e6
+386 1 3 18 -0.26214400000000000000e6
+386 1 12 13 0.26214400000000000000e6
+387 1 12 14 0.26214400000000000000e6
+387 7 1 10 -0.26214400000000000000e6
+388 1 12 15 0.26214400000000000000e6
+388 7 7 8 -0.26214400000000000000e6
+389 1 12 16 0.26214400000000000000e6
+389 3 5 10 -0.26214400000000000000e6
+390 1 12 17 0.26214400000000000000e6
+390 5 7 10 -0.26214400000000000000e6
+391 1 3 20 -0.26214400000000000000e6
+391 1 12 18 0.26214400000000000000e6
+392 1 2 17 0.52428800000000000000e6
+392 1 3 18 -0.26214400000000000000e6
+392 1 12 20 0.26214400000000000000e6
+392 1 17 32 0.26214400000000000000e6
+392 3 5 10 -0.26214400000000000000e6
+393 1 11 22 -0.26214400000000000000e6
+393 1 12 21 0.26214400000000000000e6
+394 1 12 22 0.26214400000000000000e6
+394 5 8 11 -0.26214400000000000000e6
+395 1 12 23 0.26214400000000000000e6
+395 5 3 14 -0.26214400000000000000e6
+396 1 2 9 -0.26214400000000000000e6
+396 1 12 24 0.26214400000000000000e6
+396 5 1 4 -0.26214400000000000000e6
+396 6 1 3 -0.26214400000000000000e6
+397 1 12 25 0.26214400000000000000e6
+397 5 9 12 -0.26214400000000000000e6
+398 1 12 26 0.26214400000000000000e6
+398 3 8 13 -0.26214400000000000000e6
+399 1 6 13 -0.26214400000000000000e6
+399 1 12 28 0.26214400000000000000e6
+399 2 2 8 -0.26214400000000000000e6
+399 5 1 8 -0.26214400000000000000e6
+400 1 12 29 0.26214400000000000000e6
+400 5 10 13 -0.26214400000000000000e6
+401 1 12 30 0.26214400000000000000e6
+401 1 17 28 -0.26214400000000000000e6
+402 1 12 31 0.26214400000000000000e6
+402 1 21 28 -0.26214400000000000000e6
+403 1 3 34 -0.26214400000000000000e6
+403 1 12 32 0.26214400000000000000e6
+404 1 12 33 0.26214400000000000000e6
+404 1 22 29 -0.26214400000000000000e6
+405 1 12 34 0.26214400000000000000e6
+405 1 17 32 -0.26214400000000000000e6
+406 1 4 19 0.26214400000000000000e6
+406 1 13 13 0.26214400000000000000e6
+406 1 13 20 -0.13107200000000000000e6
+406 1 15 30 0.13107200000000000000e6
+406 1 20 23 -0.26214400000000000000e6
+406 1 23 30 -0.13107200000000000000e6
+406 2 8 8 0.52428800000000000000e6
+406 7 1 10 -0.13107200000000000000e6
+406 8 4 4 -0.26214400000000000000e6
+407 1 13 14 0.26214400000000000000e6
+407 7 7 8 -0.26214400000000000000e6
+408 1 4 19 -0.26214400000000000000e6
+408 1 13 15 0.26214400000000000000e6
+409 1 13 16 0.26214400000000000000e6
+409 1 15 30 -0.26214400000000000000e6
+409 7 1 10 0.26214400000000000000e6
+409 8 4 4 0.52428800000000000000e6
+410 1 3 20 -0.26214400000000000000e6
+410 1 13 17 0.26214400000000000000e6
+411 1 4 11 0.52428800000000000000e6
+411 1 4 13 -0.26214400000000000000e6
+411 1 13 18 0.26214400000000000000e6
+411 1 13 32 0.26214400000000000000e6
+411 1 18 25 -0.26214400000000000000e6
+411 2 3 9 0.26214400000000000000e6
+411 5 2 9 0.26214400000000000000e6
+412 1 13 19 0.26214400000000000000e6
+412 1 15 18 -0.26214400000000000000e6
+413 1 13 21 0.26214400000000000000e6
+413 5 8 11 -0.26214400000000000000e6
+414 1 13 22 0.26214400000000000000e6
+414 5 3 14 -0.26214400000000000000e6
+415 1 13 23 0.26214400000000000000e6
+415 1 20 23 -0.26214400000000000000e6
+415 1 23 34 -0.26214400000000000000e6
+415 2 1 3 0.52428800000000000000e6
+415 2 3 3 -0.52428800000000000000e6
+415 2 5 5 -0.52428800000000000000e6
+415 2 8 8 0.52428800000000000000e6
+415 2 12 12 0.52428800000000000000e6
+415 5 8 11 -0.52428800000000000000e6
+415 7 5 14 0.26214400000000000000e6
+416 1 13 24 0.26214400000000000000e6
+416 5 9 12 -0.26214400000000000000e6
+417 1 2 9 -0.52428800000000000000e6
+417 1 13 25 0.26214400000000000000e6
+417 1 15 30 -0.26214400000000000000e6
+417 3 4 5 0.26214400000000000000e6
+417 5 1 4 -0.52428800000000000000e6
+417 6 1 3 -0.52428800000000000000e6
+417 7 5 6 0.26214400000000000000e6
+417 7 14 15 -0.26214400000000000000e6
+417 8 3 3 0.52428800000000000000e6
+418 1 13 26 0.26214400000000000000e6
+418 7 5 14 -0.26214400000000000000e6
+419 1 6 13 -0.26214400000000000000e6
+419 1 13 27 0.26214400000000000000e6
+419 2 2 8 -0.26214400000000000000e6
+419 5 1 8 -0.26214400000000000000e6
+420 1 13 29 0.26214400000000000000e6
+420 1 18 25 -0.26214400000000000000e6
+421 1 13 30 0.26214400000000000000e6
+421 1 20 23 -0.26214400000000000000e6
+422 1 3 34 -0.26214400000000000000e6
+422 1 13 31 0.26214400000000000000e6
+423 1 13 33 0.26214400000000000000e6
+423 1 25 28 -0.26214400000000000000e6
+424 1 13 34 0.26214400000000000000e6
+424 1 23 30 -0.26214400000000000000e6
+425 1 13 35 0.26214400000000000000e6
+425 1 23 34 -0.26214400000000000000e6
+426 1 10 29 -0.13107200000000000000e6
+426 1 11 26 0.26214400000000000000e6
+426 1 14 14 0.26214400000000000000e6
+426 1 15 16 0.13107200000000000000e6
+426 1 16 35 0.13107200000000000000e6
+426 2 9 9 0.26214400000000000000e6
+426 7 5 14 -0.13107200000000000000e6
+427 1 14 15 0.26214400000000000000e6
+427 3 5 10 -0.26214400000000000000e6
+428 1 10 17 -0.26214400000000000000e6
+428 1 14 16 0.26214400000000000000e6
+429 1 5 20 -0.26214400000000000000e6
+429 1 14 17 0.26214400000000000000e6
+430 1 12 19 -0.26214400000000000000e6
+430 1 14 18 0.26214400000000000000e6
+431 1 14 19 0.26214400000000000000e6
+431 3 9 10 -0.26214400000000000000e6
+432 1 10 17 -0.26214400000000000000e6
+432 1 14 20 0.26214400000000000000e6
+432 2 4 6 0.52428800000000000000e6
+432 2 4 10 -0.52428800000000000000e6
+432 3 1 6 0.52428800000000000000e6
+432 3 1 14 -0.10485760000000000000e7
+432 3 5 6 0.52428800000000000000e6
+432 3 5 10 -0.52428800000000000000e6
+432 3 10 15 0.26214400000000000000e6
+432 3 14 15 -0.52428800000000000000e6
+432 5 9 12 0.52428800000000000000e6
+432 7 7 8 -0.26214400000000000000e6
+433 1 14 21 0.26214400000000000000e6
+433 3 1 14 -0.26214400000000000000e6
+434 1 2 9 -0.26214400000000000000e6
+434 1 14 22 0.26214400000000000000e6
+434 5 1 4 -0.26214400000000000000e6
+434 6 1 3 -0.26214400000000000000e6
+435 1 14 23 0.26214400000000000000e6
+435 5 9 12 -0.26214400000000000000e6
+436 1 11 26 -0.26214400000000000000e6
+436 1 14 24 0.26214400000000000000e6
+437 1 14 25 0.26214400000000000000e6
+437 3 8 13 -0.26214400000000000000e6
+438 1 14 26 0.26214400000000000000e6
+438 2 4 6 -0.26214400000000000000e6
+438 3 1 6 -0.26214400000000000000e6
+438 3 5 6 -0.26214400000000000000e6
+439 1 14 27 0.26214400000000000000e6
+439 1 17 24 -0.26214400000000000000e6
+440 1 14 28 0.26214400000000000000e6
+440 5 10 13 -0.26214400000000000000e6
+441 1 14 30 0.26214400000000000000e6
+441 2 4 6 -0.26214400000000000000e6
+441 3 1 6 -0.26214400000000000000e6
+441 3 1 14 0.52428800000000000000e6
+441 3 5 6 -0.26214400000000000000e6
+441 3 14 15 0.26214400000000000000e6
+441 5 9 12 -0.26214400000000000000e6
+442 1 14 31 0.26214400000000000000e6
+442 1 30 33 -0.26214400000000000000e6
+442 2 9 15 0.26214400000000000000e6
+442 7 13 14 0.26214400000000000000e6
+443 1 14 32 0.26214400000000000000e6
+443 1 22 29 -0.26214400000000000000e6
+444 1 14 33 0.26214400000000000000e6
+444 1 16 31 -0.26214400000000000000e6
+445 1 14 34 0.26214400000000000000e6
+445 3 10 15 -0.26214400000000000000e6
+446 1 14 35 0.26214400000000000000e6
+446 3 14 15 -0.26214400000000000000e6
+447 1 15 15 0.26214400000000000000e6
+447 1 15 30 -0.13107200000000000000e6
+447 7 1 10 0.13107200000000000000e6
+447 8 4 4 0.26214400000000000000e6
+448 1 12 19 -0.26214400000000000000e6
+448 1 15 17 0.26214400000000000000e6
+449 1 15 19 0.26214400000000000000e6
+449 7 9 10 -0.26214400000000000000e6
+450 1 15 20 0.26214400000000000000e6
+450 1 18 19 -0.26214400000000000000e6
+451 1 2 9 -0.26214400000000000000e6
+451 1 15 21 0.26214400000000000000e6
+451 5 1 4 -0.26214400000000000000e6
+451 6 1 3 -0.26214400000000000000e6
+452 1 15 22 0.26214400000000000000e6
+452 5 9 12 -0.26214400000000000000e6
+453 1 2 9 -0.52428800000000000000e6
+453 1 15 23 0.26214400000000000000e6
+453 1 15 30 -0.26214400000000000000e6
+453 3 4 5 0.26214400000000000000e6
+453 5 1 4 -0.52428800000000000000e6
+453 6 1 3 -0.52428800000000000000e6
+453 7 5 6 0.26214400000000000000e6
+453 7 14 15 -0.26214400000000000000e6
+453 8 3 3 0.52428800000000000000e6
+454 1 15 24 0.26214400000000000000e6
+454 3 8 13 -0.26214400000000000000e6
+455 1 15 25 0.26214400000000000000e6
+455 7 5 14 -0.26214400000000000000e6
+456 1 15 26 0.26214400000000000000e6
+456 3 4 5 -0.26214400000000000000e6
+456 7 5 6 -0.26214400000000000000e6
+456 8 3 3 -0.52428800000000000000e6
+457 1 15 27 0.26214400000000000000e6
+457 5 10 13 -0.26214400000000000000e6
+458 1 15 28 0.26214400000000000000e6
+458 1 18 25 -0.26214400000000000000e6
+459 1 12 27 -0.52428800000000000000e6
+459 1 13 28 0.26214400000000000000e6
+459 1 15 18 -0.26214400000000000000e6
+459 1 15 29 0.26214400000000000000e6
+459 1 21 28 -0.26214400000000000000e6
+459 1 25 28 -0.26214400000000000000e6
+459 2 8 10 -0.26214400000000000000e6
+459 2 12 14 -0.26214400000000000000e6
+459 5 7 10 -0.26214400000000000000e6
+460 1 15 31 0.26214400000000000000e6
+460 1 22 29 -0.26214400000000000000e6
+461 1 15 32 0.26214400000000000000e6
+461 1 25 28 -0.26214400000000000000e6
+462 1 15 33 0.26214400000000000000e6
+462 7 13 14 -0.26214400000000000000e6
+463 1 15 34 0.26214400000000000000e6
+463 1 18 33 -0.26214400000000000000e6
+464 1 15 35 0.26214400000000000000e6
+464 7 14 15 -0.26214400000000000000e6
+465 1 10 19 -0.13107200000000000000e6
+465 1 16 16 0.26214400000000000000e6
+466 1 16 17 0.26214400000000000000e6
+466 3 9 10 -0.26214400000000000000e6
+467 1 16 18 0.26214400000000000000e6
+467 7 9 10 -0.26214400000000000000e6
+468 1 8 31 -0.52428800000000000000e6
+468 1 10 19 -0.26214400000000000000e6
+468 1 10 29 0.52428800000000000000e6
+468 1 10 33 0.26214400000000000000e6
+468 1 11 26 -0.10485760000000000000e7
+468 1 15 16 -0.52428800000000000000e6
+468 1 15 30 -0.26214400000000000000e6
+468 1 16 20 0.26214400000000000000e6
+468 1 16 35 -0.52428800000000000000e6
+468 1 26 35 -0.26214400000000000000e6
+468 2 9 9 -0.10485760000000000000e7
+468 7 1 10 0.26214400000000000000e6
+468 7 5 14 0.52428800000000000000e6
+468 7 12 13 0.26214400000000000000e6
+468 8 4 4 0.52428800000000000000e6
+469 1 11 26 -0.26214400000000000000e6
+469 1 16 21 0.26214400000000000000e6
+470 1 16 22 0.26214400000000000000e6
+470 3 8 13 -0.26214400000000000000e6
+471 1 16 23 0.26214400000000000000e6
+471 7 5 14 -0.26214400000000000000e6
+472 1 16 24 0.26214400000000000000e6
+472 2 4 6 -0.26214400000000000000e6
+472 3 1 6 -0.26214400000000000000e6
+472 3 5 6 -0.26214400000000000000e6
+473 1 16 25 0.26214400000000000000e6
+473 3 4 5 -0.26214400000000000000e6
+473 7 5 6 -0.26214400000000000000e6
+473 8 3 3 -0.52428800000000000000e6
+474 1 10 29 -0.26214400000000000000e6
+474 1 16 26 0.26214400000000000000e6
+475 1 14 29 -0.26214400000000000000e6
+475 1 16 27 0.26214400000000000000e6
+476 1 12 27 -0.52428800000000000000e6
+476 1 13 28 0.26214400000000000000e6
+476 1 15 18 -0.26214400000000000000e6
+476 1 16 28 0.26214400000000000000e6
+476 1 21 28 -0.26214400000000000000e6
+476 1 25 28 -0.26214400000000000000e6
+476 2 8 10 -0.26214400000000000000e6
+476 2 12 14 -0.26214400000000000000e6
+476 5 7 10 -0.26214400000000000000e6
+477 1 16 29 0.26214400000000000000e6
+477 1 19 26 -0.26214400000000000000e6
+478 1 10 29 -0.26214400000000000000e6
+478 1 11 26 0.52428800000000000000e6
+478 1 16 30 0.26214400000000000000e6
+478 1 16 35 0.26214400000000000000e6
+478 7 5 14 -0.26214400000000000000e6
+479 1 16 32 0.26214400000000000000e6
+479 7 13 14 -0.26214400000000000000e6
+480 1 16 33 0.26214400000000000000e6
+480 1 26 29 -0.26214400000000000000e6
+481 1 8 31 0.52428800000000000000e6
+481 1 10 33 -0.26214400000000000000e6
+481 1 16 34 0.26214400000000000000e6
+481 1 26 35 0.26214400000000000000e6
+481 7 12 13 -0.26214400000000000000e6
+482 1 10 29 -0.13107200000000000000e6
+482 1 11 26 0.26214400000000000000e6
+482 1 11 30 0.26214400000000000000e6
+482 1 16 35 0.13107200000000000000e6
+482 1 17 17 0.26214400000000000000e6
+482 1 18 19 0.13107200000000000000e6
+482 1 20 23 -0.13107200000000000000e6
+482 1 20 35 0.13107200000000000000e6
+482 2 10 10 0.26214400000000000000e6
+482 7 5 14 -0.13107200000000000000e6
+483 1 2 17 0.52428800000000000000e6
+483 1 3 18 -0.26214400000000000000e6
+483 1 17 18 0.26214400000000000000e6
+483 1 17 32 0.26214400000000000000e6
+483 3 5 10 -0.26214400000000000000e6
+484 1 10 17 -0.26214400000000000000e6
+484 1 17 19 0.26214400000000000000e6
+484 2 4 6 0.52428800000000000000e6
+484 2 4 10 -0.52428800000000000000e6
+484 3 1 6 0.52428800000000000000e6
+484 3 1 14 -0.10485760000000000000e7
+484 3 5 6 0.52428800000000000000e6
+484 3 5 10 -0.52428800000000000000e6
+484 3 10 15 0.26214400000000000000e6
+484 3 14 15 -0.52428800000000000000e6
+484 5 9 12 0.52428800000000000000e6
+484 7 7 8 -0.26214400000000000000e6
+485 1 1 34 0.52428800000000000000e6
+485 1 5 24 -0.26214400000000000000e6
+485 1 7 22 -0.26214400000000000000e6
+485 1 17 21 0.26214400000000000000e6
+485 1 31 34 0.26214400000000000000e6
+485 2 1 11 -0.52428800000000000000e6
+485 2 11 15 -0.26214400000000000000e6
+485 5 1 12 -0.26214400000000000000e6
+485 5 10 13 0.26214400000000000000e6
+485 7 4 13 -0.26214400000000000000e6
+486 1 12 27 -0.26214400000000000000e6
+486 1 17 22 0.26214400000000000000e6
+487 1 6 13 -0.26214400000000000000e6
+487 1 17 23 0.26214400000000000000e6
+487 2 2 8 -0.26214400000000000000e6
+487 5 1 8 -0.26214400000000000000e6
+488 1 17 25 0.26214400000000000000e6
+488 5 10 13 -0.26214400000000000000e6
+489 1 14 29 -0.26214400000000000000e6
+489 1 17 26 0.26214400000000000000e6
+490 1 11 30 -0.26214400000000000000e6
+490 1 17 27 0.26214400000000000000e6
+491 1 17 29 0.26214400000000000000e6
+491 2 4 6 -0.26214400000000000000e6
+491 3 1 6 -0.26214400000000000000e6
+491 3 1 14 0.52428800000000000000e6
+491 3 5 6 -0.26214400000000000000e6
+491 3 14 15 0.26214400000000000000e6
+491 5 9 12 -0.26214400000000000000e6
+492 1 17 30 0.26214400000000000000e6
+492 1 20 27 -0.26214400000000000000e6
+493 1 11 34 -0.26214400000000000000e6
+493 1 17 31 0.26214400000000000000e6
+494 1 17 33 0.26214400000000000000e6
+494 3 10 15 -0.26214400000000000000e6
+495 1 17 34 0.26214400000000000000e6
+495 1 27 30 -0.26214400000000000000e6
+496 1 17 35 0.26214400000000000000e6
+496 1 27 34 -0.26214400000000000000e6
+497 1 13 20 -0.13107200000000000000e6
+497 1 18 18 0.26214400000000000000e6
+498 1 4 11 0.52428800000000000000e6
+498 1 4 13 -0.26214400000000000000e6
+498 1 12 27 0.26214400000000000000e6
+498 1 13 32 0.26214400000000000000e6
+498 1 18 20 0.26214400000000000000e6
+498 2 3 9 0.26214400000000000000e6
+498 2 8 14 0.26214400000000000000e6
+498 5 2 9 0.26214400000000000000e6
+498 5 7 10 0.52428800000000000000e6
+498 7 9 10 -0.26214400000000000000e6
+499 1 12 27 -0.26214400000000000000e6
+499 1 18 21 0.26214400000000000000e6
+500 1 6 13 -0.26214400000000000000e6
+500 1 18 22 0.26214400000000000000e6
+500 2 2 8 -0.26214400000000000000e6
+500 5 1 8 -0.26214400000000000000e6
+501 1 13 28 -0.26214400000000000000e6
+501 1 18 23 0.26214400000000000000e6
+502 1 18 24 0.26214400000000000000e6
+502 5 10 13 -0.26214400000000000000e6
+503 1 12 27 -0.52428800000000000000e6
+503 1 13 28 0.26214400000000000000e6
+503 1 15 18 -0.26214400000000000000e6
+503 1 18 26 0.26214400000000000000e6
+503 1 21 28 -0.26214400000000000000e6
+503 1 25 28 -0.26214400000000000000e6
+503 2 8 10 -0.26214400000000000000e6
+503 2 12 14 -0.26214400000000000000e6
+503 5 7 10 -0.26214400000000000000e6
+504 1 17 28 -0.26214400000000000000e6
+504 1 18 27 0.26214400000000000000e6
+505 1 18 28 0.26214400000000000000e6
+505 1 20 23 -0.26214400000000000000e6
+506 1 15 30 -0.26214400000000000000e6
+506 1 18 29 0.26214400000000000000e6
+507 1 15 18 -0.26214400000000000000e6
+507 1 18 30 0.26214400000000000000e6
+507 2 8 10 -0.26214400000000000000e6
+507 5 7 10 -0.26214400000000000000e6
+508 1 17 32 -0.26214400000000000000e6
+508 1 18 31 0.26214400000000000000e6
+509 1 18 32 0.26214400000000000000e6
+509 1 23 30 -0.26214400000000000000e6
+510 1 12 27 -0.26214400000000000000e6
+510 1 18 25 -0.26214400000000000000e6
+510 1 18 34 0.26214400000000000000e6
+510 2 8 14 -0.26214400000000000000e6
+511 1 18 35 0.26214400000000000000e6
+511 1 21 28 -0.26214400000000000000e6
+511 1 25 28 -0.26214400000000000000e6
+511 2 12 14 -0.26214400000000000000e6
+512 1 8 31 -0.26214400000000000000e6
+512 1 10 19 -0.13107200000000000000e6
+512 1 10 29 0.26214400000000000000e6
+512 1 10 33 0.13107200000000000000e6
+512 1 11 26 -0.52428800000000000000e6
+512 1 15 16 -0.26214400000000000000e6
+512 1 15 30 -0.13107200000000000000e6
+512 1 16 35 -0.26214400000000000000e6
+512 1 19 19 0.26214400000000000000e6
+512 1 26 35 -0.13107200000000000000e6
+512 2 9 9 -0.52428800000000000000e6
+512 7 1 10 0.13107200000000000000e6
+512 7 5 14 0.26214400000000000000e6
+512 7 12 13 0.13107200000000000000e6
+512 8 4 4 0.26214400000000000000e6
+513 1 17 24 -0.26214400000000000000e6
+513 1 19 21 0.26214400000000000000e6
+514 1 19 22 0.26214400000000000000e6
+514 5 10 13 -0.26214400000000000000e6
+515 1 18 25 -0.26214400000000000000e6
+515 1 19 23 0.26214400000000000000e6
+516 1 14 29 -0.26214400000000000000e6
+516 1 19 24 0.26214400000000000000e6
+517 1 12 27 -0.52428800000000000000e6
+517 1 13 28 0.26214400000000000000e6
+517 1 15 18 -0.26214400000000000000e6
+517 1 19 25 0.26214400000000000000e6
+517 1 21 28 -0.26214400000000000000e6
+517 1 25 28 -0.26214400000000000000e6
+517 2 8 10 -0.26214400000000000000e6
+517 2 12 14 -0.26214400000000000000e6
+517 5 7 10 -0.26214400000000000000e6
+518 1 19 27 0.26214400000000000000e6
+518 2 4 6 -0.26214400000000000000e6
+518 3 1 6 -0.26214400000000000000e6
+518 3 1 14 0.52428800000000000000e6
+518 3 5 6 -0.26214400000000000000e6
+518 3 14 15 0.26214400000000000000e6
+518 5 9 12 -0.26214400000000000000e6
+519 1 15 30 -0.26214400000000000000e6
+519 1 19 28 0.26214400000000000000e6
+520 1 10 29 -0.26214400000000000000e6
+520 1 11 26 0.52428800000000000000e6
+520 1 16 35 0.26214400000000000000e6
+520 1 19 29 0.26214400000000000000e6
+520 7 5 14 -0.26214400000000000000e6
+521 1 19 31 0.26214400000000000000e6
+521 3 10 15 -0.26214400000000000000e6
+522 1 18 33 -0.26214400000000000000e6
+522 1 19 32 0.26214400000000000000e6
+523 1 8 31 0.52428800000000000000e6
+523 1 10 33 -0.26214400000000000000e6
+523 1 19 33 0.26214400000000000000e6
+523 1 26 35 0.26214400000000000000e6
+523 7 12 13 -0.26214400000000000000e6
+524 1 19 35 0.26214400000000000000e6
+524 1 30 33 -0.26214400000000000000e6
+525 1 8 31 -0.52428800000000000000e6
+525 1 10 19 -0.13107200000000000000e6
+525 1 10 29 0.52428800000000000000e6
+525 1 10 33 0.26214400000000000000e6
+525 1 11 26 -0.10485760000000000000e7
+525 1 11 30 -0.52428800000000000000e6
+525 1 11 34 -0.26214400000000000000e6
+525 1 13 20 -0.13107200000000000000e6
+525 1 15 16 -0.26214400000000000000e6
+525 1 15 30 -0.13107200000000000000e6
+525 1 16 35 -0.52428800000000000000e6
+525 1 18 19 -0.26214400000000000000e6
+525 1 20 20 0.26214400000000000000e6
+525 1 20 23 0.26214400000000000000e6
+525 1 20 35 -0.26214400000000000000e6
+525 1 23 30 0.13107200000000000000e6
+525 1 26 35 -0.26214400000000000000e6
+525 1 30 35 -0.13107200000000000000e6
+525 2 9 9 -0.52428800000000000000e6
+525 2 10 10 -0.52428800000000000000e6
+525 7 1 10 0.13107200000000000000e6
+525 7 5 14 0.52428800000000000000e6
+525 7 12 13 0.26214400000000000000e6
+525 8 4 4 0.26214400000000000000e6
+526 1 11 30 -0.26214400000000000000e6
+526 1 20 21 0.26214400000000000000e6
+527 1 17 28 -0.26214400000000000000e6
+527 1 20 22 0.26214400000000000000e6
+528 1 20 24 0.26214400000000000000e6
+528 2 4 6 -0.26214400000000000000e6
+528 3 1 6 -0.26214400000000000000e6
+528 3 1 14 0.52428800000000000000e6
+528 3 5 6 -0.26214400000000000000e6
+528 3 14 15 0.26214400000000000000e6
+528 5 9 12 -0.26214400000000000000e6
+529 1 15 30 -0.26214400000000000000e6
+529 1 20 25 0.26214400000000000000e6
+530 1 10 29 -0.26214400000000000000e6
+530 1 11 26 0.52428800000000000000e6
+530 1 16 35 0.26214400000000000000e6
+530 1 20 26 0.26214400000000000000e6
+530 7 5 14 -0.26214400000000000000e6
+531 1 15 18 -0.26214400000000000000e6
+531 1 20 28 0.26214400000000000000e6
+531 2 8 10 -0.26214400000000000000e6
+531 5 7 10 -0.26214400000000000000e6
+532 1 19 30 -0.26214400000000000000e6
+532 1 20 29 0.26214400000000000000e6
+533 1 10 29 -0.26214400000000000000e6
+533 1 11 26 0.52428800000000000000e6
+533 1 11 30 0.52428800000000000000e6
+533 1 16 35 0.26214400000000000000e6
+533 1 20 23 -0.26214400000000000000e6
+533 1 20 30 0.26214400000000000000e6
+533 1 20 35 0.26214400000000000000e6
+533 7 5 14 -0.26214400000000000000e6
+534 1 20 31 0.26214400000000000000e6
+534 1 27 30 -0.26214400000000000000e6
+535 1 12 27 -0.26214400000000000000e6
+535 1 18 25 -0.26214400000000000000e6
+535 1 20 32 0.26214400000000000000e6
+535 2 8 14 -0.26214400000000000000e6
+536 1 19 34 -0.26214400000000000000e6
+536 1 20 33 0.26214400000000000000e6
+537 1 8 31 0.52428800000000000000e6
+537 1 10 33 -0.26214400000000000000e6
+537 1 11 34 0.52428800000000000000e6
+537 1 20 34 0.26214400000000000000e6
+537 1 23 30 -0.26214400000000000000e6
+537 1 26 35 0.26214400000000000000e6
+537 1 30 35 0.26214400000000000000e6
+537 7 12 13 -0.26214400000000000000e6
+538 1 2 33 0.13107200000000000000e6
+538 1 16 35 -0.65536000000000000000e5
+538 1 20 35 0.65536000000000000000e5
+538 1 21 21 0.26214400000000000000e6
+538 1 23 34 -0.65536000000000000000e5
+538 1 34 35 0.65536000000000000000e5
+538 2 1 15 0.13107200000000000000e6
+539 1 1 32 -0.26214400000000000000e6
+539 1 21 22 0.26214400000000000000e6
+540 1 2 9 -0.26214400000000000000e6
+540 1 4 7 0.26214400000000000000e6
+540 1 4 19 -0.26214400000000000000e6
+540 1 21 23 0.26214400000000000000e6
+540 1 23 34 -0.26214400000000000000e6
+540 2 5 5 -0.52428800000000000000e6
+540 2 12 12 0.52428800000000000000e6
+540 5 2 5 -0.52428800000000000000e6
+540 7 5 14 0.26214400000000000000e6
+541 1 21 24 0.26214400000000000000e6
+541 2 11 13 0.26214400000000000000e6
+541 3 12 13 0.26214400000000000000e6
+541 3 14 15 -0.26214400000000000000e6
+542 1 2 33 -0.26214400000000000000e6
+542 1 21 25 0.26214400000000000000e6
+543 1 8 31 -0.26214400000000000000e6
+543 1 21 26 0.26214400000000000000e6
+544 1 1 34 -0.26214400000000000000e6
+544 1 21 27 0.26214400000000000000e6
+545 1 21 29 0.26214400000000000000e6
+545 1 30 33 -0.26214400000000000000e6
+545 2 9 15 0.26214400000000000000e6
+545 7 13 14 0.26214400000000000000e6
+546 1 11 34 -0.26214400000000000000e6
+546 1 21 30 0.26214400000000000000e6
+547 1 6 21 -0.52428800000000000000e6
+547 1 7 22 0.26214400000000000000e6
+547 1 21 31 0.26214400000000000000e6
+547 1 31 34 -0.26214400000000000000e6
+547 2 11 15 0.26214400000000000000e6
+547 5 10 13 -0.26214400000000000000e6
+547 7 4 13 0.26214400000000000000e6
+548 1 1 24 0.26214400000000000000e6
+548 1 2 21 0.52428800000000000000e6
+548 1 3 22 -0.26214400000000000000e6
+548 1 12 27 0.26214400000000000000e6
+548 1 21 32 0.26214400000000000000e6
+548 1 30 33 -0.26214400000000000000e6
+548 2 9 15 0.26214400000000000000e6
+548 4 1 5 0.26214400000000000000e6
+548 7 13 14 0.26214400000000000000e6
+549 1 21 33 0.26214400000000000000e6
+549 1 24 31 -0.26214400000000000000e6
+550 1 16 35 -0.13107200000000000000e6
+550 1 20 35 0.13107200000000000000e6
+550 1 21 34 0.26214400000000000000e6
+550 1 23 34 -0.13107200000000000000e6
+550 1 34 35 0.13107200000000000000e6
+551 1 21 35 0.26214400000000000000e6
+551 1 32 33 0.26214400000000000000e6
+551 1 34 35 -0.26214400000000000000e6
+551 2 15 15 0.52428800000000000000e6
+552 1 2 9 -0.13107200000000000000e6
+552 1 4 7 0.13107200000000000000e6
+552 1 4 19 -0.13107200000000000000e6
+552 1 22 22 0.26214400000000000000e6
+552 1 23 34 -0.13107200000000000000e6
+552 2 5 5 -0.26214400000000000000e6
+552 2 12 12 0.26214400000000000000e6
+552 5 2 5 -0.26214400000000000000e6
+552 7 5 14 0.13107200000000000000e6
+553 1 4 31 -0.26214400000000000000e6
+553 1 22 23 0.26214400000000000000e6
+554 1 2 33 -0.26214400000000000000e6
+554 1 22 24 0.26214400000000000000e6
+555 1 22 25 0.26214400000000000000e6
+555 7 11 12 -0.26214400000000000000e6
+556 1 22 26 0.26214400000000000000e6
+556 3 12 13 -0.26214400000000000000e6
+557 1 21 28 -0.26214400000000000000e6
+557 1 22 27 0.26214400000000000000e6
+558 1 3 34 -0.26214400000000000000e6
+558 1 22 28 0.26214400000000000000e6
+559 1 17 32 -0.26214400000000000000e6
+559 1 22 30 0.26214400000000000000e6
+560 1 1 24 0.26214400000000000000e6
+560 1 2 21 0.52428800000000000000e6
+560 1 3 22 -0.26214400000000000000e6
+560 1 12 27 0.26214400000000000000e6
+560 1 22 31 0.26214400000000000000e6
+560 1 30 33 -0.26214400000000000000e6
+560 2 9 15 0.26214400000000000000e6
+560 4 1 5 0.26214400000000000000e6
+560 7 13 14 0.26214400000000000000e6
+561 1 22 32 0.26214400000000000000e6
+561 5 12 15 -0.26214400000000000000e6
+562 1 6 21 0.52428800000000000000e6
+562 1 7 22 -0.26214400000000000000e6
+562 1 22 33 0.26214400000000000000e6
+562 5 10 13 0.26214400000000000000e6
+562 7 4 13 -0.26214400000000000000e6
+563 1 12 35 -0.26214400000000000000e6
+563 1 22 34 0.26214400000000000000e6
+564 1 1 32 0.52428800000000000000e6
+564 1 4 31 -0.26214400000000000000e6
+564 1 17 32 0.26214400000000000000e6
+564 1 22 35 0.26214400000000000000e6
+564 3 12 13 -0.26214400000000000000e6
+565 1 2 9 -0.26214400000000000000e6
+565 1 4 7 0.26214400000000000000e6
+565 1 4 19 -0.26214400000000000000e6
+565 1 23 23 0.26214400000000000000e6
+565 1 23 30 -0.13107200000000000000e6
+565 1 23 34 -0.26214400000000000000e6
+565 1 32 32 -0.26214400000000000000e6
+565 2 5 5 -0.52428800000000000000e6
+565 2 12 12 0.52428800000000000000e6
+565 5 2 5 -0.52428800000000000000e6
+565 7 5 14 0.26214400000000000000e6
+565 7 12 13 0.13107200000000000000e6
+566 1 23 24 0.26214400000000000000e6
+566 7 11 12 -0.26214400000000000000e6
+567 1 2 9 0.26214400000000000000e6
+567 1 4 7 -0.26214400000000000000e6
+567 1 4 19 0.26214400000000000000e6
+567 1 23 25 0.26214400000000000000e6
+567 2 5 5 0.52428800000000000000e6
+567 5 2 5 0.52428800000000000000e6
+567 7 5 14 -0.26214400000000000000e6
+568 1 23 26 0.26214400000000000000e6
+568 7 12 13 -0.26214400000000000000e6
+569 1 3 34 -0.26214400000000000000e6
+569 1 23 27 0.26214400000000000000e6
+570 1 13 32 -0.26214400000000000000e6
+570 1 23 28 0.26214400000000000000e6
+571 1 23 29 0.26214400000000000000e6
+571 1 25 28 -0.26214400000000000000e6
+572 1 23 31 0.26214400000000000000e6
+572 5 12 15 -0.26214400000000000000e6
+573 1 4 35 -0.26214400000000000000e6
+573 1 23 32 0.26214400000000000000e6
+574 1 23 33 0.26214400000000000000e6
+574 1 25 32 -0.26214400000000000000e6
+575 1 23 35 0.26214400000000000000e6
+575 1 32 32 -0.52428800000000000000e6
+576 1 8 31 -0.13107200000000000000e6
+576 1 24 24 0.26214400000000000000e6
+577 1 24 25 0.26214400000000000000e6
+577 3 12 13 -0.26214400000000000000e6
+578 1 24 26 0.26214400000000000000e6
+578 3 6 15 -0.26214400000000000000e6
+579 1 24 27 0.26214400000000000000e6
+579 1 30 33 -0.26214400000000000000e6
+579 2 9 15 0.26214400000000000000e6
+579 7 13 14 0.26214400000000000000e6
+580 1 22 29 -0.26214400000000000000e6
+580 1 24 28 0.26214400000000000000e6
+581 1 16 31 -0.26214400000000000000e6
+581 1 24 29 0.26214400000000000000e6
+582 1 24 30 0.26214400000000000000e6
+582 3 10 15 -0.26214400000000000000e6
+583 1 6 21 0.52428800000000000000e6
+583 1 7 22 -0.26214400000000000000e6
+583 1 24 32 0.26214400000000000000e6
+583 5 10 13 0.26214400000000000000e6
+583 7 4 13 -0.26214400000000000000e6
+584 1 8 35 -0.26214400000000000000e6
+584 1 24 33 0.26214400000000000000e6
+585 1 24 34 0.26214400000000000000e6
+585 3 14 15 -0.26214400000000000000e6
+586 1 24 35 0.26214400000000000000e6
+586 2 11 13 -0.52428800000000000000e6
+586 3 6 15 -0.26214400000000000000e6
+586 3 10 15 0.26214400000000000000e6
+586 3 12 13 -0.52428800000000000000e6
+586 3 14 15 0.52428800000000000000e6
+586 7 11 12 -0.26214400000000000000e6
+587 1 25 25 0.26214400000000000000e6
+587 7 12 13 -0.13107200000000000000e6
+588 1 25 26 0.26214400000000000000e6
+588 7 6 15 -0.26214400000000000000e6
+589 1 22 29 -0.26214400000000000000e6
+589 1 25 27 0.26214400000000000000e6
+590 1 25 29 0.26214400000000000000e6
+590 7 13 14 -0.26214400000000000000e6
+591 1 18 33 -0.26214400000000000000e6
+591 1 25 30 0.26214400000000000000e6
+592 1 6 21 0.52428800000000000000e6
+592 1 7 22 -0.26214400000000000000e6
+592 1 25 31 0.26214400000000000000e6
+592 5 10 13 0.26214400000000000000e6
+592 7 4 13 -0.26214400000000000000e6
+593 1 1 24 0.52428800000000000000e6
+593 1 2 21 0.10485760000000000000e7
+593 1 3 22 -0.52428800000000000000e6
+593 1 4 35 0.26214400000000000000e6
+593 1 12 27 0.52428800000000000000e6
+593 1 21 28 -0.26214400000000000000e6
+593 1 25 28 -0.26214400000000000000e6
+593 1 25 33 0.26214400000000000000e6
+593 1 30 33 -0.52428800000000000000e6
+593 1 32 35 -0.26214400000000000000e6
+593 2 9 15 0.52428800000000000000e6
+593 2 12 14 -0.26214400000000000000e6
+593 4 1 5 0.52428800000000000000e6
+593 7 13 14 0.52428800000000000000e6
+594 1 25 34 0.26214400000000000000e6
+594 7 14 15 -0.26214400000000000000e6
+595 1 25 35 0.26214400000000000000e6
+595 1 32 33 -0.26214400000000000000e6
+596 1 10 33 -0.13107200000000000000e6
+596 1 26 26 0.26214400000000000000e6
+597 1 16 31 -0.26214400000000000000e6
+597 1 26 27 0.26214400000000000000e6
+598 1 26 28 0.26214400000000000000e6
+598 7 13 14 -0.26214400000000000000e6
+599 1 8 31 0.52428800000000000000e6
+599 1 10 33 -0.26214400000000000000e6
+599 1 26 30 0.26214400000000000000e6
+599 1 26 35 0.26214400000000000000e6
+599 7 12 13 -0.26214400000000000000e6
+600 1 8 35 -0.26214400000000000000e6
+600 1 26 31 0.26214400000000000000e6
+601 1 1 24 0.52428800000000000000e6
+601 1 2 21 0.10485760000000000000e7
+601 1 3 22 -0.52428800000000000000e6
+601 1 4 35 0.26214400000000000000e6
+601 1 12 27 0.52428800000000000000e6
+601 1 21 28 -0.26214400000000000000e6
+601 1 25 28 -0.26214400000000000000e6
+601 1 26 32 0.26214400000000000000e6
+601 1 30 33 -0.52428800000000000000e6
+601 1 32 35 -0.26214400000000000000e6
+601 2 9 15 0.52428800000000000000e6
+601 2 12 14 -0.26214400000000000000e6
+601 4 1 5 0.52428800000000000000e6
+601 7 13 14 0.52428800000000000000e6
+602 1 16 35 -0.26214400000000000000e6
+602 1 26 34 0.26214400000000000000e6
+603 1 11 34 -0.13107200000000000000e6
+603 1 27 27 0.26214400000000000000e6
+604 1 17 32 -0.26214400000000000000e6
+604 1 27 28 0.26214400000000000000e6
+605 1 27 29 0.26214400000000000000e6
+605 3 10 15 -0.26214400000000000000e6
+606 1 16 35 -0.13107200000000000000e6
+606 1 20 35 0.13107200000000000000e6
+606 1 23 34 -0.13107200000000000000e6
+606 1 27 31 0.26214400000000000000e6
+606 1 34 35 0.13107200000000000000e6
+607 1 12 35 -0.26214400000000000000e6
+607 1 27 32 0.26214400000000000000e6
+608 1 27 33 0.26214400000000000000e6
+608 3 14 15 -0.26214400000000000000e6
+609 1 27 35 0.26214400000000000000e6
+609 1 31 34 -0.26214400000000000000e6
+610 1 23 30 -0.13107200000000000000e6
+610 1 28 28 0.26214400000000000000e6
+611 1 18 33 -0.26214400000000000000e6
+611 1 28 29 0.26214400000000000000e6
+612 1 12 27 -0.26214400000000000000e6
+612 1 18 25 -0.26214400000000000000e6
+612 1 28 30 0.26214400000000000000e6
+612 2 8 14 -0.26214400000000000000e6
+613 1 12 35 -0.26214400000000000000e6
+613 1 28 31 0.26214400000000000000e6
+614 1 23 34 -0.26214400000000000000e6
+614 1 28 32 0.26214400000000000000e6
+615 1 28 33 0.26214400000000000000e6
+615 7 14 15 -0.26214400000000000000e6
+616 1 21 28 -0.26214400000000000000e6
+616 1 25 28 -0.26214400000000000000e6
+616 1 28 34 0.26214400000000000000e6
+616 2 12 14 -0.26214400000000000000e6
+617 1 8 31 0.26214400000000000000e6
+617 1 10 33 -0.13107200000000000000e6
+617 1 26 35 0.13107200000000000000e6
+617 1 29 29 0.26214400000000000000e6
+617 7 12 13 -0.13107200000000000000e6
+618 1 19 34 -0.26214400000000000000e6
+618 1 29 30 0.26214400000000000000e6
+619 1 29 31 0.26214400000000000000e6
+619 3 14 15 -0.26214400000000000000e6
+620 1 29 32 0.26214400000000000000e6
+620 7 14 15 -0.26214400000000000000e6
+621 1 16 35 -0.26214400000000000000e6
+621 1 29 33 0.26214400000000000000e6
+622 1 29 34 0.26214400000000000000e6
+622 1 30 33 -0.26214400000000000000e6
+623 1 1 24 0.52428800000000000000e6
+623 1 2 21 0.10485760000000000000e7
+623 1 3 22 -0.52428800000000000000e6
+623 1 4 35 0.26214400000000000000e6
+623 1 12 27 0.52428800000000000000e6
+623 1 21 28 -0.26214400000000000000e6
+623 1 24 31 -0.26214400000000000000e6
+623 1 25 28 -0.26214400000000000000e6
+623 1 29 35 0.26214400000000000000e6
+623 1 30 33 -0.52428800000000000000e6
+623 1 32 35 -0.26214400000000000000e6
+623 2 9 15 0.52428800000000000000e6
+623 2 12 14 -0.26214400000000000000e6
+623 2 13 15 -0.26214400000000000000e6
+623 4 1 5 0.52428800000000000000e6
+623 7 13 14 0.52428800000000000000e6
+624 1 8 31 0.26214400000000000000e6
+624 1 10 33 -0.13107200000000000000e6
+624 1 11 34 0.26214400000000000000e6
+624 1 23 30 -0.13107200000000000000e6
+624 1 26 35 0.13107200000000000000e6
+624 1 30 30 0.26214400000000000000e6
+624 1 30 35 0.13107200000000000000e6
+624 7 12 13 -0.13107200000000000000e6
+625 1 27 34 -0.26214400000000000000e6
+625 1 30 31 0.26214400000000000000e6
+626 1 21 28 -0.26214400000000000000e6
+626 1 25 28 -0.26214400000000000000e6
+626 1 30 32 0.26214400000000000000e6
+626 2 12 14 -0.26214400000000000000e6
+627 1 20 35 -0.26214400000000000000e6
+627 1 30 34 0.26214400000000000000e6
+628 1 31 31 0.26214400000000000000e6
+628 1 32 33 0.13107200000000000000e6
+628 1 34 35 -0.13107200000000000000e6
+628 2 15 15 0.26214400000000000000e6
+629 1 1 32 0.52428800000000000000e6
+629 1 4 31 -0.26214400000000000000e6
+629 1 17 32 0.26214400000000000000e6
+629 1 31 32 0.26214400000000000000e6
+629 3 12 13 -0.26214400000000000000e6
+630 1 31 33 0.26214400000000000000e6
+630 2 11 13 -0.52428800000000000000e6
+630 3 6 15 -0.26214400000000000000e6
+630 3 10 15 0.26214400000000000000e6
+630 3 12 13 -0.52428800000000000000e6
+630 3 14 15 0.52428800000000000000e6
+630 7 11 12 -0.26214400000000000000e6
+631 1 6 21 0.10485760000000000000e7
+631 1 7 22 -0.52428800000000000000e6
+631 1 8 35 -0.26214400000000000000e6
+631 1 27 34 0.26214400000000000000e6
+631 1 31 34 0.52428800000000000000e6
+631 1 31 35 0.26214400000000000000e6
+631 2 11 15 -0.52428800000000000000e6
+631 5 10 13 0.52428800000000000000e6
+631 5 12 15 -0.26214400000000000000e6
+631 7 4 13 -0.52428800000000000000e6
+632 1 28 35 -0.26214400000000000000e6
+632 1 32 34 0.26214400000000000000e6
+633 1 26 35 -0.13107200000000000000e6
+633 1 33 33 0.26214400000000000000e6
+634 1 1 24 0.52428800000000000000e6
+634 1 2 21 0.10485760000000000000e7
+634 1 3 22 -0.52428800000000000000e6
+634 1 4 35 0.26214400000000000000e6
+634 1 12 27 0.52428800000000000000e6
+634 1 21 28 -0.26214400000000000000e6
+634 1 24 31 -0.26214400000000000000e6
+634 1 25 28 -0.26214400000000000000e6
+634 1 30 33 -0.52428800000000000000e6
+634 1 32 35 -0.26214400000000000000e6
+634 1 33 34 0.26214400000000000000e6
+634 2 9 15 0.52428800000000000000e6
+634 2 12 14 -0.26214400000000000000e6
+634 2 13 15 -0.26214400000000000000e6
+634 4 1 5 0.52428800000000000000e6
+634 7 13 14 0.52428800000000000000e6
+635 1 24 31 0.52428800000000000000e6
+635 1 25 32 -0.26214400000000000000e6
+635 1 26 33 -0.26214400000000000000e6
+635 1 30 33 0.26214400000000000000e6
+635 1 33 35 0.26214400000000000000e6
+636 1 30 35 -0.13107200000000000000e6
+636 1 34 34 0.26214400000000000000e6
+637 1 26 35 -0.13107200000000000000e6
+637 1 30 35 0.13107200000000000000e6
+637 1 32 32 -0.26214400000000000000e6
+637 1 32 33 -0.26214400000000000000e6
+637 1 34 35 0.26214400000000000000e6
+637 1 35 35 0.26214400000000000000e6
+637 2 15 15 -0.52428800000000000000e6
+638 1 1 4 0.13107200000000000000e6
+638 1 1 32 -0.13107200000000000000e6
+638 1 2 17 -0.13107200000000000000e6
+638 1 11 22 -0.26214400000000000000e6
+638 2 1 2 0.26214400000000000000e6
+638 3 5 6 0.65536000000000000000e5
+638 3 5 10 -0.65536000000000000000e5
+638 3 12 13 -0.65536000000000000000e5
+638 7 1 2 0.26214400000000000000e6
+638 7 3 4 0.65536000000000000000e5
+639 2 1 4 0.26214400000000000000e6
+639 4 1 1 -0.52428800000000000000e6
+640 2 1 5 0.26214400000000000000e6
+640 6 1 3 -0.26214400000000000000e6
+641 1 1 8 0.26214400000000000000e6
+641 1 11 26 -0.26214400000000000000e6
+641 2 1 6 0.26214400000000000000e6
+641 3 4 5 0.26214400000000000000e6
+642 1 4 11 0.13107200000000000000e6
+642 1 10 13 -0.13107200000000000000e6
+642 1 13 28 -0.13107200000000000000e6
+642 1 15 18 0.13107200000000000000e6
+642 1 25 28 0.13107200000000000000e6
+642 2 1 8 0.26214400000000000000e6
+642 2 6 8 -0.13107200000000000000e6
+642 2 8 10 0.13107200000000000000e6
+642 2 12 14 0.13107200000000000000e6
+642 5 2 9 0.26214400000000000000e6
+643 2 1 10 0.26214400000000000000e6
+643 2 7 7 -0.52428800000000000000e6
+644 1 2 21 0.26214400000000000000e6
+644 1 21 28 -0.26214400000000000000e6
+644 2 1 12 0.26214400000000000000e6
+644 5 2 13 0.26214400000000000000e6
+645 2 1 13 0.26214400000000000000e6
+645 4 1 5 -0.26214400000000000000e6
+646 1 1 8 0.13107200000000000000e6
+646 1 2 9 0.26214400000000000000e6
+646 1 2 33 0.13107200000000000000e6
+646 1 11 30 -0.13107200000000000000e6
+646 1 11 34 -0.26214400000000000000e6
+646 1 16 35 -0.65536000000000000000e5
+646 1 20 35 0.65536000000000000000e5
+646 1 23 34 -0.65536000000000000000e5
+646 1 34 35 0.65536000000000000000e5
+646 2 1 1 0.52428800000000000000e6
+646 2 1 3 -0.13107200000000000000e6
+646 2 1 14 0.26214400000000000000e6
+646 2 1 15 0.13107200000000000000e6
+646 2 7 7 0.26214400000000000000e6
+646 5 1 4 0.52428800000000000000e6
+646 5 2 5 -0.13107200000000000000e6
+646 5 8 11 0.13107200000000000000e6
+646 6 1 3 0.26214400000000000000e6
+646 7 1 10 0.13107200000000000000e6
+647 2 1 3 -0.13107200000000000000e6
+647 2 2 2 0.26214400000000000000e6
+648 1 1 4 0.26214400000000000000e6
+648 2 2 3 0.26214400000000000000e6
+648 5 3 14 -0.26214400000000000000e6
+648 7 2 3 0.26214400000000000000e6
+649 2 2 4 0.26214400000000000000e6
+649 6 1 3 -0.26214400000000000000e6
+650 2 2 5 0.26214400000000000000e6
+650 5 9 12 -0.26214400000000000000e6
+650 7 1 2 0.26214400000000000000e6
+650 7 3 4 0.26214400000000000000e6
+651 2 2 6 0.26214400000000000000e6
+651 3 5 6 0.13107200000000000000e6
+651 3 5 10 -0.13107200000000000000e6
+651 3 8 13 -0.26214400000000000000e6
+651 3 12 13 -0.13107200000000000000e6
+651 7 3 4 0.13107200000000000000e6
+651 7 4 5 0.26214400000000000000e6
+652 1 4 11 0.13107200000000000000e6
+652 1 10 13 -0.13107200000000000000e6
+652 1 13 28 -0.13107200000000000000e6
+652 1 15 18 0.13107200000000000000e6
+652 1 25 28 0.13107200000000000000e6
+652 2 2 7 0.26214400000000000000e6
+652 2 6 8 -0.13107200000000000000e6
+652 2 8 10 0.13107200000000000000e6
+652 2 12 14 0.13107200000000000000e6
+652 5 2 9 0.26214400000000000000e6
+653 1 7 14 0.26214400000000000000e6
+653 2 2 9 0.26214400000000000000e6
+653 3 2 7 0.26214400000000000000e6
+653 5 10 13 -0.26214400000000000000e6
+654 1 2 17 0.26214400000000000000e6
+654 1 17 28 -0.26214400000000000000e6
+654 2 2 10 0.26214400000000000000e6
+654 7 7 8 0.26214400000000000000e6
+655 1 2 21 0.26214400000000000000e6
+655 1 21 28 -0.26214400000000000000e6
+655 2 2 11 0.26214400000000000000e6
+655 5 2 13 0.26214400000000000000e6
+656 1 3 34 -0.26214400000000000000e6
+656 1 7 22 0.26214400000000000000e6
+656 2 2 12 0.26214400000000000000e6
+656 5 1 12 0.26214400000000000000e6
+657 1 6 21 0.26214400000000000000e6
+657 1 8 23 0.26214400000000000000e6
+657 1 22 29 -0.26214400000000000000e6
+657 2 2 13 0.26214400000000000000e6
+658 1 11 22 0.26214400000000000000e6
+658 1 17 32 -0.26214400000000000000e6
+658 2 2 14 0.26214400000000000000e6
+658 5 9 12 0.26214400000000000000e6
+659 1 1 32 0.26214400000000000000e6
+659 1 12 35 -0.26214400000000000000e6
+659 2 2 15 0.26214400000000000000e6
+659 7 11 12 0.26214400000000000000e6
+660 2 3 4 0.26214400000000000000e6
+660 5 9 12 -0.26214400000000000000e6
+660 7 1 2 0.26214400000000000000e6
+660 7 3 4 0.26214400000000000000e6
+661 2 3 5 0.26214400000000000000e6
+661 8 2 2 -0.52428800000000000000e6
+662 2 3 6 0.26214400000000000000e6
+662 2 5 5 -0.52428800000000000000e6
+663 2 2 8 -0.26214400000000000000e6
+663 2 3 7 0.26214400000000000000e6
+664 1 4 11 0.26214400000000000000e6
+664 1 4 15 0.26214400000000000000e6
+664 1 13 28 -0.26214400000000000000e6
+664 2 3 8 0.26214400000000000000e6
+665 2 3 10 0.26214400000000000000e6
+665 2 8 8 -0.52428800000000000000e6
+666 1 3 34 -0.26214400000000000000e6
+666 1 7 22 0.26214400000000000000e6
+666 2 3 11 0.26214400000000000000e6
+666 5 1 12 0.26214400000000000000e6
+667 1 3 22 0.26214400000000000000e6
+667 1 13 32 -0.26214400000000000000e6
+667 2 3 12 0.26214400000000000000e6
+667 7 3 12 0.26214400000000000000e6
+668 1 3 22 0.52428800000000000000e6
+668 1 4 23 -0.26214400000000000000e6
+668 1 4 35 0.26214400000000000000e6
+668 1 13 28 0.26214400000000000000e6
+668 1 25 28 -0.26214400000000000000e6
+668 2 3 13 0.26214400000000000000e6
+668 5 2 13 0.26214400000000000000e6
+669 1 2 9 0.52428800000000000000e6
+669 1 15 30 0.26214400000000000000e6
+669 1 23 30 -0.26214400000000000000e6
+669 2 3 14 0.26214400000000000000e6
+669 3 4 5 -0.26214400000000000000e6
+669 5 1 4 0.52428800000000000000e6
+669 5 8 11 0.26214400000000000000e6
+669 6 1 3 0.52428800000000000000e6
+669 7 5 6 -0.26214400000000000000e6
+669 7 14 15 0.26214400000000000000e6
+669 8 3 3 -0.52428800000000000000e6
+670 2 3 15 0.26214400000000000000e6
+670 2 12 12 -0.52428800000000000000e6
+671 1 1 8 0.13107200000000000000e6
+671 1 11 26 -0.13107200000000000000e6
+671 2 4 4 0.26214400000000000000e6
+671 3 4 5 0.13107200000000000000e6
+672 2 4 5 0.26214400000000000000e6
+672 3 5 6 0.13107200000000000000e6
+672 3 5 10 -0.13107200000000000000e6
+672 3 8 13 -0.26214400000000000000e6
+672 3 12 13 -0.13107200000000000000e6
+672 7 3 4 0.13107200000000000000e6
+672 7 4 5 0.26214400000000000000e6
+673 2 1 9 -0.26214400000000000000e6
+673 2 4 7 0.26214400000000000000e6
+674 1 7 14 0.26214400000000000000e6
+674 2 4 8 0.26214400000000000000e6
+674 3 2 7 0.26214400000000000000e6
+674 5 10 13 -0.26214400000000000000e6
+675 1 1 16 0.26214400000000000000e6
+675 1 14 29 -0.26214400000000000000e6
+675 2 4 9 0.26214400000000000000e6
+675 7 6 7 0.26214400000000000000e6
+676 2 4 11 0.26214400000000000000e6
+676 4 1 5 -0.26214400000000000000e6
+677 1 6 21 0.26214400000000000000e6
+677 1 8 23 0.26214400000000000000e6
+677 1 22 29 -0.26214400000000000000e6
+677 2 4 12 0.26214400000000000000e6
+678 1 5 24 0.26214400000000000000e6
+678 1 16 31 -0.26214400000000000000e6
+678 2 4 13 0.26214400000000000000e6
+678 7 4 13 0.26214400000000000000e6
+679 2 4 14 0.26214400000000000000e6
+679 3 1 14 0.26214400000000000000e6
+679 3 8 13 0.26214400000000000000e6
+679 3 10 15 -0.26214400000000000000e6
+680 2 4 15 0.26214400000000000000e6
+680 2 11 13 -0.26214400000000000000e6
+681 2 5 6 0.26214400000000000000e6
+681 8 3 3 -0.52428800000000000000e6
+682 1 7 14 0.26214400000000000000e6
+682 2 5 7 0.26214400000000000000e6
+682 3 2 7 0.26214400000000000000e6
+682 5 10 13 -0.26214400000000000000e6
+683 2 3 9 -0.26214400000000000000e6
+683 2 5 8 0.26214400000000000000e6
+684 2 5 9 0.26214400000000000000e6
+684 2 6 8 -0.26214400000000000000e6
+685 2 5 10 0.26214400000000000000e6
+685 8 4 4 -0.52428800000000000000e6
+686 1 6 21 0.26214400000000000000e6
+686 1 8 23 0.26214400000000000000e6
+686 1 22 29 -0.26214400000000000000e6
+686 2 5 11 0.26214400000000000000e6
+687 1 3 22 0.52428800000000000000e6
+687 1 4 23 -0.26214400000000000000e6
+687 1 4 35 0.26214400000000000000e6
+687 1 13 28 0.26214400000000000000e6
+687 1 25 28 -0.26214400000000000000e6
+687 2 5 12 0.26214400000000000000e6
+687 5 2 13 0.26214400000000000000e6
+688 2 5 13 0.26214400000000000000e6
+688 2 6 12 -0.26214400000000000000e6
+689 1 2 9 0.26214400000000000000e6
+689 1 18 33 -0.26214400000000000000e6
+689 2 5 14 0.26214400000000000000e6
+689 5 1 4 0.26214400000000000000e6
+689 6 1 3 0.26214400000000000000e6
+689 7 5 14 0.26214400000000000000e6
+690 1 2 33 0.26214400000000000000e6
+690 2 5 15 0.26214400000000000000e6
+690 7 12 13 0.26214400000000000000e6
+690 7 14 15 -0.26214400000000000000e6
+691 1 1 16 0.26214400000000000000e6
+691 1 14 29 -0.26214400000000000000e6
+691 2 6 7 0.26214400000000000000e6
+691 7 6 7 0.26214400000000000000e6
+692 1 9 16 0.26214400000000000000e6
+692 1 19 26 -0.26214400000000000000e6
+692 2 6 9 0.26214400000000000000e6
+692 3 4 9 0.26214400000000000000e6
+693 2 6 10 0.26214400000000000000e6
+693 2 9 9 -0.52428800000000000000e6
+694 1 5 24 0.26214400000000000000e6
+694 1 16 31 -0.26214400000000000000e6
+694 2 6 11 0.26214400000000000000e6
+694 7 4 13 0.26214400000000000000e6
+695 1 10 25 0.26214400000000000000e6
+695 1 26 29 -0.26214400000000000000e6
+695 2 6 13 0.26214400000000000000e6
+695 3 6 11 0.26214400000000000000e6
+696 1 8 31 0.52428800000000000000e6
+696 1 10 33 -0.26214400000000000000e6
+696 1 11 26 0.26214400000000000000e6
+696 1 26 35 0.26214400000000000000e6
+696 2 6 14 0.26214400000000000000e6
+696 3 4 5 0.26214400000000000000e6
+696 7 5 6 0.26214400000000000000e6
+696 7 12 13 -0.26214400000000000000e6
+696 8 3 3 0.52428800000000000000e6
+697 1 8 31 0.26214400000000000000e6
+697 1 16 35 -0.26214400000000000000e6
+697 2 6 15 0.26214400000000000000e6
+697 7 6 15 0.26214400000000000000e6
+698 1 2 17 0.26214400000000000000e6
+698 1 17 28 -0.26214400000000000000e6
+698 2 7 8 0.26214400000000000000e6
+698 7 7 8 0.26214400000000000000e6
+699 2 4 10 -0.26214400000000000000e6
+699 2 7 9 0.26214400000000000000e6
+700 1 1 20 0.26214400000000000000e6
+700 1 12 19 0.26214400000000000000e6
+700 1 20 27 -0.26214400000000000000e6
+700 2 7 10 0.26214400000000000000e6
+701 1 1 8 0.13107200000000000000e6
+701 1 2 9 0.26214400000000000000e6
+701 1 2 33 0.13107200000000000000e6
+701 1 11 30 -0.13107200000000000000e6
+701 1 11 34 -0.26214400000000000000e6
+701 1 16 35 -0.65536000000000000000e5
+701 1 20 35 0.65536000000000000000e5
+701 1 23 34 -0.65536000000000000000e5
+701 1 34 35 0.65536000000000000000e5
+701 2 1 1 0.52428800000000000000e6
+701 2 1 3 -0.13107200000000000000e6
+701 2 1 15 0.13107200000000000000e6
+701 2 7 7 0.26214400000000000000e6
+701 2 7 11 0.26214400000000000000e6
+701 5 1 4 0.52428800000000000000e6
+701 5 2 5 -0.13107200000000000000e6
+701 5 8 11 0.13107200000000000000e6
+701 6 1 3 0.26214400000000000000e6
+701 7 1 10 0.13107200000000000000e6
+702 1 11 22 0.26214400000000000000e6
+702 1 17 32 -0.26214400000000000000e6
+702 2 7 12 0.26214400000000000000e6
+702 5 9 12 0.26214400000000000000e6
+703 2 7 13 0.26214400000000000000e6
+703 3 1 14 0.26214400000000000000e6
+703 3 8 13 0.26214400000000000000e6
+703 3 10 15 -0.26214400000000000000e6
+704 1 1 34 -0.52428800000000000000e6
+704 1 5 24 0.26214400000000000000e6
+704 1 7 22 0.26214400000000000000e6
+704 1 27 30 -0.26214400000000000000e6
+704 1 31 34 -0.26214400000000000000e6
+704 2 1 11 0.52428800000000000000e6
+704 2 7 14 0.26214400000000000000e6
+704 2 11 15 0.26214400000000000000e6
+704 5 1 12 0.26214400000000000000e6
+704 7 4 13 0.26214400000000000000e6
+705 1 1 34 0.26214400000000000000e6
+705 1 22 29 0.26214400000000000000e6
+705 1 27 34 -0.26214400000000000000e6
+705 2 7 15 0.26214400000000000000e6
+706 2 8 9 0.26214400000000000000e6
+706 8 4 4 -0.52428800000000000000e6
+707 1 11 22 0.26214400000000000000e6
+707 1 17 32 -0.26214400000000000000e6
+707 2 8 11 0.26214400000000000000e6
+707 5 9 12 0.26214400000000000000e6
+708 1 2 9 0.52428800000000000000e6
+708 1 15 30 0.26214400000000000000e6
+708 1 23 30 -0.26214400000000000000e6
+708 2 8 12 0.26214400000000000000e6
+708 3 4 5 -0.26214400000000000000e6
+708 5 1 4 0.52428800000000000000e6
+708 5 8 11 0.26214400000000000000e6
+708 6 1 3 0.52428800000000000000e6
+708 7 5 6 -0.26214400000000000000e6
+708 7 14 15 0.26214400000000000000e6
+708 8 3 3 -0.52428800000000000000e6
+709 1 2 9 0.26214400000000000000e6
+709 1 18 33 -0.26214400000000000000e6
+709 2 8 13 0.26214400000000000000e6
+709 5 1 4 0.26214400000000000000e6
+709 6 1 3 0.26214400000000000000e6
+709 7 5 14 0.26214400000000000000e6
+710 2 8 15 0.26214400000000000000e6
+710 2 12 14 -0.26214400000000000000e6
+711 1 5 20 0.26214400000000000000e6
+711 1 19 30 -0.26214400000000000000e6
+711 2 9 10 0.26214400000000000000e6
+711 7 9 10 0.26214400000000000000e6
+712 2 9 11 0.26214400000000000000e6
+712 3 1 14 0.26214400000000000000e6
+712 3 8 13 0.26214400000000000000e6
+712 3 10 15 -0.26214400000000000000e6
+713 1 2 9 0.26214400000000000000e6
+713 1 18 33 -0.26214400000000000000e6
+713 2 9 12 0.26214400000000000000e6
+713 5 1 4 0.26214400000000000000e6
+713 6 1 3 0.26214400000000000000e6
+713 7 5 14 0.26214400000000000000e6
+714 1 8 31 0.52428800000000000000e6
+714 1 10 33 -0.26214400000000000000e6
+714 1 11 26 0.26214400000000000000e6
+714 1 26 35 0.26214400000000000000e6
+714 2 9 13 0.26214400000000000000e6
+714 3 4 5 0.26214400000000000000e6
+714 7 5 6 0.26214400000000000000e6
+714 7 12 13 -0.26214400000000000000e6
+714 8 3 3 0.52428800000000000000e6
+715 1 12 27 0.52428800000000000000e6
+715 1 13 28 -0.26214400000000000000e6
+715 1 15 18 0.26214400000000000000e6
+715 1 17 24 0.26214400000000000000e6
+715 1 19 34 -0.26214400000000000000e6
+715 1 21 28 0.26214400000000000000e6
+715 1 25 28 0.26214400000000000000e6
+715 2 8 10 0.26214400000000000000e6
+715 2 9 14 0.26214400000000000000e6
+715 2 12 14 0.26214400000000000000e6
+715 5 7 10 0.26214400000000000000e6
+716 1 1 34 -0.52428800000000000000e6
+716 1 5 24 0.26214400000000000000e6
+716 1 7 22 0.26214400000000000000e6
+716 1 27 30 -0.26214400000000000000e6
+716 1 31 34 -0.26214400000000000000e6
+716 2 1 11 0.52428800000000000000e6
+716 2 10 11 0.26214400000000000000e6
+716 2 11 15 0.26214400000000000000e6
+716 5 1 12 0.26214400000000000000e6
+716 7 4 13 0.26214400000000000000e6
+717 2 8 14 -0.26214400000000000000e6
+717 2 10 12 0.26214400000000000000e6
+718 1 12 27 0.52428800000000000000e6
+718 1 13 28 -0.26214400000000000000e6
+718 1 15 18 0.26214400000000000000e6
+718 1 17 24 0.26214400000000000000e6
+718 1 19 34 -0.26214400000000000000e6
+718 1 21 28 0.26214400000000000000e6
+718 1 25 28 0.26214400000000000000e6
+718 2 8 10 0.26214400000000000000e6
+718 2 10 13 0.26214400000000000000e6
+718 2 12 14 0.26214400000000000000e6
+718 5 7 10 0.26214400000000000000e6
+719 1 8 31 0.52428800000000000000e6
+719 1 10 33 -0.26214400000000000000e6
+719 1 11 30 0.26214400000000000000e6
+719 1 11 34 0.52428800000000000000e6
+719 1 15 30 0.26214400000000000000e6
+719 1 23 30 -0.26214400000000000000e6
+719 1 26 35 0.26214400000000000000e6
+719 1 30 35 0.26214400000000000000e6
+719 2 10 14 0.26214400000000000000e6
+719 7 12 13 -0.26214400000000000000e6
+720 1 11 34 0.26214400000000000000e6
+720 1 18 33 0.26214400000000000000e6
+720 1 20 35 -0.26214400000000000000e6
+720 2 10 15 0.26214400000000000000e6
+721 2 1 15 -0.13107200000000000000e6
+721 2 11 11 0.26214400000000000000e6
+722 1 1 32 0.26214400000000000000e6
+722 1 12 35 -0.26214400000000000000e6
+722 2 11 12 0.26214400000000000000e6
+722 7 11 12 0.26214400000000000000e6
+723 1 1 34 0.26214400000000000000e6
+723 1 22 29 0.26214400000000000000e6
+723 1 27 34 -0.26214400000000000000e6
+723 2 11 14 0.26214400000000000000e6
+724 1 2 33 0.26214400000000000000e6
+724 2 12 13 0.26214400000000000000e6
+724 7 12 13 0.26214400000000000000e6
+724 7 14 15 -0.26214400000000000000e6
+725 1 1 24 -0.26214400000000000000e6
+725 1 2 21 -0.52428800000000000000e6
+725 1 3 22 0.26214400000000000000e6
+725 1 12 27 -0.26214400000000000000e6
+725 1 25 32 0.26214400000000000000e6
+725 1 28 35 -0.26214400000000000000e6
+725 1 30 33 0.26214400000000000000e6
+725 2 9 15 -0.26214400000000000000e6
+725 2 12 15 0.26214400000000000000e6
+725 4 1 5 -0.26214400000000000000e6
+725 7 13 14 -0.26214400000000000000e6
+726 1 8 31 0.13107200000000000000e6
+726 1 16 35 -0.13107200000000000000e6
+726 2 13 13 0.26214400000000000000e6
+726 7 6 15 0.13107200000000000000e6
+727 2 9 15 -0.26214400000000000000e6
+727 2 13 14 0.26214400000000000000e6
+728 1 11 34 0.13107200000000000000e6
+728 1 18 33 0.13107200000000000000e6
+728 1 20 35 -0.13107200000000000000e6
+728 2 14 14 0.26214400000000000000e6
+729 1 16 35 0.13107200000000000000e6
+729 1 20 35 -0.13107200000000000000e6
+729 1 23 34 0.13107200000000000000e6
+729 1 30 35 -0.26214400000000000000e6
+729 1 34 35 -0.13107200000000000000e6
+729 2 14 15 0.26214400000000000000e6
+729 7 14 15 0.26214400000000000000e6
+730 3 1 1 0.26214400000000000000e6
+730 3 1 14 -0.13107200000000000000e6
+730 3 5 6 0.65536000000000000000e5
+730 3 5 10 -0.65536000000000000000e5
+730 3 12 13 -0.65536000000000000000e5
+730 4 1 1 0.26214400000000000000e6
+730 7 3 4 0.65536000000000000000e5
+731 3 1 2 0.26214400000000000000e6
+731 5 1 4 -0.26214400000000000000e6
+732 3 1 3 0.26214400000000000000e6
+732 7 1 2 -0.26214400000000000000e6
+733 1 1 8 -0.26214400000000000000e6
+733 3 1 4 0.26214400000000000000e6
+734 3 1 5 0.26214400000000000000e6
+734 3 5 6 -0.13107200000000000000e6
+734 3 5 10 0.13107200000000000000e6
+734 3 12 13 0.13107200000000000000e6
+734 7 3 4 -0.13107200000000000000e6
+735 1 10 13 -0.26214400000000000000e6
+735 1 12 27 0.52428800000000000000e6
+735 1 13 28 -0.26214400000000000000e6
+735 1 15 18 0.26214400000000000000e6
+735 1 17 24 -0.26214400000000000000e6
+735 1 21 28 0.26214400000000000000e6
+735 1 25 28 0.26214400000000000000e6
+735 2 1 9 0.26214400000000000000e6
+735 2 6 8 -0.26214400000000000000e6
+735 2 8 10 0.26214400000000000000e6
+735 2 12 14 0.26214400000000000000e6
+735 3 1 7 0.26214400000000000000e6
+735 5 7 10 0.26214400000000000000e6
+736 3 1 8 0.26214400000000000000e6
+736 3 2 7 -0.26214400000000000000e6
+737 1 1 16 -0.26214400000000000000e6
+737 3 1 9 0.26214400000000000000e6
+738 2 4 6 -0.26214400000000000000e6
+738 2 4 10 0.26214400000000000000e6
+738 3 1 6 -0.26214400000000000000e6
+738 3 1 10 0.26214400000000000000e6
+738 3 1 14 0.52428800000000000000e6
+738 3 5 6 -0.26214400000000000000e6
+738 3 5 10 0.26214400000000000000e6
+738 3 14 15 0.26214400000000000000e6
+738 5 9 12 -0.26214400000000000000e6
+739 1 1 24 -0.26214400000000000000e6
+739 3 1 11 0.26214400000000000000e6
+740 1 6 21 -0.26214400000000000000e6
+740 3 1 12 0.26214400000000000000e6
+741 1 5 24 -0.26214400000000000000e6
+741 3 1 13 0.26214400000000000000e6
+742 2 11 13 0.26214400000000000000e6
+742 3 1 15 0.26214400000000000000e6
+742 3 12 13 0.26214400000000000000e6
+742 3 14 15 -0.26214400000000000000e6
+743 3 2 2 0.26214400000000000000e6
+743 7 1 2 -0.13107200000000000000e6
+744 3 2 3 0.26214400000000000000e6
+744 5 2 5 -0.26214400000000000000e6
+745 3 2 4 0.26214400000000000000e6
+745 3 5 6 -0.13107200000000000000e6
+745 3 5 10 0.13107200000000000000e6
+745 3 12 13 0.13107200000000000000e6
+745 7 3 4 -0.13107200000000000000e6
+746 1 2 9 -0.26214400000000000000e6
+746 3 2 5 0.26214400000000000000e6
+747 3 2 6 0.26214400000000000000e6
+747 3 4 5 -0.26214400000000000000e6
+748 3 2 8 0.26214400000000000000e6
+748 5 2 9 -0.26214400000000000000e6
+749 1 10 13 0.26214400000000000000e6
+749 1 12 27 -0.52428800000000000000e6
+749 1 13 28 0.26214400000000000000e6
+749 1 15 18 -0.26214400000000000000e6
+749 1 21 28 -0.26214400000000000000e6
+749 1 25 28 -0.26214400000000000000e6
+749 2 6 8 0.26214400000000000000e6
+749 2 8 10 -0.26214400000000000000e6
+749 2 12 14 -0.26214400000000000000e6
+749 3 2 9 0.26214400000000000000e6
+749 5 7 10 -0.26214400000000000000e6
+750 3 2 10 0.26214400000000000000e6
+750 7 1 10 -0.26214400000000000000e6
+751 1 6 21 -0.26214400000000000000e6
+751 3 2 11 0.26214400000000000000e6
+752 3 2 12 0.26214400000000000000e6
+752 5 2 13 -0.26214400000000000000e6
+753 1 1 24 0.26214400000000000000e6
+753 1 30 33 -0.26214400000000000000e6
+753 2 9 15 0.26214400000000000000e6
+753 3 2 13 0.26214400000000000000e6
+753 4 1 5 0.26214400000000000000e6
+753 7 13 14 0.26214400000000000000e6
+754 1 2 9 -0.26214400000000000000e6
+754 3 2 14 0.26214400000000000000e6
+754 5 1 4 -0.26214400000000000000e6
+754 6 1 3 -0.26214400000000000000e6
+755 1 2 33 -0.26214400000000000000e6
+755 3 2 15 0.26214400000000000000e6
+756 3 3 3 0.26214400000000000000e6
+756 7 2 3 -0.13107200000000000000e6
+757 1 2 9 -0.26214400000000000000e6
+757 3 3 4 0.26214400000000000000e6
+758 3 3 5 0.26214400000000000000e6
+758 7 3 4 -0.26214400000000000000e6
+759 3 3 6 0.26214400000000000000e6
+759 7 4 5 -0.26214400000000000000e6
+760 3 3 7 0.26214400000000000000e6
+760 5 2 9 -0.26214400000000000000e6
+761 1 6 13 -0.26214400000000000000e6
+761 3 3 8 0.26214400000000000000e6
+762 1 7 14 -0.26214400000000000000e6
+762 3 3 9 0.26214400000000000000e6
+763 3 3 10 0.26214400000000000000e6
+763 7 7 8 -0.26214400000000000000e6
+764 3 3 11 0.26214400000000000000e6
+764 5 2 13 -0.26214400000000000000e6
+765 1 7 22 -0.26214400000000000000e6
+765 3 3 12 0.26214400000000000000e6
+766 1 8 23 -0.26214400000000000000e6
+766 3 3 13 0.26214400000000000000e6
+767 3 3 14 0.26214400000000000000e6
+767 5 9 12 -0.26214400000000000000e6
+768 3 3 15 0.26214400000000000000e6
+768 7 11 12 -0.26214400000000000000e6
+769 3 1 6 -0.13107200000000000000e6
+769 3 4 4 0.26214400000000000000e6
+770 1 9 10 0.26214400000000000000e6
+770 1 10 29 -0.26214400000000000000e6
+770 2 6 6 0.52428800000000000000e6
+770 3 4 6 0.26214400000000000000e6
+771 1 1 16 -0.26214400000000000000e6
+771 3 4 7 0.26214400000000000000e6
+772 1 10 13 0.26214400000000000000e6
+772 1 12 27 -0.52428800000000000000e6
+772 1 13 28 0.26214400000000000000e6
+772 1 15 18 -0.26214400000000000000e6
+772 1 21 28 -0.26214400000000000000e6
+772 1 25 28 -0.26214400000000000000e6
+772 2 6 8 0.26214400000000000000e6
+772 2 8 10 -0.26214400000000000000e6
+772 2 12 14 -0.26214400000000000000e6
+772 3 4 8 0.26214400000000000000e6
+772 5 7 10 -0.26214400000000000000e6
+773 1 10 29 -0.26214400000000000000e6
+773 1 11 26 0.52428800000000000000e6
+773 1 15 16 0.26214400000000000000e6
+773 1 16 35 0.26214400000000000000e6
+773 2 9 9 0.52428800000000000000e6
+773 3 4 10 0.26214400000000000000e6
+773 7 5 14 -0.26214400000000000000e6
+774 1 5 24 -0.26214400000000000000e6
+774 3 4 11 0.26214400000000000000e6
+775 1 1 24 0.26214400000000000000e6
+775 1 30 33 -0.26214400000000000000e6
+775 2 9 15 0.26214400000000000000e6
+775 3 4 12 0.26214400000000000000e6
+775 4 1 5 0.26214400000000000000e6
+775 7 13 14 0.26214400000000000000e6
+776 3 4 13 0.26214400000000000000e6
+776 3 6 11 -0.26214400000000000000e6
+777 1 11 26 -0.26214400000000000000e6
+777 3 4 14 0.26214400000000000000e6
+778 1 8 31 -0.26214400000000000000e6
+778 3 4 15 0.26214400000000000000e6
+779 3 5 5 0.26214400000000000000e6
+779 7 4 5 -0.13107200000000000000e6
+780 1 10 13 0.26214400000000000000e6
+780 1 12 27 -0.52428800000000000000e6
+780 1 13 28 0.26214400000000000000e6
+780 1 15 18 -0.26214400000000000000e6
+780 1 21 28 -0.26214400000000000000e6
+780 1 25 28 -0.26214400000000000000e6
+780 2 6 8 0.26214400000000000000e6
+780 2 8 10 -0.26214400000000000000e6
+780 2 12 14 -0.26214400000000000000e6
+780 3 5 7 0.26214400000000000000e6
+780 5 7 10 -0.26214400000000000000e6
+781 1 7 14 -0.26214400000000000000e6
+781 3 5 8 0.26214400000000000000e6
+782 3 5 9 0.26214400000000000000e6
+782 7 6 7 -0.26214400000000000000e6
+783 1 1 24 0.26214400000000000000e6
+783 1 30 33 -0.26214400000000000000e6
+783 2 9 15 0.26214400000000000000e6
+783 3 5 11 0.26214400000000000000e6
+783 4 1 5 0.26214400000000000000e6
+783 7 13 14 0.26214400000000000000e6
+784 1 8 23 -0.26214400000000000000e6
+784 3 5 12 0.26214400000000000000e6
+785 3 5 13 0.26214400000000000000e6
+785 7 4 13 -0.26214400000000000000e6
+786 3 5 14 0.26214400000000000000e6
+786 3 8 13 -0.26214400000000000000e6
+787 3 5 15 0.26214400000000000000e6
+787 3 12 13 -0.26214400000000000000e6
+788 1 10 17 -0.13107200000000000000e6
+788 3 1 6 -0.26214400000000000000e6
+788 3 6 6 0.26214400000000000000e6
+788 3 6 15 -0.13107200000000000000e6
+788 7 4 5 0.13107200000000000000e6
+789 3 4 9 -0.26214400000000000000e6
+789 3 6 7 0.26214400000000000000e6
+790 3 6 8 0.26214400000000000000e6
+790 7 6 7 -0.26214400000000000000e6
+791 1 1 16 -0.52428800000000000000e6
+791 1 7 14 0.26214400000000000000e6
+791 1 16 31 -0.26214400000000000000e6
+791 3 6 9 0.26214400000000000000e6
+791 3 9 10 -0.26214400000000000000e6
+792 1 10 17 -0.26214400000000000000e6
+792 3 6 10 0.26214400000000000000e6
+793 3 6 12 0.26214400000000000000e6
+793 7 4 13 -0.26214400000000000000e6
+794 1 5 24 -0.52428800000000000000e6
+794 1 8 23 0.26214400000000000000e6
+794 1 8 35 -0.26214400000000000000e6
+794 1 14 29 -0.26214400000000000000e6
+794 3 6 13 0.26214400000000000000e6
+795 2 4 6 -0.26214400000000000000e6
+795 3 1 6 -0.26214400000000000000e6
+795 3 5 6 -0.26214400000000000000e6
+795 3 6 14 0.26214400000000000000e6
+796 2 4 6 -0.13107200000000000000e6
+796 2 4 10 0.13107200000000000000e6
+796 3 1 6 -0.13107200000000000000e6
+796 3 1 14 0.26214400000000000000e6
+796 3 5 6 -0.13107200000000000000e6
+796 3 5 10 0.13107200000000000000e6
+796 3 7 7 0.26214400000000000000e6
+796 3 14 15 0.13107200000000000000e6
+796 5 9 12 -0.13107200000000000000e6
+797 3 7 8 0.26214400000000000000e6
+797 7 1 10 -0.26214400000000000000e6
+798 1 10 29 -0.26214400000000000000e6
+798 1 11 26 0.52428800000000000000e6
+798 1 15 16 0.26214400000000000000e6
+798 1 16 35 0.26214400000000000000e6
+798 2 9 9 0.52428800000000000000e6
+798 3 7 9 0.26214400000000000000e6
+798 7 5 14 -0.26214400000000000000e6
+799 1 5 20 -0.26214400000000000000e6
+799 3 7 10 0.26214400000000000000e6
+800 3 1 14 -0.26214400000000000000e6
+800 3 7 11 0.26214400000000000000e6
+801 1 2 9 -0.26214400000000000000e6
+801 3 7 12 0.26214400000000000000e6
+801 5 1 4 -0.26214400000000000000e6
+801 6 1 3 -0.26214400000000000000e6
+802 1 11 26 -0.26214400000000000000e6
+802 3 7 13 0.26214400000000000000e6
+803 1 17 24 -0.26214400000000000000e6
+803 3 7 14 0.26214400000000000000e6
+804 1 30 33 -0.26214400000000000000e6
+804 2 9 15 0.26214400000000000000e6
+804 3 7 15 0.26214400000000000000e6
+804 7 13 14 0.26214400000000000000e6
+805 3 8 8 0.26214400000000000000e6
+805 7 7 8 -0.13107200000000000000e6
+806 3 5 10 -0.26214400000000000000e6
+806 3 8 9 0.26214400000000000000e6
+807 1 12 19 -0.26214400000000000000e6
+807 3 8 10 0.26214400000000000000e6
+808 1 2 9 -0.26214400000000000000e6
+808 3 8 11 0.26214400000000000000e6
+808 5 1 4 -0.26214400000000000000e6
+808 6 1 3 -0.26214400000000000000e6
+809 3 8 12 0.26214400000000000000e6
+809 5 9 12 -0.26214400000000000000e6
+810 3 8 14 0.26214400000000000000e6
+810 5 10 13 -0.26214400000000000000e6
+811 1 22 29 -0.26214400000000000000e6
+811 3 8 15 0.26214400000000000000e6
+812 1 10 17 -0.13107200000000000000e6
+812 3 9 9 0.26214400000000000000e6
+813 1 11 26 -0.26214400000000000000e6
+813 3 9 11 0.26214400000000000000e6
+814 3 8 13 -0.26214400000000000000e6
+814 3 9 12 0.26214400000000000000e6
+815 2 4 6 -0.26214400000000000000e6
+815 3 1 6 -0.26214400000000000000e6
+815 3 5 6 -0.26214400000000000000e6
+815 3 9 13 0.26214400000000000000e6
+816 1 14 29 -0.26214400000000000000e6
+816 3 9 14 0.26214400000000000000e6
+817 1 16 31 -0.26214400000000000000e6
+817 3 9 15 0.26214400000000000000e6
+818 1 10 17 -0.13107200000000000000e6
+818 2 4 6 0.26214400000000000000e6
+818 2 4 10 -0.26214400000000000000e6
+818 3 1 6 0.26214400000000000000e6
+818 3 1 14 -0.52428800000000000000e6
+818 3 5 6 0.26214400000000000000e6
+818 3 5 10 -0.26214400000000000000e6
+818 3 10 10 0.26214400000000000000e6
+818 3 10 15 0.13107200000000000000e6
+818 3 14 15 -0.26214400000000000000e6
+818 5 9 12 0.26214400000000000000e6
+818 7 7 8 -0.13107200000000000000e6
+819 1 17 24 -0.26214400000000000000e6
+819 3 10 11 0.26214400000000000000e6
+820 3 10 12 0.26214400000000000000e6
+820 5 10 13 -0.26214400000000000000e6
+821 1 14 29 -0.26214400000000000000e6
+821 3 10 13 0.26214400000000000000e6
+822 2 4 6 -0.26214400000000000000e6
+822 3 1 6 -0.26214400000000000000e6
+822 3 1 14 0.52428800000000000000e6
+822 3 5 6 -0.26214400000000000000e6
+822 3 10 14 0.26214400000000000000e6
+822 3 14 15 0.26214400000000000000e6
+822 5 9 12 -0.26214400000000000000e6
+823 2 11 13 0.13107200000000000000e6
+823 3 11 11 0.26214400000000000000e6
+823 3 12 13 0.13107200000000000000e6
+823 3 14 15 -0.13107200000000000000e6
+824 1 2 33 -0.26214400000000000000e6
+824 3 11 12 0.26214400000000000000e6
+825 1 8 31 -0.26214400000000000000e6
+825 3 11 13 0.26214400000000000000e6
+826 1 30 33 -0.26214400000000000000e6
+826 2 9 15 0.26214400000000000000e6
+826 3 11 14 0.26214400000000000000e6
+826 7 13 14 0.26214400000000000000e6
+827 1 24 31 -0.26214400000000000000e6
+827 3 11 15 0.26214400000000000000e6
+828 3 12 12 0.26214400000000000000e6
+828 7 11 12 -0.13107200000000000000e6
+829 1 22 29 -0.26214400000000000000e6
+829 3 12 14 0.26214400000000000000e6
+830 1 6 21 0.52428800000000000000e6
+830 1 7 22 -0.26214400000000000000e6
+830 3 12 15 0.26214400000000000000e6
+830 5 10 13 0.26214400000000000000e6
+830 7 4 13 -0.26214400000000000000e6
+831 3 6 15 -0.13107200000000000000e6
+831 3 13 13 0.26214400000000000000e6
+832 1 16 31 -0.26214400000000000000e6
+832 3 13 14 0.26214400000000000000e6
+833 1 8 35 -0.26214400000000000000e6
+833 3 13 15 0.26214400000000000000e6
+834 3 10 15 -0.13107200000000000000e6
+834 3 14 14 0.26214400000000000000e6
+835 2 11 13 -0.26214400000000000000e6
+835 3 6 15 -0.13107200000000000000e6
+835 3 10 15 0.13107200000000000000e6
+835 3 12 13 -0.26214400000000000000e6
+835 3 14 15 0.26214400000000000000e6
+835 3 15 15 0.26214400000000000000e6
+835 7 11 12 -0.13107200000000000000e6
+836 4 1 2 0.26214400000000000000e6
+836 6 1 3 -0.26214400000000000000e6
+837 1 1 8 0.26214400000000000000e6
+837 1 11 26 -0.26214400000000000000e6
+837 3 4 5 0.26214400000000000000e6
+837 4 1 3 0.26214400000000000000e6
+838 2 1 9 -0.26214400000000000000e6
+838 4 1 4 0.26214400000000000000e6
+839 4 2 2 0.26214400000000000000e6
+839 5 9 12 -0.13107200000000000000e6
+839 7 1 2 0.13107200000000000000e6
+839 7 3 4 0.13107200000000000000e6
+840 3 5 6 0.13107200000000000000e6
+840 3 5 10 -0.13107200000000000000e6
+840 3 8 13 -0.26214400000000000000e6
+840 3 12 13 -0.13107200000000000000e6
+840 4 2 3 0.26214400000000000000e6
+840 7 3 4 0.13107200000000000000e6
+840 7 4 5 0.26214400000000000000e6
+841 1 7 14 0.26214400000000000000e6
+841 3 2 7 0.26214400000000000000e6
+841 4 2 4 0.26214400000000000000e6
+841 5 10 13 -0.26214400000000000000e6
+842 1 6 21 0.26214400000000000000e6
+842 1 8 23 0.26214400000000000000e6
+842 1 22 29 -0.26214400000000000000e6
+842 4 2 5 0.26214400000000000000e6
+843 2 4 6 -0.13107200000000000000e6
+843 4 3 3 0.26214400000000000000e6
+844 1 1 16 0.26214400000000000000e6
+844 1 14 29 -0.26214400000000000000e6
+844 4 3 4 0.26214400000000000000e6
+844 7 6 7 0.26214400000000000000e6
+845 1 5 24 0.26214400000000000000e6
+845 1 16 31 -0.26214400000000000000e6
+845 4 3 5 0.26214400000000000000e6
+845 7 4 13 0.26214400000000000000e6
+846 2 4 10 -0.13107200000000000000e6
+846 4 4 4 0.26214400000000000000e6
+847 3 1 14 0.26214400000000000000e6
+847 3 8 13 0.26214400000000000000e6
+847 3 10 15 -0.26214400000000000000e6
+847 4 4 5 0.26214400000000000000e6
+848 2 11 13 -0.13107200000000000000e6
+848 4 5 5 0.26214400000000000000e6
+849 1 1 4 -0.65536000000000000000e5
+849 1 1 32 0.65536000000000000000e5
+849 1 2 17 0.65536000000000000000e5
+849 3 5 6 -0.32768000000000000000e5
+849 3 5 10 0.32768000000000000000e5
+849 3 12 13 0.32768000000000000000e5
+849 5 1 1 0.26214400000000000000e6
+849 7 3 4 -0.32768000000000000000e5
+850 2 1 3 0.26214400000000000000e6
+850 5 1 2 0.26214400000000000000e6
+850 5 2 5 0.26214400000000000000e6
+850 5 8 11 -0.26214400000000000000e6
+851 1 1 4 -0.26214400000000000000e6
+851 5 1 3 0.26214400000000000000e6
+852 5 1 5 0.26214400000000000000e6
+852 7 1 2 -0.26214400000000000000e6
+853 3 5 6 -0.13107200000000000000e6
+853 3 5 10 0.13107200000000000000e6
+853 3 12 13 0.13107200000000000000e6
+853 5 1 6 0.26214400000000000000e6
+853 7 3 4 -0.13107200000000000000e6
+854 1 4 11 -0.13107200000000000000e6
+854 1 10 13 0.13107200000000000000e6
+854 1 12 27 -0.26214400000000000000e6
+854 1 13 28 0.13107200000000000000e6
+854 1 15 18 -0.13107200000000000000e6
+854 1 25 28 -0.13107200000000000000e6
+854 2 6 8 0.13107200000000000000e6
+854 2 8 10 -0.13107200000000000000e6
+854 2 12 14 -0.13107200000000000000e6
+854 5 1 7 0.26214400000000000000e6
+855 3 2 7 -0.26214400000000000000e6
+855 5 1 9 0.26214400000000000000e6
+856 1 2 17 -0.26214400000000000000e6
+856 5 1 10 0.26214400000000000000e6
+857 1 2 21 -0.26214400000000000000e6
+857 5 1 11 0.26214400000000000000e6
+858 1 6 21 -0.26214400000000000000e6
+858 5 1 13 0.26214400000000000000e6
+859 1 11 22 -0.26214400000000000000e6
+859 5 1 14 0.26214400000000000000e6
+860 1 1 32 -0.26214400000000000000e6
+860 5 1 15 0.26214400000000000000e6
+861 1 1 4 -0.13107200000000000000e6
+861 5 2 2 0.26214400000000000000e6
+862 1 4 7 0.26214400000000000000e6
+862 1 20 23 -0.26214400000000000000e6
+862 1 23 34 -0.26214400000000000000e6
+862 2 1 3 0.52428800000000000000e6
+862 2 5 5 -0.52428800000000000000e6
+862 2 8 8 0.52428800000000000000e6
+862 2 12 12 0.52428800000000000000e6
+862 5 2 3 0.26214400000000000000e6
+862 5 8 11 -0.52428800000000000000e6
+862 7 5 14 0.26214400000000000000e6
+863 5 2 4 0.26214400000000000000e6
+863 7 1 2 -0.26214400000000000000e6
+864 1 2 9 -0.26214400000000000000e6
+864 5 2 6 0.26214400000000000000e6
+865 5 1 8 -0.26214400000000000000e6
+865 5 2 7 0.26214400000000000000e6
+866 1 4 11 -0.26214400000000000000e6
+866 5 2 8 0.26214400000000000000e6
+867 1 4 19 0.26214400000000000000e6
+867 1 20 23 -0.26214400000000000000e6
+867 2 8 8 0.52428800000000000000e6
+867 5 2 10 0.26214400000000000000e6
+868 5 1 12 -0.26214400000000000000e6
+868 5 2 11 0.26214400000000000000e6
+869 1 3 22 -0.26214400000000000000e6
+869 5 2 12 0.26214400000000000000e6
+870 5 2 14 0.26214400000000000000e6
+870 5 8 11 -0.26214400000000000000e6
+871 1 2 9 -0.26214400000000000000e6
+871 1 4 7 0.26214400000000000000e6
+871 1 4 19 -0.26214400000000000000e6
+871 1 23 34 -0.26214400000000000000e6
+871 2 5 5 -0.52428800000000000000e6
+871 2 12 12 0.52428800000000000000e6
+871 5 2 5 -0.52428800000000000000e6
+871 5 2 15 0.26214400000000000000e6
+871 7 5 14 0.26214400000000000000e6
+872 1 3 4 -0.13107200000000000000e6
+872 5 3 3 0.26214400000000000000e6
+873 5 2 5 -0.26214400000000000000e6
+873 5 3 4 0.26214400000000000000e6
+874 5 3 5 0.26214400000000000000e6
+874 7 2 3 -0.26214400000000000000e6
+875 5 3 6 0.26214400000000000000e6
+875 7 3 4 -0.26214400000000000000e6
+876 1 4 11 -0.26214400000000000000e6
+876 5 3 7 0.26214400000000000000e6
+877 1 3 20 -0.26214400000000000000e6
+877 1 3 34 -0.26214400000000000000e6
+877 1 7 14 0.26214400000000000000e6
+877 5 1 8 -0.52428800000000000000e6
+877 5 3 8 0.26214400000000000000e6
+878 1 6 13 -0.26214400000000000000e6
+878 5 3 9 0.26214400000000000000e6
+879 1 3 18 -0.26214400000000000000e6
+879 5 3 10 0.26214400000000000000e6
+880 1 3 22 -0.26214400000000000000e6
+880 5 3 11 0.26214400000000000000e6
+881 1 6 13 -0.26214400000000000000e6
+881 1 8 23 0.26214400000000000000e6
+881 2 2 8 -0.26214400000000000000e6
+881 5 1 8 -0.26214400000000000000e6
+881 5 1 12 -0.52428800000000000000e6
+881 5 3 12 0.26214400000000000000e6
+881 5 12 15 -0.26214400000000000000e6
+882 1 7 22 -0.26214400000000000000e6
+882 5 3 13 0.26214400000000000000e6
+883 1 4 31 -0.26214400000000000000e6
+883 5 3 15 0.26214400000000000000e6
+884 3 5 6 -0.65536000000000000000e5
+884 3 5 10 0.65536000000000000000e5
+884 3 12 13 0.65536000000000000000e5
+884 5 4 4 0.26214400000000000000e6
+884 7 3 4 -0.65536000000000000000e5
+885 1 2 9 -0.26214400000000000000e6
+885 5 4 5 0.26214400000000000000e6
+886 3 4 5 -0.26214400000000000000e6
+886 5 4 6 0.26214400000000000000e6
+887 3 2 7 -0.26214400000000000000e6
+887 5 4 7 0.26214400000000000000e6
+888 5 2 9 -0.26214400000000000000e6
+888 5 4 8 0.26214400000000000000e6
+889 1 10 13 0.26214400000000000000e6
+889 1 12 27 -0.52428800000000000000e6
+889 1 13 28 0.26214400000000000000e6
+889 1 15 18 -0.26214400000000000000e6
+889 1 21 28 -0.26214400000000000000e6
+889 1 25 28 -0.26214400000000000000e6
+889 2 6 8 0.26214400000000000000e6
+889 2 8 10 -0.26214400000000000000e6
+889 2 12 14 -0.26214400000000000000e6
+889 5 4 9 0.26214400000000000000e6
+889 5 7 10 -0.26214400000000000000e6
+890 5 4 10 0.26214400000000000000e6
+890 7 1 10 -0.26214400000000000000e6
+891 1 6 21 -0.26214400000000000000e6
+891 5 4 11 0.26214400000000000000e6
+892 5 2 13 -0.26214400000000000000e6
+892 5 4 12 0.26214400000000000000e6
+893 1 1 24 0.26214400000000000000e6
+893 1 30 33 -0.26214400000000000000e6
+893 2 9 15 0.26214400000000000000e6
+893 4 1 5 0.26214400000000000000e6
+893 5 4 13 0.26214400000000000000e6
+893 7 13 14 0.26214400000000000000e6
+894 1 2 9 -0.26214400000000000000e6
+894 5 1 4 -0.26214400000000000000e6
+894 5 4 14 0.26214400000000000000e6
+894 6 1 3 -0.26214400000000000000e6
+895 1 2 33 -0.26214400000000000000e6
+895 5 4 15 0.26214400000000000000e6
+896 5 5 5 0.26214400000000000000e6
+896 7 3 4 -0.13107200000000000000e6
+897 5 5 6 0.26214400000000000000e6
+897 7 4 5 -0.26214400000000000000e6
+898 5 2 9 -0.26214400000000000000e6
+898 5 5 7 0.26214400000000000000e6
+899 1 6 13 -0.26214400000000000000e6
+899 5 5 8 0.26214400000000000000e6
+900 1 7 14 -0.26214400000000000000e6
+900 5 5 9 0.26214400000000000000e6
+901 5 5 10 0.26214400000000000000e6
+901 7 7 8 -0.26214400000000000000e6
+902 5 2 13 -0.26214400000000000000e6
+902 5 5 11 0.26214400000000000000e6
+903 1 7 22 -0.26214400000000000000e6
+903 5 5 12 0.26214400000000000000e6
+904 1 8 23 -0.26214400000000000000e6
+904 5 5 13 0.26214400000000000000e6
+905 5 5 14 0.26214400000000000000e6
+905 5 9 12 -0.26214400000000000000e6
+906 5 5 15 0.26214400000000000000e6
+906 7 11 12 -0.26214400000000000000e6
+907 3 5 6 -0.13107200000000000000e6
+907 5 6 6 0.26214400000000000000e6
+908 1 10 13 0.26214400000000000000e6
+908 1 12 27 -0.52428800000000000000e6
+908 1 13 28 0.26214400000000000000e6
+908 1 15 18 -0.26214400000000000000e6
+908 1 21 28 -0.26214400000000000000e6
+908 1 25 28 -0.26214400000000000000e6
+908 2 6 8 0.26214400000000000000e6
+908 2 8 10 -0.26214400000000000000e6
+908 2 12 14 -0.26214400000000000000e6
+908 5 6 7 0.26214400000000000000e6
+908 5 7 10 -0.26214400000000000000e6
+909 1 7 14 -0.26214400000000000000e6
+909 5 6 8 0.26214400000000000000e6
+910 5 6 9 0.26214400000000000000e6
+910 7 6 7 -0.26214400000000000000e6
+911 3 5 10 -0.26214400000000000000e6
+911 5 6 10 0.26214400000000000000e6
+912 1 1 24 0.26214400000000000000e6
+912 1 30 33 -0.26214400000000000000e6
+912 2 9 15 0.26214400000000000000e6
+912 4 1 5 0.26214400000000000000e6
+912 5 6 11 0.26214400000000000000e6
+912 7 13 14 0.26214400000000000000e6
+913 1 8 23 -0.26214400000000000000e6
+913 5 6 12 0.26214400000000000000e6
+914 5 6 13 0.26214400000000000000e6
+914 7 4 13 -0.26214400000000000000e6
+915 3 8 13 -0.26214400000000000000e6
+915 5 6 14 0.26214400000000000000e6
+916 3 12 13 -0.26214400000000000000e6
+916 5 6 15 0.26214400000000000000e6
+917 1 2 17 -0.13107200000000000000e6
+917 5 7 7 0.26214400000000000000e6
+918 1 4 19 0.26214400000000000000e6
+918 1 20 23 -0.26214400000000000000e6
+918 2 8 8 0.52428800000000000000e6
+918 5 7 8 0.26214400000000000000e6
+919 5 7 9 0.26214400000000000000e6
+919 7 1 10 -0.26214400000000000000e6
+920 1 11 22 -0.26214400000000000000e6
+920 5 7 11 0.26214400000000000000e6
+921 5 7 12 0.26214400000000000000e6
+921 5 8 11 -0.26214400000000000000e6
+922 1 2 9 -0.26214400000000000000e6
+922 5 1 4 -0.26214400000000000000e6
+922 5 7 13 0.26214400000000000000e6
+922 6 1 3 -0.26214400000000000000e6
+923 1 12 27 -0.26214400000000000000e6
+923 5 7 14 0.26214400000000000000e6
+924 1 21 28 -0.26214400000000000000e6
+924 5 7 15 0.26214400000000000000e6
+925 1 3 18 -0.13107200000000000000e6
+925 5 8 8 0.26214400000000000000e6
+926 5 8 9 0.26214400000000000000e6
+926 7 7 8 -0.26214400000000000000e6
+927 1 3 20 -0.26214400000000000000e6
+927 5 8 10 0.26214400000000000000e6
+928 5 3 14 -0.26214400000000000000e6
+928 5 8 12 0.26214400000000000000e6
+929 5 8 13 0.26214400000000000000e6
+929 5 9 12 -0.26214400000000000000e6
+930 1 6 13 -0.26214400000000000000e6
+930 2 2 8 -0.26214400000000000000e6
+930 5 1 8 -0.26214400000000000000e6
+930 5 8 14 0.26214400000000000000e6
+931 1 3 34 -0.26214400000000000000e6
+931 5 8 15 0.26214400000000000000e6
+932 3 5 10 -0.13107200000000000000e6
+932 5 9 9 0.26214400000000000000e6
+933 1 12 19 -0.26214400000000000000e6
+933 5 9 10 0.26214400000000000000e6
+934 1 2 9 -0.26214400000000000000e6
+934 5 1 4 -0.26214400000000000000e6
+934 5 9 11 0.26214400000000000000e6
+934 6 1 3 -0.26214400000000000000e6
+935 3 8 13 -0.26214400000000000000e6
+935 5 9 13 0.26214400000000000000e6
+936 5 9 14 0.26214400000000000000e6
+936 5 10 13 -0.26214400000000000000e6
+937 1 22 29 -0.26214400000000000000e6
+937 5 9 15 0.26214400000000000000e6
+938 1 2 17 0.26214400000000000000e6
+938 1 3 18 -0.13107200000000000000e6
+938 1 17 32 0.13107200000000000000e6
+938 3 5 10 -0.13107200000000000000e6
+938 5 10 10 0.26214400000000000000e6
+939 1 12 27 -0.26214400000000000000e6
+939 5 10 11 0.26214400000000000000e6
+940 1 6 13 -0.26214400000000000000e6
+940 2 2 8 -0.26214400000000000000e6
+940 5 1 8 -0.26214400000000000000e6
+940 5 10 12 0.26214400000000000000e6
+941 1 17 28 -0.26214400000000000000e6
+941 5 10 14 0.26214400000000000000e6
+942 1 17 32 -0.26214400000000000000e6
+942 5 10 15 0.26214400000000000000e6
+943 1 1 32 -0.13107200000000000000e6
+943 5 11 11 0.26214400000000000000e6
+944 1 2 9 -0.26214400000000000000e6
+944 1 4 7 0.26214400000000000000e6
+944 1 4 19 -0.26214400000000000000e6
+944 1 23 34 -0.26214400000000000000e6
+944 2 5 5 -0.52428800000000000000e6
+944 2 12 12 0.52428800000000000000e6
+944 5 2 5 -0.52428800000000000000e6
+944 5 11 12 0.26214400000000000000e6
+944 7 5 14 0.26214400000000000000e6
+945 1 2 33 -0.26214400000000000000e6
+945 5 11 13 0.26214400000000000000e6
+946 1 21 28 -0.26214400000000000000e6
+946 5 11 14 0.26214400000000000000e6
+947 1 1 24 0.26214400000000000000e6
+947 1 2 21 0.52428800000000000000e6
+947 1 3 22 -0.26214400000000000000e6
+947 1 12 27 0.26214400000000000000e6
+947 1 30 33 -0.26214400000000000000e6
+947 2 9 15 0.26214400000000000000e6
+947 4 1 5 0.26214400000000000000e6
+947 5 11 15 0.26214400000000000000e6
+947 7 13 14 0.26214400000000000000e6
+948 1 4 31 -0.13107200000000000000e6
+948 5 12 12 0.26214400000000000000e6
+949 5 12 13 0.26214400000000000000e6
+949 7 11 12 -0.26214400000000000000e6
+950 1 3 34 -0.26214400000000000000e6
+950 5 12 14 0.26214400000000000000e6
+951 3 12 13 -0.13107200000000000000e6
+951 5 13 13 0.26214400000000000000e6
+952 1 22 29 -0.26214400000000000000e6
+952 5 13 14 0.26214400000000000000e6
+953 1 6 21 0.52428800000000000000e6
+953 1 7 22 -0.26214400000000000000e6
+953 5 10 13 0.26214400000000000000e6
+953 5 13 15 0.26214400000000000000e6
+953 7 4 13 -0.26214400000000000000e6
+954 1 17 32 -0.13107200000000000000e6
+954 5 14 14 0.26214400000000000000e6
+955 1 12 35 -0.26214400000000000000e6
+955 5 14 15 0.26214400000000000000e6
+956 1 1 32 0.26214400000000000000e6
+956 1 4 31 -0.13107200000000000000e6
+956 1 17 32 0.13107200000000000000e6
+956 3 12 13 -0.13107200000000000000e6
+956 5 15 15 0.26214400000000000000e6
+957 1 1 4 0.65536000000000000000e5
+957 1 1 32 -0.65536000000000000000e5
+957 1 2 17 -0.65536000000000000000e5
+957 1 11 22 -0.13107200000000000000e6
+957 3 5 6 0.32768000000000000000e5
+957 3 5 10 -0.32768000000000000000e5
+957 3 12 13 -0.32768000000000000000e5
+957 6 1 1 0.26214400000000000000e6
+957 7 1 2 0.13107200000000000000e6
+957 7 3 4 0.32768000000000000000e5
+958 2 1 3 -0.26214400000000000000e6
+958 6 1 2 0.26214400000000000000e6
+959 1 4 11 0.13107200000000000000e6
+959 1 10 13 -0.13107200000000000000e6
+959 1 13 28 -0.13107200000000000000e6
+959 1 15 18 0.13107200000000000000e6
+959 1 25 28 0.13107200000000000000e6
+959 2 6 8 -0.13107200000000000000e6
+959 2 8 10 0.13107200000000000000e6
+959 2 12 14 0.13107200000000000000e6
+959 5 2 9 0.26214400000000000000e6
+959 6 1 4 0.26214400000000000000e6
+960 1 2 21 0.26214400000000000000e6
+960 1 21 28 -0.26214400000000000000e6
+960 5 2 13 0.26214400000000000000e6
+960 6 1 5 0.26214400000000000000e6
+961 1 1 4 0.13107200000000000000e6
+961 5 3 14 -0.13107200000000000000e6
+961 6 2 2 0.26214400000000000000e6
+961 7 2 3 0.13107200000000000000e6
+962 5 9 12 -0.26214400000000000000e6
+962 6 2 3 0.26214400000000000000e6
+962 7 1 2 0.26214400000000000000e6
+962 7 3 4 0.26214400000000000000e6
+963 2 2 8 -0.26214400000000000000e6
+963 6 2 4 0.26214400000000000000e6
+964 1 3 34 -0.26214400000000000000e6
+964 1 7 22 0.26214400000000000000e6
+964 5 1 12 0.26214400000000000000e6
+964 6 2 5 0.26214400000000000000e6
+965 3 5 6 0.65536000000000000000e5
+965 3 5 10 -0.65536000000000000000e5
+965 3 8 13 -0.13107200000000000000e6
+965 3 12 13 -0.65536000000000000000e5
+965 6 3 3 0.26214400000000000000e6
+965 7 3 4 0.65536000000000000000e5
+965 7 4 5 0.13107200000000000000e6
+966 1 7 14 0.26214400000000000000e6
+966 3 2 7 0.26214400000000000000e6
+966 5 10 13 -0.26214400000000000000e6
+966 6 3 4 0.26214400000000000000e6
+967 1 6 21 0.26214400000000000000e6
+967 1 8 23 0.26214400000000000000e6
+967 1 22 29 -0.26214400000000000000e6
+967 6 3 5 0.26214400000000000000e6
+968 1 2 17 0.13107200000000000000e6
+968 1 17 28 -0.13107200000000000000e6
+968 6 4 4 0.26214400000000000000e6
+968 7 7 8 0.13107200000000000000e6
+969 1 11 22 0.26214400000000000000e6
+969 1 17 32 -0.26214400000000000000e6
+969 5 9 12 0.26214400000000000000e6
+969 6 4 5 0.26214400000000000000e6
+970 1 1 32 0.13107200000000000000e6
+970 1 12 35 -0.13107200000000000000e6
+970 6 5 5 0.26214400000000000000e6
+970 7 11 12 0.13107200000000000000e6
+971 5 1 4 -0.13107200000000000000e6
+971 7 1 1 0.26214400000000000000e6
+972 5 2 5 -0.26214400000000000000e6
+972 7 1 3 0.26214400000000000000e6
+973 3 5 6 -0.13107200000000000000e6
+973 3 5 10 0.13107200000000000000e6
+973 3 12 13 0.13107200000000000000e6
+973 7 1 4 0.26214400000000000000e6
+973 7 3 4 -0.13107200000000000000e6
+974 1 2 9 -0.26214400000000000000e6
+974 7 1 5 0.26214400000000000000e6
+975 3 4 5 -0.26214400000000000000e6
+975 7 1 6 0.26214400000000000000e6
+976 3 2 7 -0.26214400000000000000e6
+976 7 1 7 0.26214400000000000000e6
+977 5 2 9 -0.26214400000000000000e6
+977 7 1 8 0.26214400000000000000e6
+978 1 10 13 0.26214400000000000000e6
+978 1 12 27 -0.52428800000000000000e6
+978 1 13 28 0.26214400000000000000e6
+978 1 15 18 -0.26214400000000000000e6
+978 1 21 28 -0.26214400000000000000e6
+978 1 25 28 -0.26214400000000000000e6
+978 2 6 8 0.26214400000000000000e6
+978 2 8 10 -0.26214400000000000000e6
+978 2 12 14 -0.26214400000000000000e6
+978 5 7 10 -0.26214400000000000000e6
+978 7 1 9 0.26214400000000000000e6
+979 1 6 21 -0.26214400000000000000e6
+979 7 1 11 0.26214400000000000000e6
+980 5 2 13 -0.26214400000000000000e6
+980 7 1 12 0.26214400000000000000e6
+981 1 1 24 0.26214400000000000000e6
+981 1 30 33 -0.26214400000000000000e6
+981 2 9 15 0.26214400000000000000e6
+981 4 1 5 0.26214400000000000000e6
+981 7 1 13 0.26214400000000000000e6
+981 7 13 14 0.26214400000000000000e6
+982 1 2 9 -0.26214400000000000000e6
+982 5 1 4 -0.26214400000000000000e6
+982 6 1 3 -0.26214400000000000000e6
+982 7 1 14 0.26214400000000000000e6
+983 1 2 33 -0.26214400000000000000e6
+983 7 1 15 0.26214400000000000000e6
+984 5 2 5 -0.13107200000000000000e6
+984 7 2 2 0.26214400000000000000e6
+985 1 2 9 -0.26214400000000000000e6
+985 7 2 4 0.26214400000000000000e6
+986 7 2 5 0.26214400000000000000e6
+986 7 3 4 -0.26214400000000000000e6
+987 7 2 6 0.26214400000000000000e6
+987 7 4 5 -0.26214400000000000000e6
+988 5 2 9 -0.26214400000000000000e6
+988 7 2 7 0.26214400000000000000e6
+989 1 6 13 -0.26214400000000000000e6
+989 7 2 8 0.26214400000000000000e6
+990 1 7 14 -0.26214400000000000000e6
+990 7 2 9 0.26214400000000000000e6
+991 7 2 10 0.26214400000000000000e6
+991 7 7 8 -0.26214400000000000000e6
+992 5 2 13 -0.26214400000000000000e6
+992 7 2 11 0.26214400000000000000e6
+993 1 7 22 -0.26214400000000000000e6
+993 7 2 12 0.26214400000000000000e6
+994 1 8 23 -0.26214400000000000000e6
+994 7 2 13 0.26214400000000000000e6
+995 5 9 12 -0.26214400000000000000e6
+995 7 2 14 0.26214400000000000000e6
+996 7 2 15 0.26214400000000000000e6
+996 7 11 12 -0.26214400000000000000e6
+997 1 4 7 -0.13107200000000000000e6
+997 7 3 3 0.26214400000000000000e6
+998 1 2 9 -0.52428800000000000000e6
+998 1 15 30 -0.26214400000000000000e6
+998 3 4 5 0.26214400000000000000e6
+998 5 1 4 -0.52428800000000000000e6
+998 5 2 5 0.26214400000000000000e6
+998 6 1 3 -0.52428800000000000000e6
+998 7 3 5 0.26214400000000000000e6
+998 7 5 6 0.26214400000000000000e6
+998 7 14 15 -0.26214400000000000000e6
+998 8 2 2 0.52428800000000000000e6
+998 8 3 3 0.52428800000000000000e6
+999 1 2 9 0.26214400000000000000e6
+999 2 5 5 0.52428800000000000000e6
+999 7 3 6 0.26214400000000000000e6
+999 7 5 14 -0.26214400000000000000e6
+1000 1 6 13 -0.26214400000000000000e6
+1000 7 3 7 0.26214400000000000000e6
+1001 1 4 15 -0.26214400000000000000e6
+1001 7 3 8 0.26214400000000000000e6
+1002 1 18 25 -0.26214400000000000000e6
+1002 2 3 9 0.26214400000000000000e6
+1002 5 2 9 0.26214400000000000000e6
+1002 7 3 9 0.26214400000000000000e6
+1003 1 4 19 -0.26214400000000000000e6
+1003 7 3 10 0.26214400000000000000e6
+1004 1 7 22 -0.26214400000000000000e6
+1004 7 3 11 0.26214400000000000000e6
+1005 1 3 22 -0.52428800000000000000e6
+1005 1 4 23 0.26214400000000000000e6
+1005 1 4 35 -0.26214400000000000000e6
+1005 1 13 28 -0.26214400000000000000e6
+1005 7 3 13 0.26214400000000000000e6
+1006 1 2 9 -0.52428800000000000000e6
+1006 1 15 30 -0.26214400000000000000e6
+1006 3 4 5 0.26214400000000000000e6
+1006 5 1 4 -0.52428800000000000000e6
+1006 6 1 3 -0.52428800000000000000e6
+1006 7 3 14 0.26214400000000000000e6
+1006 7 5 6 0.26214400000000000000e6
+1006 7 14 15 -0.26214400000000000000e6
+1006 8 3 3 0.52428800000000000000e6
+1007 1 2 9 0.26214400000000000000e6
+1007 1 4 7 -0.26214400000000000000e6
+1007 1 4 19 0.26214400000000000000e6
+1007 2 5 5 0.52428800000000000000e6
+1007 5 2 5 0.52428800000000000000e6
+1007 7 3 15 0.26214400000000000000e6
+1007 7 5 14 -0.26214400000000000000e6
+1008 3 4 5 -0.13107200000000000000e6
+1008 7 4 4 0.26214400000000000000e6
+1009 3 5 6 -0.26214400000000000000e6
+1009 7 4 6 0.26214400000000000000e6
+1010 1 10 13 0.26214400000000000000e6
+1010 1 12 27 -0.52428800000000000000e6
+1010 1 13 28 0.26214400000000000000e6
+1010 1 15 18 -0.26214400000000000000e6
+1010 1 21 28 -0.26214400000000000000e6
+1010 1 25 28 -0.26214400000000000000e6
+1010 2 6 8 0.26214400000000000000e6
+1010 2 8 10 -0.26214400000000000000e6
+1010 2 12 14 -0.26214400000000000000e6
+1010 5 7 10 -0.26214400000000000000e6
+1010 7 4 7 0.26214400000000000000e6
+1011 1 7 14 -0.26214400000000000000e6
+1011 7 4 8 0.26214400000000000000e6
+1012 7 4 9 0.26214400000000000000e6
+1012 7 6 7 -0.26214400000000000000e6
+1013 3 5 10 -0.26214400000000000000e6
+1013 7 4 10 0.26214400000000000000e6
+1014 1 1 24 0.26214400000000000000e6
+1014 1 30 33 -0.26214400000000000000e6
+1014 2 9 15 0.26214400000000000000e6
+1014 4 1 5 0.26214400000000000000e6
+1014 7 4 11 0.26214400000000000000e6
+1014 7 13 14 0.26214400000000000000e6
+1015 1 8 23 -0.26214400000000000000e6
+1015 7 4 12 0.26214400000000000000e6
+1016 3 8 13 -0.26214400000000000000e6
+1016 7 4 14 0.26214400000000000000e6
+1017 3 12 13 -0.26214400000000000000e6
+1017 7 4 15 0.26214400000000000000e6
+1018 1 2 9 0.13107200000000000000e6
+1018 2 5 5 0.26214400000000000000e6
+1018 7 5 5 0.26214400000000000000e6
+1018 7 5 14 -0.13107200000000000000e6
+1019 1 7 14 -0.26214400000000000000e6
+1019 7 5 7 0.26214400000000000000e6
+1020 1 18 25 -0.26214400000000000000e6
+1020 2 3 9 0.26214400000000000000e6
+1020 5 2 9 0.26214400000000000000e6
+1020 7 5 8 0.26214400000000000000e6
+1021 1 10 13 -0.26214400000000000000e6
+1021 7 5 9 0.26214400000000000000e6
+1022 1 15 30 -0.26214400000000000000e6
+1022 7 1 10 0.26214400000000000000e6
+1022 7 5 10 0.26214400000000000000e6
+1022 8 4 4 0.52428800000000000000e6
+1023 1 8 23 -0.26214400000000000000e6
+1023 7 5 11 0.26214400000000000000e6
+1024 1 3 22 -0.52428800000000000000e6
+1024 1 4 23 0.26214400000000000000e6
+1024 1 4 35 -0.26214400000000000000e6
+1024 1 13 28 -0.26214400000000000000e6
+1024 7 5 12 0.26214400000000000000e6
+1025 1 1 24 -0.26214400000000000000e6
+1025 1 30 33 0.26214400000000000000e6
+1025 2 6 12 0.26214400000000000000e6
+1025 2 9 15 -0.26214400000000000000e6
+1025 4 1 5 -0.26214400000000000000e6
+1025 7 5 13 0.26214400000000000000e6
+1025 7 13 14 -0.52428800000000000000e6
+1026 7 5 15 0.26214400000000000000e6
+1026 7 12 13 -0.26214400000000000000e6
+1027 1 9 10 -0.13107200000000000000e6
+1027 7 6 6 0.26214400000000000000e6
+1028 1 10 13 -0.26214400000000000000e6
+1028 7 6 8 0.26214400000000000000e6
+1029 1 9 16 -0.26214400000000000000e6
+1029 7 6 9 0.26214400000000000000e6
+1030 1 15 16 -0.26214400000000000000e6
+1030 7 6 10 0.26214400000000000000e6
+1031 7 4 13 -0.26214400000000000000e6
+1031 7 6 11 0.26214400000000000000e6
+1032 1 1 24 -0.26214400000000000000e6
+1032 1 30 33 0.26214400000000000000e6
+1032 2 6 12 0.26214400000000000000e6
+1032 2 9 15 -0.26214400000000000000e6
+1032 4 1 5 -0.26214400000000000000e6
+1032 7 6 12 0.26214400000000000000e6
+1032 7 13 14 -0.52428800000000000000e6
+1033 1 10 25 -0.26214400000000000000e6
+1033 7 6 13 0.26214400000000000000e6
+1034 3 4 5 -0.26214400000000000000e6
+1034 7 5 6 -0.26214400000000000000e6
+1034 7 6 14 0.26214400000000000000e6
+1034 8 3 3 -0.52428800000000000000e6
+1035 7 1 10 -0.13107200000000000000e6
+1035 7 7 7 0.26214400000000000000e6
+1036 3 5 10 -0.26214400000000000000e6
+1036 7 7 9 0.26214400000000000000e6
+1037 1 12 19 -0.26214400000000000000e6
+1037 7 7 10 0.26214400000000000000e6
+1038 1 2 9 -0.26214400000000000000e6
+1038 5 1 4 -0.26214400000000000000e6
+1038 6 1 3 -0.26214400000000000000e6
+1038 7 7 11 0.26214400000000000000e6
+1039 5 9 12 -0.26214400000000000000e6
+1039 7 7 12 0.26214400000000000000e6
+1040 3 8 13 -0.26214400000000000000e6
+1040 7 7 13 0.26214400000000000000e6
+1041 5 10 13 -0.26214400000000000000e6
+1041 7 7 14 0.26214400000000000000e6
+1042 1 22 29 -0.26214400000000000000e6
+1042 7 7 15 0.26214400000000000000e6
+1043 1 4 19 -0.13107200000000000000e6
+1043 7 8 8 0.26214400000000000000e6
+1044 1 15 30 -0.26214400000000000000e6
+1044 7 1 10 0.26214400000000000000e6
+1044 7 8 9 0.26214400000000000000e6
+1044 8 4 4 0.52428800000000000000e6
+1045 1 15 18 -0.26214400000000000000e6
+1045 7 8 10 0.26214400000000000000e6
+1046 5 9 12 -0.26214400000000000000e6
+1046 7 8 11 0.26214400000000000000e6
+1047 1 2 9 -0.52428800000000000000e6
+1047 1 15 30 -0.26214400000000000000e6
+1047 3 4 5 0.26214400000000000000e6
+1047 5 1 4 -0.52428800000000000000e6
+1047 6 1 3 -0.52428800000000000000e6
+1047 7 5 6 0.26214400000000000000e6
+1047 7 8 12 0.26214400000000000000e6
+1047 7 14 15 -0.26214400000000000000e6
+1047 8 3 3 0.52428800000000000000e6
+1048 7 5 14 -0.26214400000000000000e6
+1048 7 8 13 0.26214400000000000000e6
+1049 1 18 25 -0.26214400000000000000e6
+1049 7 8 14 0.26214400000000000000e6
+1050 1 25 28 -0.26214400000000000000e6
+1050 7 8 15 0.26214400000000000000e6
+1051 1 15 16 -0.13107200000000000000e6
+1051 7 9 9 0.26214400000000000000e6
+1052 3 8 13 -0.26214400000000000000e6
+1052 7 9 11 0.26214400000000000000e6
+1053 7 5 14 -0.26214400000000000000e6
+1053 7 9 12 0.26214400000000000000e6
+1054 3 4 5 -0.26214400000000000000e6
+1054 7 5 6 -0.26214400000000000000e6
+1054 7 9 13 0.26214400000000000000e6
+1054 8 3 3 -0.52428800000000000000e6
+1055 1 12 27 -0.52428800000000000000e6
+1055 1 13 28 0.26214400000000000000e6
+1055 1 15 18 -0.26214400000000000000e6
+1055 1 21 28 -0.26214400000000000000e6
+1055 1 25 28 -0.26214400000000000000e6
+1055 2 8 10 -0.26214400000000000000e6
+1055 2 12 14 -0.26214400000000000000e6
+1055 5 7 10 -0.26214400000000000000e6
+1055 7 9 14 0.26214400000000000000e6
+1056 7 9 15 0.26214400000000000000e6
+1056 7 13 14 -0.26214400000000000000e6
+1057 1 18 19 -0.13107200000000000000e6
+1057 7 10 10 0.26214400000000000000e6
+1058 5 10 13 -0.26214400000000000000e6
+1058 7 10 11 0.26214400000000000000e6
+1059 1 18 25 -0.26214400000000000000e6
+1059 7 10 12 0.26214400000000000000e6
+1060 1 12 27 -0.52428800000000000000e6
+1060 1 13 28 0.26214400000000000000e6
+1060 1 15 18 -0.26214400000000000000e6
+1060 1 21 28 -0.26214400000000000000e6
+1060 1 25 28 -0.26214400000000000000e6
+1060 2 8 10 -0.26214400000000000000e6
+1060 2 12 14 -0.26214400000000000000e6
+1060 5 7 10 -0.26214400000000000000e6
+1060 7 10 13 0.26214400000000000000e6
+1061 1 15 30 -0.26214400000000000000e6
+1061 7 10 14 0.26214400000000000000e6
+1062 1 18 33 -0.26214400000000000000e6
+1062 7 10 15 0.26214400000000000000e6
+1063 1 2 33 -0.13107200000000000000e6
+1063 7 11 11 0.26214400000000000000e6
+1064 3 12 13 -0.26214400000000000000e6
+1064 7 11 13 0.26214400000000000000e6
+1065 1 22 29 -0.26214400000000000000e6
+1065 7 11 14 0.26214400000000000000e6
+1066 1 6 21 0.52428800000000000000e6
+1066 1 7 22 -0.26214400000000000000e6
+1066 5 10 13 0.26214400000000000000e6
+1066 7 4 13 -0.26214400000000000000e6
+1066 7 11 15 0.26214400000000000000e6
+1067 1 2 9 0.13107200000000000000e6
+1067 1 4 7 -0.13107200000000000000e6
+1067 1 4 19 0.13107200000000000000e6
+1067 2 5 5 0.26214400000000000000e6
+1067 5 2 5 0.26214400000000000000e6
+1067 7 5 14 -0.13107200000000000000e6
+1067 7 12 12 0.26214400000000000000e6
+1068 1 25 28 -0.26214400000000000000e6
+1068 7 12 14 0.26214400000000000000e6
+1069 1 25 32 -0.26214400000000000000e6
+1069 7 12 15 0.26214400000000000000e6
+1070 7 6 15 -0.13107200000000000000e6
+1070 7 13 13 0.26214400000000000000e6
+1071 1 1 24 0.52428800000000000000e6
+1071 1 2 21 0.10485760000000000000e7
+1071 1 3 22 -0.52428800000000000000e6
+1071 1 4 35 0.26214400000000000000e6
+1071 1 12 27 0.52428800000000000000e6
+1071 1 21 28 -0.26214400000000000000e6
+1071 1 25 28 -0.26214400000000000000e6
+1071 1 30 33 -0.52428800000000000000e6
+1071 1 32 35 -0.26214400000000000000e6
+1071 2 9 15 0.52428800000000000000e6
+1071 2 12 14 -0.26214400000000000000e6
+1071 4 1 5 0.52428800000000000000e6
+1071 7 13 14 0.52428800000000000000e6
+1071 7 13 15 0.26214400000000000000e6
+1072 1 18 33 -0.13107200000000000000e6
+1072 7 14 14 0.26214400000000000000e6
+1073 1 32 33 -0.13107200000000000000e6
+1073 7 15 15 0.26214400000000000000e6
+1074 6 1 3 -0.13107200000000000000e6
+1074 8 1 1 0.26214400000000000000e6
+1075 5 9 12 -0.26214400000000000000e6
+1075 7 1 2 0.26214400000000000000e6
+1075 7 3 4 0.26214400000000000000e6
+1075 8 1 2 0.26214400000000000000e6
+1076 3 5 6 0.13107200000000000000e6
+1076 3 5 10 -0.13107200000000000000e6
+1076 3 8 13 -0.26214400000000000000e6
+1076 3 12 13 -0.13107200000000000000e6
+1076 7 3 4 0.13107200000000000000e6
+1076 7 4 5 0.26214400000000000000e6
+1076 8 1 3 0.26214400000000000000e6
+1077 1 7 14 0.26214400000000000000e6
+1077 3 2 7 0.26214400000000000000e6
+1077 5 10 13 -0.26214400000000000000e6
+1077 8 1 4 0.26214400000000000000e6
+1078 1 6 21 0.26214400000000000000e6
+1078 1 8 23 0.26214400000000000000e6
+1078 1 22 29 -0.26214400000000000000e6
+1078 8 1 5 0.26214400000000000000e6
+1079 2 5 5 -0.52428800000000000000e6
+1079 8 2 3 0.26214400000000000000e6
+1080 2 3 9 -0.26214400000000000000e6
+1080 8 2 4 0.26214400000000000000e6
+1081 1 3 22 0.52428800000000000000e6
+1081 1 4 23 -0.26214400000000000000e6
+1081 1 4 35 0.26214400000000000000e6
+1081 1 13 28 0.26214400000000000000e6
+1081 1 25 28 -0.26214400000000000000e6
+1081 5 2 13 0.26214400000000000000e6
+1081 8 2 5 0.26214400000000000000e6
+1082 2 6 8 -0.26214400000000000000e6
+1082 8 3 4 0.26214400000000000000e6
+1083 2 6 12 -0.26214400000000000000e6
+1083 8 3 5 0.26214400000000000000e6
+1084 1 2 9 0.26214400000000000000e6
+1084 1 18 33 -0.26214400000000000000e6
+1084 5 1 4 0.26214400000000000000e6
+1084 6 1 3 0.26214400000000000000e6
+1084 7 5 14 0.26214400000000000000e6
+1084 8 4 5 0.26214400000000000000e6
+1085 1 2 33 0.13107200000000000000e6
+1085 7 12 13 0.13107200000000000000e6
+1085 7 14 15 -0.13107200000000000000e6
+1085 8 5 5 0.26214400000000000000e6
+*** ANSWER ***
+Failure
+*** END ***
diff --git a/test-suite/micromega/bertot.v b/test-suite/micromega/bertot.v
new file mode 100644
index 000000000..6951fcd33
--- /dev/null
+++ b/test-suite/micromega/bertot.v
@@ -0,0 +1,22 @@
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import ZArith.
+Require Import Micromegatac.
+
+Open Scope Z_scope.
+
+Goal (forall x y n,
+ ( ~ x < n /\ x <= n /\ 2 * y = x*(x+1) -> 2 * y = n*(n+1))
+ /\
+ (x < n /\ x <= n /\ 2 * y = x * (x+1) -> x + 1 <= n /\ 2 *(x+1+y) = (x+1)*(x+2))).
+Proof.
+ intros.
+ micromega Z.
+Qed.
+
diff --git a/test-suite/micromega/example.v b/test-suite/micromega/example.v
new file mode 100644
index 000000000..dc78ace5d
--- /dev/null
+++ b/test-suite/micromega/example.v
@@ -0,0 +1,347 @@
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import ZArith.
+Require Import Micromegatac.
+Require Import Ring_normalize.
+Open Scope Z_scope.
+Require Import ZMicromega.
+Require Import VarMap.
+
+(* false in Q : x=1/2 and n=1 *)
+
+Lemma not_so_easy : forall x n : Z,
+ 2*x + 1 <= 2 *n -> x <= n-1.
+Proof.
+ intros.
+ zfarkas.
+Qed.
+
+
+(* From Laurent Théry *)
+
+Lemma some_pol : forall x, 4 * x ^ 2 + 3 * x + 2 >= 0.
+Proof.
+ intros.
+ micromega Z.
+Qed.
+
+
+Lemma Zdiscr: forall a b c x,
+ a * x ^ 2 + b * x + c = 0 -> b ^ 2 - 4 * a * c >= 0.
+Proof.
+ intros ; micromega Z.
+Qed.
+
+
+Lemma plus_minus : forall x y,
+ 0 = x + y -> 0 = x -y -> 0 = x /\ 0 = y.
+Proof.
+ intros.
+ zfarkas.
+Qed.
+
+
+
+Lemma mplus_minus : forall x y,
+ x + y >= 0 -> x -y >= 0 -> x^2 - y^2 >= 0.
+Proof.
+ intros; micromega Z.
+Qed.
+
+Lemma pol3: forall x y, 0 <= x + y ->
+ x^3 + 3*x^2*y + 3*x* y^2 + y^3 >= 0.
+Proof.
+ intros; micromega Z.
+Qed.
+
+
+(* Motivating example from: Expressiveness + Automation + Soundness:
+ Towards COmbining SMT Solvers and Interactive Proof Assistants *)
+Parameter rho : Z.
+Parameter rho_ge : rho >= 0.
+Parameter correct : Z -> Z -> Prop.
+
+
+Definition rbound1 (C:Z -> Z -> Z) : Prop :=
+ forall p s t, correct p t /\ s <= t -> C p t - C p s <= (1-rho)*(t-s).
+
+Definition rbound2 (C:Z -> Z -> Z) : Prop :=
+ forall p s t, correct p t /\ s <= t -> (1-rho)*(t-s) <= C p t - C p s.
+
+
+Lemma bounded_drift : forall s t p q C D, s <= t /\ correct p t /\ correct q t /\
+ rbound1 C /\ rbound2 C /\ rbound1 D /\ rbound2 D ->
+ Zabs (C p t - D q t) <= Zabs (C p s - D q s) + 2 * rho * (t- s).
+Proof.
+ intros.
+ generalize (Zabs_eq (C p t - D q t)).
+ generalize (Zabs_non_eq (C p t - D q t)).
+ generalize (Zabs_eq (C p s -D q s)).
+ generalize (Zabs_non_eq (C p s - D q s)).
+ unfold rbound2 in H.
+ unfold rbound1 in H.
+ intuition.
+ generalize (H6 _ _ _ (conj H H4)).
+ generalize (H7 _ _ _ (conj H H4)).
+ generalize (H8 _ _ _ (conj H H4)).
+ generalize (H10 _ _ _ (conj H H4)).
+ generalize (H6 _ _ _ (conj H5 H4)).
+ generalize (H7 _ _ _ (conj H5 H4)).
+ generalize (H8 _ _ _ (conj H5 H4)).
+ generalize (H10 _ _ _ (conj H5 H4)).
+ generalize rho_ge.
+ micromega Z.
+Qed.
+
+(* Rule of signs *)
+
+Lemma sign_pos_pos: forall x y,
+ x > 0 -> y > 0 -> x*y > 0.
+Proof.
+ intros; micromega Z.
+Qed.
+
+Lemma sign_pos_zero: forall x y,
+ x > 0 -> y = 0 -> x*y = 0.
+Proof.
+ intros; micromega Z.
+Qed.
+
+Lemma sign_pos_neg: forall x y,
+ x > 0 -> y < 0 -> x*y < 0.
+Proof.
+ intros; micromega Z.
+Qed.
+
+Lemma sign_zer_pos: forall x y,
+ x = 0 -> y > 0 -> x*y = 0.
+Proof.
+ intros; micromega Z.
+Qed.
+
+Lemma sign_zero_zero: forall x y,
+ x = 0 -> y = 0 -> x*y = 0.
+Proof.
+ intros; micromega Z.
+Qed.
+
+Lemma sign_zero_neg: forall x y,
+ x = 0 -> y < 0 -> x*y = 0.
+Proof.
+ intros; micromega Z.
+Qed.
+
+Lemma sign_neg_pos: forall x y,
+ x < 0 -> y > 0 -> x*y < 0.
+Proof.
+ intros; micromega Z.
+Qed.
+
+Lemma sign_neg_zero: forall x y,
+ x < 0 -> y = 0 -> x*y = 0.
+Proof.
+ intros; micromega Z.
+Qed.
+
+Lemma sign_neg_neg: forall x y,
+ x < 0 -> y < 0 -> x*y > 0.
+Proof.
+ intros; micromega Z.
+Qed.
+
+
+(* Other (simple) examples *)
+
+Lemma binomial : forall x y, (x+y)^2 = x^2 + 2*x*y + y^2.
+Proof.
+ intros.
+ zfarkas.
+Qed.
+
+Lemma product : forall x y, x >= 0 -> y >= 0 -> x * y >= 0.
+Proof.
+ intros.
+ micromega Z.
+Qed.
+
+
+Lemma product_strict : forall x y, x > 0 -> y > 0 -> x * y > 0.
+Proof.
+ intros.
+ micromega Z.
+Qed.
+
+
+Lemma pow_2_pos : forall x, x ^ 2 + 1 = 0 -> False.
+Proof.
+ intros ; micromega Z.
+Qed.
+
+(* Found in Parrilo's talk *)
+(* BUG?: certificate with **very** big coefficients *)
+Lemma parrilo_ex : forall x y, x - y^2 + 3 >= 0 -> y + x^2 + 2 = 0 -> False.
+Proof.
+ intros.
+ micromega Z.
+Qed.
+
+
+(* from hol_light/Examples/sos.ml *)
+
+Lemma hol_light1 : forall a1 a2 b1 b2,
+ a1 >= 0 -> a2 >= 0 ->
+ (a1 * a1 + a2 * a2 = b1 * b1 + b2 * b2 + 2) ->
+ (a1 * b1 + a2 * b2 = 0) -> a1 * a2 - b1 * b2 >= 0.
+Proof.
+ intros ; micromega Z.
+Qed.
+
+
+Lemma hol_light2 : forall x a,
+ 3 * x + 7 * a < 4 -> 3 < 2 * x -> a < 0.
+Proof.
+ intros ; micromega Z.
+Qed.
+
+Lemma hol_light3 : forall b a c x,
+ b ^ 2 < 4 * a * c -> (a * x ^2 + b * x + c = 0) -> False.
+Proof.
+intros ; micromega Z.
+Qed.
+
+Lemma hol_light4 : forall a c b x,
+ a * x ^ 2 + b * x + c = 0 -> b ^ 2 >= 4 * a * c.
+Proof.
+intros ; micromega Z.
+Qed.
+
+Lemma hol_light5 : forall x y,
+ 0 <= x /\ x <= 1 /\ 0 <= y /\ y <= 1
+ -> x ^ 2 + y ^ 2 < 1 \/
+ (x - 1) ^ 2 + y ^ 2 < 1 \/
+ x ^ 2 + (y - 1) ^ 2 < 1 \/
+ (x - 1) ^ 2 + (y - 1) ^ 2 < 1.
+Proof.
+intros; micromega Z.
+Qed.
+
+
+
+Lemma hol_light7 : forall x y z,
+ 0<= x /\ 0 <= y /\ 0 <= z /\ x + y + z <= 3
+ -> x * y + x * z + y * z >= 3 * x * y * z.
+Proof.
+intros ; micromega Z.
+Qed.
+
+Lemma hol_light8 : forall x y z,
+ x ^ 2 + y ^ 2 + z ^ 2 = 1 -> (x + y + z) ^ 2 <= 3.
+Proof.
+ intros ; micromega Z.
+Qed.
+
+Lemma hol_light9 : forall w x y z,
+ w ^ 2 + x ^ 2 + y ^ 2 + z ^ 2 = 1
+ -> (w + x + y + z) ^ 2 <= 4.
+Proof.
+ intros;micromega Z.
+Qed.
+
+Lemma hol_light10 : forall x y,
+ x >= 1 /\ y >= 1 -> x * y >= x + y - 1.
+Proof.
+ intros ; micromega Z.
+Qed.
+
+Lemma hol_light11 : forall x y,
+ x > 1 /\ y > 1 -> x * y > x + y - 1.
+Proof.
+ intros ; micromega Z.
+Qed.
+
+
+Lemma hol_light12: forall x y z,
+ 2 <= x /\ x <= 125841 / 50000 /\
+ 2 <= y /\ y <= 125841 / 50000 /\
+ 2 <= z /\ z <= 125841 / 50000
+ -> 2 * (x * z + x * y + y * z) - (x * x + y * y + z * z) >= 0.
+Proof.
+ intros x y z ; set (e:= (125841 / 50000)).
+ compute in e.
+ unfold e ; intros ; micromega Z.
+Qed.
+
+Lemma hol_light14 : forall x y z,
+ 2 <= x /\ x <= 4 /\ 2 <= y /\ y <= 4 /\ 2 <= z /\ z <= 4
+ -> 12 <= 2 * (x * z + x * y + y * z) - (x * x + y * y + z * z).
+Proof.
+ intros ;micromega Z.
+Qed.
+
+(* ------------------------------------------------------------------------- *)
+(* Inequality from sci.math (see "Leon-Sotelo, por favor"). *)
+(* ------------------------------------------------------------------------- *)
+
+Lemma hol_light16 : forall x y,
+ 0 <= x /\ 0 <= y /\ (x * y = 1)
+ -> x + y <= x ^ 2 + y ^ 2.
+Proof.
+ intros ; micromega Z.
+Qed.
+
+Lemma hol_light17 : forall x y,
+ 0 <= x /\ 0 <= y /\ (x * y = 1)
+ -> x * y * (x + y) <= x ^ 2 + y ^ 2.
+Proof.
+ intros ; micromega Z.
+Qed.
+
+Lemma hol_light18 : forall x y,
+ 0 <= x /\ 0 <= y -> x * y * (x + y) ^ 2 <= (x ^ 2 + y ^ 2) ^ 2.
+Proof.
+ intros ; micromega Z.
+Qed.
+
+(* ------------------------------------------------------------------------- *)
+(* Some examples over integers and natural numbers. *)
+(* ------------------------------------------------------------------------- *)
+
+Lemma hol_light19 : forall m n, 2 * m + n = (n + m) + m.
+Proof.
+ intros ; zfarkas.
+Qed.
+
+Lemma hol_light22 : forall n, n >= 0 -> n <= n * n.
+Proof.
+ intros.
+ micromega Z.
+Qed.
+
+
+Lemma hol_light24 : forall x1 y1 x2 y2, x1 >= 0 -> x2 >= 0 -> y1 >= 0 -> y2 >= 0 ->
+ ((x1 + y1) ^2 + x1 + 1 = (x2 + y2) ^ 2 + x2 + 1)
+ -> (x1 + y1 = x2 + y2).
+Proof.
+ intros.
+ micromega Z.
+Qed.
+
+Lemma motzkin' : forall x y, (x^2+y^2+1)*(x^2*y^4 + x^4*y^2 + 1 - 3*x^2*y^2) >= 0.
+Proof.
+ intros ; sos Z.
+Qed.
+
+
+
+Lemma motzkin : forall x y, (x^2*y^4 + x^4*y^2 + 1 - 3*x^2*y^2) >= 0.
+Proof.
+ intros.
+ generalize (motzkin' x y).
+ micromega Z.
+Qed.
diff --git a/test-suite/micromega/heap3_vcgen_25.v b/test-suite/micromega/heap3_vcgen_25.v
new file mode 100644
index 000000000..ec88b68dd
--- /dev/null
+++ b/test-suite/micromega/heap3_vcgen_25.v
@@ -0,0 +1,38 @@
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import ZArith.
+Require Import Micromegatac.
+
+Open Scope Z_scope.
+
+Lemma vcgen_25 : forall
+ (n : Z)
+ (m : Z)
+ (jt : Z)
+ (j : Z)
+ (it : Z)
+ (i : Z)
+ (H0 : 1 * it + -2 * i + -1 = 0)
+ (H : 1 * jt + -2 * j + -1 = 0)
+ (H1 : 1 * n + -10 = 0)
+ (H2 : 0 <= -4028 * i + 6222 * j + 705 * m + -16674)
+ (H3 : 0 <= -418 * i + 651 * j + 94 * m + -1866)
+ (H4 : 0 <= -209 * i + 302 * j + 47 * m + -839)
+ (H5 : 0 <= -1 * i + 1 * j + -1)
+ (H6 : 0 <= -1 * j + 1 * m + 0)
+ (H7 : 0 <= 1 * j + 5 * m + -27)
+ (H8 : 0 <= 2 * j + -1 * m + 2)
+ (H9 : 0 <= 7 * j + 10 * m + -74)
+ (H10 : 0 <= 18 * j + -139 * m + 1188)
+ (H11 : 0 <= 1 * i + 0)
+ (H13 : 0 <= 121 * i + 810 * j + -7465 * m + 64350),
+ (1 = -2 * i + it).
+Proof.
+ intros ; zfarkas.
+Qed.
diff --git a/test-suite/micromega/qexample.v b/test-suite/micromega/qexample.v
new file mode 100644
index 000000000..42aff5a47
--- /dev/null
+++ b/test-suite/micromega/qexample.v
@@ -0,0 +1,62 @@
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import Micromegatac.
+Require Import QArith.
+Require Import Ring_normalize.
+
+Lemma plus_minus : forall x y,
+ 0 == x + y -> 0 == x -y -> 0 == x /\ 0 == y.
+Proof.
+ intros.
+ omicron Q.
+Qed.
+
+(* Other (simple) examples *)
+Open Scope Q_scope.
+
+Lemma binomial : forall x y:Q, ((x+y)^2 == x^2 + (2 # 1) *x*y + y^2).
+Proof.
+ intros.
+ omicron Q.
+Qed.
+
+
+Lemma hol_light19 : forall m n, (2 # 1) * m + n == (n + m) + m.
+Proof.
+ intros ; omicron Q.
+Qed.
+Open Scope Z_scope.
+Open Scope Q_scope.
+
+Lemma vcgen_25 : forall
+ (n : Q)
+ (m : Q)
+ (jt : Q)
+ (j : Q)
+ (it : Q)
+ (i : Q)
+ (H0 : 1 * it + (-2 # 1) * i + (-1 # 1) == 0)
+ (H : 1 * jt + (-2 # 1) * j + (-1 # 1) == 0)
+ (H1 : 1 * n + (-10 # 1) = 0)
+ (H2 : 0 <= (-4028 # 1) * i + (6222 # 1) * j + (705 # 1) * m + (-16674 # 1))
+ (H3 : 0 <= (-418 # 1) * i + (651 # 1) * j + (94 # 1) * m + (-1866 # 1))
+ (H4 : 0 <= (-209 # 1) * i + (302 # 1) * j + (47 # 1) * m + (-839 # 1))
+ (H5 : 0 <= (-1 # 1) * i + 1 * j + (-1 # 1))
+ (H6 : 0 <= (-1 # 1) * j + 1 * m + (0 # 1))
+ (H7 : 0 <= (1 # 1) * j + (5 # 1) * m + (-27 # 1))
+ (H8 : 0 <= (2 # 1) * j + (-1 # 1) * m + (2 # 1))
+ (H9 : 0 <= (7 # 1) * j + (10 # 1) * m + (-74 # 1))
+ (H10 : 0 <= (18 # 1) * j + (-139 # 1) * m + (1188 # 1))
+ (H11 : 0 <= 1 * i + (0 # 1))
+ (H13 : 0 <= (121 # 1) * i + (810 # 1) * j + (-7465 # 1) * m + (64350 # 1)),
+ (( 1# 1) == (-2 # 1) * i + it).
+Proof.
+ intros.
+ omicron Q.
+Qed.
diff --git a/test-suite/micromega/rexample.v b/test-suite/micromega/rexample.v
new file mode 100644
index 000000000..5132dc4ef
--- /dev/null
+++ b/test-suite/micromega/rexample.v
@@ -0,0 +1,62 @@
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import Micromegatac.
+Require Import Reals.
+Require Import Ring_normalize.
+
+Open Scope R_scope.
+
+Lemma plus_minus : forall x y,
+ 0 = x + y -> 0 = x -y -> 0 = x /\ 0 = y.
+Proof.
+ intros.
+ omicron R.
+Qed.
+
+(* Other (simple) examples *)
+
+Lemma binomial : forall x y, ((x+y)^2 = x^2 + 2 *x*y + y^2).
+Proof.
+ intros.
+ omicron R.
+Qed.
+
+
+Lemma hol_light19 : forall m n, 2 * m + n = (n + m) + m.
+Proof.
+ intros ; omicron R.
+Qed.
+
+
+Lemma vcgen_25 : forall
+ (n : R)
+ (m : R)
+ (jt : R)
+ (j : R)
+ (it : R)
+ (i : R)
+ (H0 : 1 * it + (-2%R ) * i + (-1%R ) = 0)
+ (H : 1 * jt + (-2 ) * j + (-1 ) = 0)
+ (H1 : 1 * n + (-10 ) = 0)
+ (H2 : 0 <= (-4028 ) * i + (6222 ) * j + (705 ) * m + (-16674 ))
+ (H3 : 0 <= (-418 ) * i + (651 ) * j + (94 ) * m + (-1866 ))
+ (H4 : 0 <= (-209 ) * i + (302 ) * j + (47 ) * m + (-839 ))
+ (H5 : 0 <= (-1 ) * i + 1 * j + (-1 ))
+ (H6 : 0 <= (-1 ) * j + 1 * m + (0 ))
+ (H7 : 0 <= (1 ) * j + (5 ) * m + (-27 ))
+ (H8 : 0 <= (2 ) * j + (-1 ) * m + (2 ))
+ (H9 : 0 <= (7 ) * j + (10 ) * m + (-74 ))
+ (H10 : 0 <= (18 ) * j + (-139 ) * m + (1188 ))
+ (H11 : 0 <= 1 * i + (0 ))
+ (H13 : 0 <= (121 ) * i + (810 ) * j + (-7465 ) * m + (64350 )),
+ (( 1 ) = (-2 ) * i + it).
+Proof.
+ intros.
+ omicron R.
+Qed.
diff --git a/test-suite/micromega/square.v b/test-suite/micromega/square.v
new file mode 100644
index 000000000..30c72e8c1
--- /dev/null
+++ b/test-suite/micromega/square.v
@@ -0,0 +1,61 @@
+(************************************************************************)
+(* *)
+(* Micromega: A reflexive tactic using the Positivstellensatz *)
+(* *)
+(* Frédéric Besson (Irisa/Inria) 2006-2008 *)
+(* *)
+(************************************************************************)
+
+Require Import ZArith Zwf Micromegatac QArith.
+Open Scope Z_scope.
+
+Lemma Zabs_square : forall x, (Zabs x)^2 = x^2.
+Proof.
+ intros ; case (Zabs_dec x) ; intros ; micromega Z.
+Qed.
+Hint Resolve Zabs_pos Zabs_square.
+
+Lemma integer_statement : ~exists n, exists p, n^2 = 2*p^2 /\ n <> 0.
+Proof.
+intros [n [p [Heq Hnz]]]; pose (n' := Zabs n); pose (p':=Zabs p).
+assert (facts : 0 <= Zabs n /\ 0 <= Zabs p /\ Zabs n^2=n^2
+ /\ Zabs p^2 = p^2) by auto.
+assert (H : (0 < n' /\ 0 <= p' /\ n' ^2 = 2* p' ^2)) by
+ (destruct facts as [Hf1 [Hf2 [Hf3 Hf4]]]; unfold n', p' ; micromega Z).
+generalize p' H; elim n' using (well_founded_ind (Zwf_well_founded 0)); clear.
+intros n IHn p [Hn [Hp Heq]].
+assert (Hzwf : Zwf 0 (2*p-n) n) by (unfold Zwf; micromega Z).
+assert (Hdecr : 0 < 2*p-n /\ 0 <= n-p /\ (2*p-n)^2=2*(n-p)^2) by micromega Z.
+apply (IHn (2*p-n) Hzwf (n-p) Hdecr).
+Qed.
+
+Open Scope Q_scope.
+
+Lemma QnumZpower : forall x : Q, Qnum (x ^ 2)%Q = ((Qnum x) ^ 2) %Z.
+Proof.
+ intros.
+ destruct x.
+ cbv beta iota zeta delta - [Zmult].
+ ring.
+Qed.
+
+
+Lemma QdenZpower : forall x : Q, ' Qden (x ^ 2)%Q = ('(Qden x) ^ 2) %Z.
+Proof.
+ intros.
+ destruct x.
+ cbv beta iota zeta delta - [Pmult].
+ rewrite Pmult_1_r.
+ reflexivity.
+Qed.
+
+Theorem sqrt2_not_rational : ~exists x:Q, x^2==2#1.
+Proof.
+ unfold Qeq; intros [x]; simpl (Qden (2#1)); rewrite Zmult_1_r.
+ intros HQeq.
+ assert (Heq : (Qnum x ^ 2 = 2 * ' Qden x ^ 2%Q)%Z) by
+ (rewrite QnumZpower in HQeq ; rewrite QdenZpower in HQeq ; auto).
+ assert (Hnx : (Qnum x <> 0)%Z)
+ by (intros Hx; simpl in HQeq; rewrite Hx in HQeq; discriminate HQeq).
+ apply integer_statement; exists (Qnum x); exists (' Qden x); auto.
+Qed.
diff --git a/test-suite/micromega/zomicron.v b/test-suite/micromega/zomicron.v
new file mode 100644
index 000000000..b13654d69
--- /dev/null
+++ b/test-suite/micromega/zomicron.v
@@ -0,0 +1,27 @@
+Require Import ZArith.
+Require Import Micromegatac.
+Open Scope Z_scope.
+
+Lemma two_x_eq_1 : forall x, 2 * x = 1 -> False.
+Proof.
+ intros.
+ omicron Z.
+Qed.
+
+Lemma two_x_y_eq_1 : forall x y, 2 * x + 2 * y = 1 -> False.
+Proof.
+ intros.
+ omicron Z.
+Qed.
+
+Lemma two_x_y_z_eq_1 : forall x y z, 2 * x + 2 * y + 2 * z= 1 -> False.
+Proof.
+ intros.
+ omicron Z.
+Qed.
+
+Lemma omega_nightmare : forall x y, 27 <= 11 * x + 13 * y <= 45 -> 7 * x - 9 * y = 4 -> -10 <= 7 * x - 9 * y <= 4 -> False.
+Proof.
+ intros ; intuition auto.
+ omicron Z.
+Qed.
diff --git a/test-suite/success/unification.v b/test-suite/success/unification.v
index 91ee18ea4..3d935cd1d 100644
--- a/test-suite/success/unification.v
+++ b/test-suite/success/unification.v
@@ -126,3 +126,11 @@ intros.
exists (fun n => match n with O => a | S n' => f' n' end).
constructor.
Qed.
+
+(* Why this not work, even, without the "fix" to #1851 *)
+
+Goal forall X (a:X 0) (f':forall n:nat, X n), (exists f : forall n:nat, X n, True).
+intros.
+exists (fun n => match n with O => a | S n' => f' n' end).
+constructor.
+Qed.