aleanum1.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
C\'alculo de todas las constantes $k$ admisibles para una
dada cubeta $B$ (potencia de 2), cuando se efect\'ua una
b\'usqueda sistem\'atica desde $k=1$, tarea anidada en un
lazo sobre las potencias de 2, desde $Bmin=2$ hasta
$Bmax>2$. La suma m\'odulo 2, bit a bit, se hace mediante
la operaci\'on l\'ogica ``xor'', que da verdadero
\'unicamente cuando ambas entradas son distintas.
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{$ Id: aleanum1.pas 2001/06/11 15:32 jdelia Exp jdelia $ }
program aleanum1 ;
const
base = 2 ; {base}
bmin = 2 ; {minima base (potencia de 2)}
bmax = 16 ; {maxima base (potencia de 2)}
pmin = 1 ; {minimo exponente : 2^1}
eco = true ;
nada = ' ' ;
type
vectint = array [1..bmax] of longint ;
var
B : longint ;
p : longint ;
d : vectint ;
a1 : text ;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ERROR (s : string) ;
begin
write ('ERROR: ');
writeln (s);
halt ;
end ;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure IMPRES (B, k : longint ; d : vectint) ;
var
j, l : longint ;
begin
writeln ;
writeln (' constante ; k = ', k) ;
writeln (a1, nada, B : 6, nada, k : 6) ;
if ( eco ) then begin
writeln (' desplazamientos ; d_i = ') ;
l := 0 ;
for j := 1 to (B - 1) do begin
l := l + 1 ;
if l > 10 then begin
writeln ;
l := 0 ;
end ; {if}
write (nada, d [j] : 6)
end ; { j }
writeln ;
end ; { if }
end ;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ verifica que en la sucesion $(d_1, d_2, .., d_k, .., d_i)$}
{ no hayan valores $d_k$ repetidos, sino invalida proseguir }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function NO_REPET (i: longint; var d: vectint): boolean;
var
j : longint ;
siga : boolean ;
begin
j := 1;
siga := true ;
while (j < i) and (siga) do begin
if ( d [j] = d [i] ) then siga := false ;
j := j + 1 ;
end ; {while}
NO_REPET := siga ;
end ;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ dado una base $B$, obtiene las constantes $k$ admisibles: }
{ va calculando los desplazamientos $ d_i $ para el par }
{ $ (B,k) $, para ir verificando simultaneamente la ausencia}
{ de repeticion en dicha sucesion }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure KADMISIBLE (var d : vectint ; B : longint ) ;
var
i, k : longint ;
n, t : longint ;
q, r : longint ;
siga : boolean ;
begin
{primero verifica que B sea una potencia de 2 }
q := B ;
while ( q mod 2 = 0 ) and (q > 2) do q := q div 2 ;
if (q <> 2) or (q < 2) then ERROR (' B no es potencia de 2');
{ ahora busca k_i admisibles para i=1,2,..(B-1) }
n := B - 1 ;
for k := 1 to (n) do begin
for i := 1 to b do d [i] := 0 ;
d [1] := 1 ; {semilla para los d_i a calcular}
siga := true ; {si en la secuencia d_i no hay repeticion}
i := 2 ;
while (i <= n) and (siga) do begin
t := 2 * d [i - 1] ;
if ( t < B ) then
d [i] := t
else begin
r := t - B ;
d [i] := (r) xor (k) ;
siga := NO_REPET (i, d) ;
end ; {* if *}
i := i + 1 ;
end ; { while }
{imprime solo si en la secuencia d_i no hay repeticion}
if ( siga ) then IMPRES (B, k, d) ;
end ; { k }
end ; { procedure }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
begin
writeln ;
assign (a1, 'admisi1.res') ;
rewrite (a1);
writeln ;
writeln (' minimo cubeta (potencia de 2) = ', bmin );
writeln (' maximo cubeta (potencia de 2) = ', bmax ) ;
p := pmin ;
B := bmin ;
while (B <= Bmax) do begin
writeln ;
writeln (' exponente ; p = ', p);
writeln (' cubeta ; B = ', B) ;
KADMISIBLE (d, B) ;
p := p + 1 ;
B := base * B ;
end ; {for}
close (a1) ;
writeln ;
end .
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.