products/sources/formale sprachen/PVS/numbers image not shown  

Quellcode-Bibliothek

© Kompilation durch diese Firma

[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]

Datei: primes_sum_squares.pvs   Sprache: PVS

Original von: PVS©

primes_sum_squares: THEORY

%------------------------------------------------------------------------------
% Every Prime p with mod(p,4)=1 is a Sum of Two Squares
% Author: Anthony Narkawicz
% Date:   March 2012
%-------------------------------------------------------------------------------
BEGIN

   IMPORTING ints@primes,ints@gcd, prime_factorization

    % The lemmas below are part of Euler's proof of this result
    % As noted below, the proof using this method is not completed.
    % Instead, Zagier's simpler proof of the result is finally used below

    n,m,i,j,a,b: VAR nat
    pa,pb: VAR posnat
    ai,bi: VAR int
    p: VAR (prime?)

    sum_of_two_squares?(n) : bool = (EXISTS (a,b): n=a^2+b^2)

    sots_int?(n) : bool = (EXISTS (ai,bi): n = ai^2+bi^2)

    sots_int_def: LEMMA sots_int?(n) IMPLIES sum_of_two_squares?(n)

    prime_sum_of_two_squares?(n): bool = prime?(n) AND sum_of_two_squares?(n)

    ns,ms,is,js,bs: VAR (sum_of_two_squares?)

    ps,qs   : VAR (prime_sum_of_two_squares?)

    Brahmagupta_Fibonacci: LEMMA sum_of_two_squares?(ns*ms)

    prime_divides: LEMMA divides(p,ai*bi) IMPLIES (divides(p,ai) OR divides(p,bi))

    sots_div_prime_closed: LEMMA divides(ps,ns) IMPLIES sum_of_two_squares?(ns/ps)

    sots_div_quot_factor: LEMMA sum_of_two_squares?(ns) AND divides(m,ns) AND (NOT sum_of_two_squares?(m)) IMPLIES
          (EXISTS (b): divides(b,ns/m) AND (NOT sum_of_two_squares?(b)))

    rel_prime_sos_factor: LEMMA rel_prime(pa,pb) AND divides(n,pa^2+pb^2) IMPLIES sum_of_two_squares?(n)

    % This ends the work on Euler's proof
    % As it turns out, Zagier's "one line proof" works much better in this context,
    % and it is given below.

    fermat_prime_sos_set(p)(x,y,z:nat): bool = x^2 + 4*y*z = p

    fermat_prime_sos_finite_set: LEMMA 
      finite_sets[[nat,nat,nat]].is_finite(fermat_prime_sos_set(p))

    involution_odd_has_fixedpoint: LEMMA
      FORALL (N:posnat,invol:[below(N)->below(N)]):
      odd?(N) AND (FORALL (i:below(N)): invol(invol(i)) = i) IMPLIES
      EXISTS (i:below(N)): invol(i) = i

    involution_one_fixedpoint_odd: LEMMA
      FORALL (N:posnat,invol:[below(N)->below(N)]):
      (FORALL (i:below(N)): invol(invol(i)) = i) AND
      (EXISTS (j:below(N)): FORALL (i:below(N)): invol(i)=i IFF i=j)
      IMPLIES
      odd?(N)

   involution_fermat_set_one_fp_invol: LEMMA
      LET invol:[[nat,nat,nat]->[nat,nat,nat]] = 
         (LAMBDA (x,y,z:nat): IF x<y-z THEN (x+2*z,z,y-x-z)
        ELSIF y-z <= x AND x <= 2*y THEN (2*y-x,y,x-y+z)
      ELSE (x-2*y,x-y+z,y) ENDIF)
      IN (FORALL (x,y,z:nat): fermat_prime_sos_set(p)(x,y,z) IMPLIES
        invol(invol(x,y,z)) = (x,y,z) AND
 fermat_prime_sos_set(p)(invol(x,y,z)))

    invol_fermat(p)(xyz: (fermat_prime_sos_set(p))): (fermat_prime_sos_set(p)) =
      LET (x,y,z) = xyz IN
      IF x<y-z THEN (x+2*z,z,y-x-z)
        ELSIF y-z <= x AND x <= 2*y THEN (2*y-x,y,x-y+z)
      ELSE (x-2*y,x-y+z,y) ENDIF

    k : VAR posnat

    invol_fermat_one_fp: LEMMA p = 4*k+1 IMPLIES
      FORALL (xyz:(fermat_prime_sos_set(p))):
        invol_fermat(p)(xyz) = xyz IFF xyz = (1,1,k)

    fermat_prime_mod_4: LEMMA mod(p,4) = 1 IMPLIES
      sum_of_two_squares?(p)

END primes_sum_squares

¤ Dauer der Verarbeitung: 0.21 Sekunden  (vorverarbeitet)  ¤





Download des
Quellennavigators
Download des
sprechenden Kalenders

in der Quellcodebibliothek suchen




Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.


Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.


Bot Zugriff