--* From postmaster%watson.vnet.ibm.com@yktvmv.watson.ibm.com  Wed Nov 16 09:51:57 1994
--* Received: from yktvmv-ob.watson.ibm.com by asharp.watson.ibm.com (AIX 3.2/UCB 5.64/930311)
--*           id AA18804; Wed, 16 Nov 1994 09:51:57 -0500
--* Received: from watson.vnet.ibm.com by yktvmv.watson.ibm.com (IBM VM SMTP V2R3)
--*    with BSMTP id 9337; Wed, 16 Nov 94 09:52:02 EST
--* Received: from YKTVMV by watson.vnet.ibm.com with "VAGENT.V1.0"
--*           id <A.BRONSTEI.NOTE.YKTVMV.2839.Nov.16.09:52:00.-0500>
--*           for asbugs@watson; Wed, 16 Nov 94 09:52:02 -0500
--* Received: from inf.ethz.ch by watson.ibm.com (IBM VM SMTP V2R3) with TCP;
--*    Wed, 16 Nov 94 09:51:59 EST
--* Received: from ru7.inf.ethz.ch (bronstei@ru7.inf.ethz.ch [129.132.12.16]) by inf.ethz.ch (8.6.9/8.6.9) with ESMTP id PAA18310 for <asbugs@watson.ibm.com>; Wed, 16 Nov 1994 15:51:50 +0100
--* From: Manuel Bronstein <bronstei@inf.ethz.ch>
--* Received: (bronstei@localhost) by ru7.inf.ethz.ch (8.6.8/8.6.6) id PAA18918 for asbugs@watson.ibm.com; Wed, 16 Nov 1994 15:51:41 +0100
--* Date: Wed, 16 Nov 1994 15:51:41 +0100
--* Message-Id: <199411161451.PAA18918@ru7.inf.ethz.ch>
--* To: asbugs@watson.ibm.com
--* Subject: [1] Runtime seg-fault in simple prog

--@ Fixed  by:  SSD   Wed Nov 23 09:39:24 EST 1994 
--@ Tested by:  none 
--@ Summary:    gen0GetExporterSymes needs to copy symbol meanings it modifies. 

-- Command line: asharp -Fx segfault.as
-- Version: 0.37.0
-- Original bug file name: segfault.as

----------------------------- segfault.as ----------------------------------
--
-- This program simply causes a segfault at runtime (SPARC 10):
-- % asharp -Fx segfault.as
-- % segfault
-- Segmentation fault
--
#include "aslib.as"

macro Z == SingleInteger;

SmallPrimeField(p:Z): FiniteField == SingleIntegerMod p add {
	macro Rep == SingleIntegerMod p;

	import from Rep;

	#:Integer	== p::Integer;
	(a:%) / (b:%):%	== mod_/(lift a, lift b, p)::%;
	inv(a:%):%	== mod_/(1, lift a, p)::%;
	reduce(a:Z):%	== per(a::Rep);

	(a:%)^(n:Integer):% == {
		import from BinaryPowering(%, *, Integer);
		zero? n => 1;
		n < 0 => power(1, inv a, -n);
		power(1, a, n);
	}
}

main():TextWriter == {
	macro Fp == SmallPrimeField 23;
	import from Z, Fp;
	a := lift inv reduce 7;
	print << "7^{-1} = " << a << " mod 23" << newline;
}

main();

 
