Veri ering av forskningsresultat gällande antal lösningar för linjära

January 9, 2018 | Author: Anonymous | Category: Engineering & Technology, Datavetenskap, Java Programming
Share Embed Donate


Short Description

Download Veri ering av forskningsresultat gällande antal lösningar för linjära...

Description

2013:12

Veriering av forskningsresultat gällande antal lösningar för linjära kongruenssystem

Uno Sörensson

Master Thesis in Mathematics, 30 credits Dec 2013

Blekinge Institute of Technology School of Engineering Deparment of Mathematics and Science Supervisor: Robert Nyqvist

Innehåll 1 Uppdrag och bakgrund

2

1.1

Sammanfattning

. . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

1.2

Introduktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2

1.3

Linjära kongruenser . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

1.4

System av linjära kongruenser . . . . . . . . . . . . . . . . . . . . .

8

2 Genomförande

9

2.1

Inledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.2

Arbetsgång

2.3

Bestämning av antal lösningar

2.4

Lösning av linjära kongruenssystem med två och tre obekanta

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

η.

. . . . . . . . . . . . . . . . . . . . . .

3 Avslutning 3.1

3.2

3.3

9 9 10 13

21

Sammanfattning och resultat av genomförda test

. . . . . . . . . .

21

3.1.1

Sammanfattning av test

. . . . . . . . . . . . . . . . . . . .

21

3.1.2

Resultat . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

3.2.1

CountSolutions.java . . . . . . . . . . . . . . . . . . . . . . .

22

3.2.2

OneSolution.java

28

3.2.3

CountWithGamma.java

3.2.4

CountSolCorr.java

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

. . . . . . . . . . . . . . . . . . . . . . .

41

. . . . . . . . . . . . . . . . . . . .

53

3.3.1

Exempel på programkörningar. ResCountSolutions.txt

. . . . . . . . . . . . . . . . . . . . .

53

3.3.2

ResOneSolution.txt . . . . . . . . . . . . . . . . . . . . . . .

54

3.3.3

ResCountWithGamma.txt . . . . . . . . . . . . . . . . . . .

56

3.3.4

ResCountSolCorr.txt . . . . . . . . . . . . . . . . . . . . . .

56

Litteraturförteckning

58

1

1

Uppdrag och bakgrund

1.1

Sammanfattning

Kongruenser har använts praktiskt sedan lång tid, men det var först på 1800talet som matematiker som Gauss, Fermat och Euler systematiskt studerade och utvecklade kongruensteorin. Sedan dess har kongruensteori varit en viktig del av talteorin. Nilsson och Nyqvist [1] har teoretiskt visat att för system av linjära kongruenser med

n

obekanta

Ax ≡ b (mod pk )

n × n-matris med heltalselement samt x och b vektorer med n help ett primtal och k ett heltal, gäller att antalet lösningar är nk η = sgd(det(A), p ), under förutsättning att p inte delar det(A). Vår uppgift har varit att för den homogena ekvationen (b = 0) veriera formeln för η för n = 2 och n = 3. Vi har gjort detta med hjälp av dator och program i programspråket

där A är en

talskomponenter,

Java.

1.2

Introduktion

Teorin för kongruenser utvecklades i början av artonhundratalet av den tyske matematikern Karl Friedrich Gauss, en av historiens mest berömda matematiker. Även andra matematiker, som Fermat och Euler har arbetat med kongruensteori. Kongruenser förekommer i vardagslivet. Klockan t.ex arbetar modulo för timmar och modulo

60

12

eller

24 7

för minuter och sekunder. Almanackan har modulo

för veckodagarna och modulo

12

för månaderna.

Denition: Låt m vara ett positivt heltal. Om a och b är heltal, säger vi att a är kongruent med

kongruent med

b modulo m om m delar (a − b), b modulo m, skriver vi

vilket skrivs

m | (a − b).

Om

a

är

a ≡ b (mod m).

Exempel 1.

22 ≡ 4 (mod 9), för 9 | (22 − 4). På samma sätt gäller att 3 ≡ −6 (mod 9), eftersom 9 | (3 − (−6)), men det gäller att 13 6≡ 5 (mod 9), eftersom 9 - (13 − 5). Det gäller att

2

När vi arbetar med kongruenser, behöver vi ibland översätta dem till likheter. Följande sats hjälper oss att göra detta.

Sats 1.

Om

ett heltal

k,

a

och

så att

b är heltal, så a = b + km.

är

a ≡ b (mod m)

om och endast om det nns

a ≡ b (mod m), så gäller att m | (a − b). Detta betyder att det nns k med km = a − b, så att a = b + km. Omvänt gäller att om det nns k med a = b + km, så gäller att km = a − b, och följaktligen, a ≡ b

Bevis. Om

ett heltal ett heltal

(mod m).

Sats 2.

Låt m vara ett heltal. Kongruenser modulo m har följande egenskaper.

1. Reexiv: Om

a

är ett heltal så gäller att

2. Symmetrisk: Om

a

och

b

a ≡ a (mod m).

är heltal sådana att

a ≡ b (mod m),

så gäller att

b ≡ a (mod m). a, b, och c är heltal a ≡ c (mod m).

3. Transitiv: Om så gäller att

med

a ≡ b (mod m)

och

b ≡ c (mod m),

Bevis.

1. Vi ser att

a ≡ a (mod m),

eftersom

a−a=0

och

m | 0.

a ≡ b (mod m), så gäller att m | (a − b). Detta betyder att det nns ett heltal k med km = a − b. Detta visar att (−km) = b − a, så att m | (b − a). Följaktligen gäller att b ≡ a (mod m).

2. Om

a ≡ b (mod m) och b ≡ c (mod m), så gäller att m | (a − b) och m | (b − c). Då nns det heltal k och l sådana att km = a − b och lm = b − c. Av detta fås a − c = (a − b) + (b − c) = km + lm = (k + l)m, vilket ger att m|(a − c) och a ≡ c (mod m).

3. Om

Sats

2

medför att heltalen delas upp i

m

disjunkta delmängder (partitioner), ek-

vivalensklasser. För kongruens är benämningen kongruensklasser.

3

Låt m vara ett positivt heltal. Enligt divisionsalgoritmen kan alla heltal a skrivas på formen a



mq

+r

där

0 0,

1.

a + c ≡ b + c (mod m)

2.

a − c ≡ b − c (mod m)

3.

ac ≡ bc (mod m).

sådana att

a ≡ b (mod m),

a, b ,

så gäller att

Bevis.

1.

a ≡ b (mod m) ger som vi vet att m | (a − b). (a − b), innebär att m | ((a + c) − (b + c)).

2. följer av att 3.

Identiteten

(a + c) − (b + c) =

(a − c) − (b − c) = a − b.

ac − bc = c(a − b) och eftersom m | (a − b), föjer att m | (c(a − b)) och ac ≡ bc (mod m).

Denition: Låt a och b vara heltal, varav minst ett av dem är skilt från 0. Det största heltal som delar både b, och betecknas

sgd(a, b).

a

och

b

kallas största gemensamma delare till a och

Vi denierar

sgd(0, 0) = 0.

4

Följande sats, som är mer generell än föregående sats, är också användbar

Sats 4.

Om

(mod m),

a, b , c , d

och

m

är heltal, med

m > 0, a ≡ b (mod m),

och

c≡d

så gäller att

1.

a + c ≡ b + d (mod m)

2.

a − c ≡ b − d (mod m)

3.

ac ≡ bd (mod m).

Bevis.

1.

a ≡ b (mod m)

c ≡ d (mod m), ger att m | (a − b) och m | (c − d). Då nns det heltal k och l med km = (a − b) och lm = (c − d). Detta ger (a + c) − (b + d) = (a − b) + (c − d) = km + lm = (k + l)m. Därför gäller att m | [((a + c) − (b + d)], det vill säga (a + c) ≡ (b + d) (mod m).

2.

(a − c) − (b − d) = (a − b) − (c − d) = km − lm = (k − l)m, m | [((a − c) − (b − d)], så att (a − c) ≡ (b − d) (mod m).

3.

ac − bd = ac − bc + bc − bd = c(a − b) + b(c − d) = ckm + blm = m(ck + bl). Därför gäller att m | (ac − bd) och ac ≡ bd (mod m).

och

därför gäller att

Följande sats och lemma behövs i den följande framställningen

Sats 5. Om a, b, m och n är heltal, och om c | a och c | b, så gäller att c | (ma+nb). c | a och c | b, så nns det heltal e och f sådana att a = ce b = cf . Följaktligen, ma + nb = mce + ncf = c(me + nf ). Alltså gäller att c | (ma + nb).

Bevis. Eftersom

och

Lemma 1.

Om

a, b , c

är positiva heltal och

sgd(a, b) = 1

och

a | bc

så gäller att

a | c. sgd(a, b) = 1, så nns det heltal x och y sådana att ax + by = 1. Enligt Sats 5 gäller att a | (acx + bcy) eftersom acx + bcy är en linjär kombination av a och bc, vilka båda delas av a. Alltså gäller att a | c. Bevis. Eftersom

5

För att kongruensen skall bevaras vid division, måste följande villkor uppfyllas.

Sats 6

. Om a, b, c och m är heltal sådana ac ≡ bc (mod m), så gäller att a ≡ b (mod m/d).

(Divisionsregeln)

sgd(c, m)

och

att

m > 0, d =

ac ≡ bc (mod m), vet vi att m | (ac − bc) = c(a − b).Därför nns k sådant att c(a − b) = km. Om vi dividerar båda sidor med d, får vi (c/d)(a − b) = k(m/d). Eftersom sgd(m/d, c/d) = 1, fås enligt Lemma 1, att m/d | (a − b). Därför gäller att a ≡ b (mod m/d). Bevis. Om

det ett heltal

Denition: Det minsta positiva heltal m sådant att a|m och b|m kallas för minsta gemensamma multipel för a och b, där a och b är heltal, betecknas

mgm(a, b).

Sats 7.

positiva. Om

a, b, m1 , m2 , . . . , mk vara heltal med m1 , m2 , · · · , mk a ≡ b (mod m1 ),a ≡ b (mod m2 ),. . . , a ≡ b (mod mk ),så gäller att Låt

a ≡ b (mod [m1 , m2 , · · · , mk ]) m = [m1 , m2 , . . . , mk ], det vill säga minsta gemensamma multipeln för heltalen m1 , m2 , . . . , mk

där

Denition: Två heltal a och b sägs vara relativt prima om det gäller att sgd(a, b) = 1.

Följdsats 1. är heltal och

a ≡ b (mod m1 ), a ≡ b (mod m2 ),. . . ,a ≡ b (mod mk ), där a,b m1 , m2 , . . . , mk är parvis relativt prima positiva heltal, så gäller att Om

a≡b eftersom

1.3 Låt

(mod m1 m2 . . . mk )

[m1 , m2 , . . . , mk ] = m1 m2 . . . mk

i detta fall.

Linjära kongruenser

a, b

och

m

vara heltal, där

m > 1.

En kongruens på formen

ax ≡ b (mod m) kallas en linjär kongruens i en obekant

x.

Att studera linjära kongruenser är nära

förknippat med studier av linjära diofantiska ekvationer med två variabler. Vi

x = x0 är en lösning till kongruensen ax ≡ b (mod m), och om x1 ≡ x0 (mod m), så är ax1 ≡ ax0 ≡ b (mod m), dvs x1 är också en lösning. Följaktligen, om en medlem av en kongruensklass modulo m är en lösning, så är noterar först att om

alla medlemmar i denna klass också lösningar. Därför kan vi fråga hur många av

6

de

m

kongruensklasserna modulo

m

som ger lösningar. Detta är detsamma som

att fråga hur många inkongruenta lösningar modulo

m

det nns. Följande sats

talar om för oss när en linjär kongruens i en variabel har lösningar, och om så är fallet, ger den oss exakt antalet inkongruenta lösningar modulo

Sats 8.

m.

a, b och m vara heltal, sådana att m > 0 och sgd(a, m) = d. Om d inte delar b, så har ax ≡ b (mod m) inga lösningar. Om d | b, så har ax ≡ b (mod m) exakt d inkongruenta lösningar modulo m. Om x0 är en lösning, så nns det exakt sgd(a, m) inkongruenta lösningar och dessa ges av Låt

x = x0 + där

m ·k sgd(a, m)

k = 0, 1, . . . , sgd(a, m) − 1

ax ≡ b (mod m)är ekvivalent med den linjära diofantiska ekvationen i två variabler ax − my = b. Heltalet x är en lösning till ax ≡ b (mod m) om och endast om det nns ett heltal y sådant att ax − my = b. Man kan visa att om d = sgd(a, m) inte delar b så nns inga lösningar, men om d|b har ax − my = b oändligt många lösningar. Dessa lösningar ges av samtliga kongruensklasser modulo d. För varje kongruensklass gäller att x = x0 + (m/d)t, t = 0, 1, . . . , sgd(a, m) − 1. För det fullständiga beviset se Rosen [2]. Bevisskiss. Den linjära kongruensen

Följdsats 2.

Om

a

och

m

är relativt prima heltal med

så gäller att den linjära kongruensen

ax ≡ b (mod m)

m>0

och

b

är ett heltal,

har exakt en lösning.

sgd(a, m) = 1, vet vi att sgd(a, m) | b. Av sats 8 följer då ax ≡ b (mod m) har exakt sgd(a, m) = 1 inkongruenta lösningar modulo m. Bevis. Eftersom

att

Exempel 3. Vi vill nna alla lösningar till 9x ≡ 12 (mod 15). Eftersom sgd(9, 15) = 3 och 3 | 12 nns det exakt tre inkongruenta lösningar. Vi kan nna dessa lösningar genom att först nna en speciell lösning och sedan addera lämpliga multiplar av

15/3 = 5. För att nna en speciell lösning, betraktar vi den linjära diofantiska ekvationen

9x − 15y = 12.

Euklides algoritm visar att

15 = 9 · 1 + 6 9=6·1+3 6=3·2+0 3 = 9 − 6 · 1 = 9 − (15 − 9 · 1) · 1 = 9 · 2 − 15. Härav följer att 9 · 8 − 15 · 4 = 12, och en speciell lösning ges av x0 = 8 och y0 = 4. Totala antalet inkongruenta lösningar är tre. Dessa är x = x0 ≡ 8 (mod 15), x = x0 + 5 ≡ 13 (mod 15), och x = x0 + 5 · 2 ≡ 18 ≡ 3 (mod 15).

så att

7

Denition: ax ≡ 1 (mod m) har exakt en lösning, om sgd(a, m) = 1. Lösningen betecknas

a−1

och kallas för den multiplikativa inversen för

a är den multiplikativa inversen ax ≡ b (mod m), ges av x ≡ a−1 · b (mod m).

nitionen följer att till

1.4

modulo

a modulo m. Av dem till a−1 . Lösningen

System av linjära kongruenser

System av linjära kongruenser är system med mer än en kongruens, och som innehåller samma antal obekanta som antalet kongruenser. Alla kongruenser har samma modulus. Låt

m

och

n

vara positiva heltal, med

m > 1

och

n > 1.

Ett

system av linjära kongruenser har det generella utseendet

  a11 x1 + a12 x2 + . . . + a1n xn ≡ b1 (mod m)    a21 x1 + a22 x2 + . . . + a2n xn ≡ b2 (mod m) . .  .    a x + a x + . . . + a x ≡ b (mod m) n1 1 n2 2 nn n n där alla

aij

och

bi

är heltal. I litteraturen beskrivs olika metoder för att lösa system

av linjära kongruenser. Dessa metoder påminner om metoder som används för att lösa linjära ekvationssystem inom linjär algebra, som Gauss elimineringsmetod och Cramers regel. (Jfr.: Kinesiska restklassatsen med vars hjälp man under vissa villkor kan lösa system av kongruenser med olika modulus.)

8

2

Genomförande

2.1

Inledning

Nilsson och Nyqvist [1] har i inledningen till sin forskningsrapport Number of Solutions of Linear Congruence Systems angett syftet med sitt arbete och tidigare forskning inom området. Författarna har bland annat teoretiskt visat att antalet lösningar

η för ett system av linjära kongruenser med n obekanta Ax ≡ 0 (mod m) det(A) och m.

under vissa förutsättningar är en funktion av

Vår uppgift har varit att manuellt och med hjälp av datorprogram veriera denna del av resultaten i rapporten. I rapporten behandlas modulus som utgörs av k primtal p, eller potenser av primtal p , där k är ett godtyckligt positivt heltal. Detta eftersom varje heltal

i > 2, som inte är ett primtal, kan delas upp i primtalsfaktorer.

I rapporten behandlas både homogena och inhomogena linjära kongruenser med

n

obekanta, med

n > 1.

I vårt uppdrag ingår endast att undersöka homo-

gena linjära system av kongruenser med

n = 2 och = sgd(det(A), pk ),

skriver att om

ηp k

att

n = 2

och

n = 3.

Nilsson och Nyqvist

p gäller nk att ηpnk = sgd(det(A), p ). nk−γ i rapporten, ηγ = p , där

någon koecient i A är relativt prima med för övriga system gäller

Ytterligare en formel för beräkning av

η

presenters

γ = l0 + l1 + l2 . γ

beräknas med hjälp av Gauss-eliminering. Nilsson och Nyqvist nk−γ beskriver formeln ηγ = p för det allmänna fallet i avsnitt 3 i sin rapport. En detaljerad beskrivning av beräkning av

η

för

n = 2 och n = 3 ges

i avsnitt

2.3.

All

programmering har skett i programspråket Java.

2.2

Arbetsgång

Vi inleder arbetet med att ta fram alla lösningar för ett system med

n=2

n = 3

Resultaten

och samtidigt räkna lösningarna, samt beräknar

ηp k

och

ηpnk .

eller

sparas på en textl. Program: CountSolutions.java. Detta program är dock så krävande avseende datorkraft och minne att man endast kan välja relativt små värden (mindre än

10)



p

och

k

för att inte orimligt långa exekveringstider

skall erhållas. För att kunna testa med större värden på lösningar

η

för ett specikt system för

p

och

k

räknar vi antalet

n = 2 eller n = 3 och beräknar ηpk och ηpnk . ηγ på ett specikt system med n = 3.

Program: OneSolution.java. Vi testar sedan

Program: CountWithGamma.java. Slutligen genererar vi slumpmässigt ett valfritt antal system och för varje system räknas antalet lösningar

ηγ

η,

och

ηpk , ηpnk

och

beräknas. Antalet rätta värden för vardera formeln summeras och presenteras

tillsammans med siran på antalet räknade lösningar (= rätt antal lösningar). Alla resultat sparas på en textl. Program: CountSolCorr.java.

9

2.3

Bestämning av antal lösningar

η.

Algoritm.

η.

A. Icke-selektiv algoritm för att räkna antal lösningar 1. Läs in ett värde på antal obekanta 2. Läs in värde på

p

och

n, 2

eller

3.

k.

3. Öppna en textl.

Zpk = {0, 1, . . . , pk − 1}

4. För varje matris A med element ur (a) Sätt räknare för lösningar

η=0

x i Znpk k Om Ax ≡ 0 (mod p ), sätt η = η + 1. Skriv ut koecienterna för A samt x

(b) För varje i. ii.

(c) Beräkna

det(A), ηpk = sgd(det(A), pk )

(d) Skriv ut

η , det(A), ηpk

och

ηpnk

och

ηpnk = sgd(det(A), pnk )

på textlen.

5. Stäng textlen när alla matriser A har behandlats. Programmet för att icke-selektivt räkna antal lösningar, CountSolutions.java nns i avsnitt

3.1.1.

B. Selektiv algoritm för att räkna antal lösningar 1. Läs in ett värde på 2. Läs in värde på

p

n

och

(antal obekanta: 2 eller 3).

k.

3. Läs in värden på koecienterna 4. Beräkna

ai,j

i

n × n-matrisen

(a) Sätt räknare för lösningar

Zpk = {0, 1, . . . , pk − 1}.

η=0

x i Znpk k Om Ax ≡ 0 (mod p ), sätt η = η + 1.

(b) För varje

(c) Beräkna antalet lösningar 6. Skriv ut

A.

det(A).

5. För den inlästa matrisen A med element ur

i.

η.

det(A),η , ηpk ,

och

ηp k

och

ηpnk . 10

ηpnk .

Programmet för att selektivt räkna antal lösningar, OneSolution.java nns i avsnitt

3.1.2. C. Selektiv algoritm för att räkna antal lösningar med 1. Läs in en

3 × 3-matris

A, samt värden på

2. Om samtliga element är delbara med e från A och reducera modulo med p 0 . 3. Beräkna l0 4. Sätt

pe 0

p

ηγ .

och

k.

, där

e0

Algoritm för

n = 3.

är ett heltal, bryt ut

pe0

= k − e0 .

γ = l0 .

5. Finn en koecient

aij ,

sådan att

sgd(aij , pk ) = 1.

6. Placera denna koecient i rad och kolonn

1

i matrisen, med eventuella rad-

och kolonnbyten. 7. Bestäm den multiplikativa inversen

a−1 ij

till

aij .

−1 8. Multiplicera rad 1 med aij och ai,1 samt addera till rad −1 k gäller att aij · aij ≡ 1 (mod p ). 9. Vi kan nu betrakta de fyra koecienterna på rad

3

som en

2×2

3

och

där

i = 2, 3.

Det

2

och

samt kolonn

-matris, låt oss kalla den R.

10. Om samtliga element rij i R är delbara med e e ut p 1 från R och reducera modulo med p 1 . 11. Beräkna l1

2

i,

pe1

, där

e1

är ett heltal, bryt

= l0 − e1 .

12. Finn en koecient

rij ,

sådan att

sgd(rij , pk ) = 1.

13. Placera denna koecient i rad och kolonn

1

i matrisen, med eventuella rad-

och kolonnbyten. 14. Bestäm den multiplikativa inversen

−1 15. Multiplicera rad 1 med rij och −1 k gäller att rij · rij ≡ 1 (mod p ).

−1 rij

ri,1

till

rij .

samt addera till rad

16. Efter omformningen av matrisen R, så har vi i rad 1 skild från 0, låt oss kalla den r22 . 17. Skapa l2 på

e2 = 0.

1 r22 :

1 r22 = 0, sätt e2 = k − l0 − l1 . 1 1 delar r22 , sätt e2 = r22 /p.

Om

Om Om p

11

2

i,

där

i = 2.

Det

endast en koecient

Om

1 sgd(r22 , p) = 1,

sätt

18. Bilda

γ = l0 + l1 + l2 .

19. Beräkna antal lösningar =

pnk−γ .

Programmet för att beräkna antalet lösningar för linjära kongruenssystem med tre obekanta, med

ηγ

CountWithGamma.java nns i avsnitt

3.1.3.

ηpk , ηpnk (n = 3).

D. Algoritm för att testa formlerna för beräkning av antal system med slumpgenererade koecienter

och

ηγ

på ett bestämt

1. Läs in ett värde på antal system som skall genereras 2. Läs in värde på

p

och

k.

3. Öppna en textl. (a) Räkna antal system som genereras. (b) För varje genererad matris A med element ur

det(A). ηγ (Se algoritmen C). η , ηpk och ηpnk (Se algoritmen

Zpk = {0, 1, . . . , pk − 1}

i. Beräkna ii. Bestäm iii. Bestäm

B).

iv. Skriv ut värdena på textlen (c) Summera antal korrekta värden för

ηpk , ηpnk

och

ηγ .

4. Skriv ut de summerade värdena på textlen. 5. Stäng textlen. Programmet för att testa formlerna för beräkning av

ηpk , ηpnk

och

ηγ

på ett bestämt

antal system med slumpgenererade koecienter CountSolCorr.java nns i avsnitt

3.1.4.

12

2.4

Lösning av linjära kongruenssystem med två och tre obekanta

n = 2 och n = 3 görs

Nedan beskriver vi en metod för att lösa linjära kongruenssystem med

n = 3.

Metoden bygger på Gausseliminering från linjär algebra. För

en reducering av systemet till

n = 2,

lösande av detta system, samt återgång till

n = 3, där lösningen av systemet med n = 2 används för att få fram värden på den tredje obekanta variabeln. Vid lösning med dator används en algoritm som följer denna metod. Vi önskar lösa följande system av linjära kongruenser:

 a11 x1 + a12 x2 + a13 x3 ≡ 0 a21 x1 + a22 x2 + a23 x3 ≡ 0  a31 x1 + a32 x2 + a33 x3 ≡ 0 där

ai,j

och

k

är heltal, samt

(mod pk ) (mod pk ) (mod pk ),

p

är ett godtyckligt primtal. I stället för att arbeta i t systemet direkt arbetar vi med det i matrisform. Sätt A = (ai,j ), = (x1 , x2 , x3 ) t och = (0, 0, 0). Då kan systemet skrivas i matrisform på följande sätt:

x

0

Ax ≡ 0 (mod pk ) där

 a11 a12 a13 A = a21 a22 a23  . a31 a32 a33 

13

A. Metod för lösning för hand.

n = 3,

1. För ett givet system med 2. Vi kontrollerar om

sgd(aij , pk )

skriver vi upp matrisen A.

=

1

aij .

för något

element för vilket detta gäller måste vi bryta ut påverkar lösningen av systemet. Se Exempel

(Om vi inte nner något

pl ,

där

0 < l < k.

Detta

6).

3. Genom omyttningar, som vi dokumenterar, byter vi eventuellt

a11

mot det

funna elementet.

−1 4. Vi tar nu fram den multiplikativa inversen a11 till vårt nya k plicerar första raden med denna modulo p .

a11 ,

och multi-

5. Efter omyttningar och bearbetningar betecknar vi matriselementen varablerna

0

0

x1 , x2

och

0

x3

vi i matrisens andra rad har eliminerat 0

0

a22

pk ,

så att

och i rad tre har eliminerat

0

a31

a32 .

7. I rad tre i systemet har vi nu 0 k 8. Om det gäller att sgd(a33 , p ) 0 k sgd(a33 , p ) lösningar.

0

0

a33 x3 ≡ 0 (mod pk ). = 1,

har

0

x3

9. Genom att lösa den diofantiska ekvationen lösning på

0

x3 ,

nämligen

10. Övriga lösningar är sats

och

.

6. Vi tillämpar nu Gausseliminering med hänsyn tagen till modulus och

0

aij

0

endast lösningen

0

a33 x3 − (pk )y = 0

annars nns

får vi fram en

x3 = x0 .

0

x3 = x0 +

6.

pk 0 k k, k = 0, 1, . . . , sgd(a 0 33 , p ) − 1. sgd(a33 , pk )

11. Insättning av det funna värdet/värdena på eller era värden på

0

0,

0

0

x3

Se

i rad två i systemet ger ett

x2 .

12. Insättning av dessa värden i rad ett i systemet och omyttning till ursprungsordningen och bestämning av

x1

ger slutresultatet.

14

Exempel 5. Vi vill lösa följande linjära kongruenssystem (n = 3, p = 3, k = 3).  3  3x1 + 26x2 + 2x3 ≡ 0 (mod 3 ) 15x1 + 23x2 + 1x3 ≡ 0 (mod 33 )   24x1 + 17x2 + 4x3 ≡ 0 (mod 33 ). Vi skriver om systemet på formen

x ≡ 0 (mod pk )

A

och får



 3 26 2 A = 15 23 1 24 17 4 Vi låter kolonn

1

och

3

byta plats för att

matrisen blir

2

är relativt prima med

27.

Den nya



 2 26 3 B = 1 23 15 4 17 24

Vi tar nu fram den multiplikativa inversen till

2x ≡ 1 Vi multiplicerar rad

1

med

(mod 27) 14

ger

2

x ≡ 14

(mod 27).

och får matrisen



 1 13 15 C = 1 23 15 4 17 24 1 från rad 2 och rad 3 så att matrisen får följande   1 13 15 0 D = 0 10 0 19 18

Vi subtraherar multiplar av rad utseende

Vi får nu ett specialfall, eftersom andra koecienten i rad lösa ut

3

är

0.

Vi kan direkt

x2 .

10x2 ≡ 0 Rad

1

(mod 27)

och

sgd(10, 27) = 1

ger att

x2 ≡ 0

ger

18x1 ≡ 0

(mod 27)

och

15

η = sgd(18, 27) = 9.

(mod 27).

1 och 3. x1 ≡ 0 (mod 27), resterande lösningar ges av 27 k, k = 0, 1, 2, . . . , sgd(18, 27) − 1. x1 = 0 + sgd(18, 27) rad 1 i matrisen A ger

Observera att vi bytte plats på kolonn En lösning är

Insättning i

2x3 ≡ −3x1 x3 ≡ 14 · 24x1 Insättning av lösningarna för

x1

3x1 + 0 + 2x3 ≡ 0 (mod 27) (mod 27) ≡ 24x1 (mod 27) (mod 27) ≡ 12x1 (mod 27) ger

x3 ≡ 12 · 0 x3 ≡ 12 · 3 (mod 27) ≡ 36 x3 ≡ 12 · 6 (mod 27) ≡ 72 x3 ≡ 12 · 9 (mod 27) ≡ 108 x3 ≡ 12 · 12 (mod 27) ≡ 144 x3 ≡ 12 · 15 (mod 27) ≡ 180 x3 ≡ 12 · 18 (mod 27) ≡ 216 x3 ≡ 12 · 21 (mod 27) ≡ 252 x3 ≡ 12 · 24 (mod 27) ≡ 288 Lösningarna för

x3

(mod 27) ≡ 0 (mod 27) ≡ 9 (mod 27) ≡ 18 (mod 27) ≡ 0 (mod 27) ≡ 9 (mod 27) ≡ 18 (mod 27) ≡ 0 (mod 27) ≡ 9 (mod 27) ≡ 18

är:

x3 ≡ 0 (mod 27) x3 ≡ 9 (mod 27) x3 ≡ 18 (mod 27) Lösningarna för det givna systemet är:

x1

x2

x3

0

0

0

3

0

9

6

0

18

9

0

0

12

0

9

15

0

18

18

0

0

21

0

9

24

0

18

16

(mod (mod (mod (mod (mod (mod (mod (mod (mod

27) 27) 27) 27) 27) 27) 27) 27) 27)

Exempel 6. Vi vill lösa följande linjära kongruenssystem (n = 3, p = 3, k = 2).   6x1 + 6x2 + 3x3 ≡ 0 3x1 + 6x2 + 3x3 ≡ 0   3x1 + 3x2 + 3x3 ≡ 0

(mod 32 ) (mod 32 ) (mod 32 ).

Vi skriver om systemet på formen

x ≡ 0 (mod pk )

A

och får

  6 6 3 A = 3 6 3 3 3 3 Vi ser genast att ingen koecient är relativt prima med

9.

Vi bryter ut

3,

och får

en ny matris



 2 2 1 B = 1 2 1 1 1 1 Vi låter rad

1

och rad

och en gång till rad

3

3

byta plats, samt adderar nya rad

1

två gånger till rad

2

och får matrisen

  1 1 1 0 C = 0 1 0 0 22 Motsvarande kongruenssystem är

  x 1 + x 2 + x 3 x2   2x3

≡0 ≡0 ≡0

(mod 3) (mod 3) (mod 3).

Vi får

x2 = 0 ∈ Z3

och x3 = 0 ∈ Z3 ,

ef tersom sgd(1, 3) = 1 och sgd(2, 3) = 1.

Vi måste nu lyfta dessa värden till värdena

0, 3

och

6

i

Z9 .

Z9 .

17

Det gäller att

0

i

Z3

svarar mot de tre

Möjliga lösningar

(., 0, 0), (., 0, 3), (., 0, 6) (., 3, 0), (., 3, 3), (., 3, 6) (., 6, 0), (., 6, 3), (., 6, 6) där punkten svarar mot värden på

x1 ,

som vi ska nna.

Vi skriver om första raden i det ursprungliga kongruenssystemet

6x1 ≡ −6x2 − 3x3 Vi har att

sgd(6, 9) = 3,

(mod 32 ) ≡ 3x2 + 6x3

det vill säga att varje parentes i Möjliga lösningar ovan

ger upphov till tre lösningar.

(., 0, 0)

ger

6x1 ≡ 3 · 0 + 6 · 0 (mod 32 ) ≡ 0 (mod 32 )

6 · 0 ≡ (mod 32 )ger(0, 0, 0) 6 · 3 ≡ (mod 32 )ger(3, 0, 0) 6 · 6 ≡ (mod 32 )ger(6, 0, 0) (., 3, 0)

ger

(mod 32 ).

6x1 ≡ 3 · 3 + 6 · 0 (mod 32 ) ≡ 0 (mod 32 )

6 · 0 ≡ (mod 32 )ger(0, 3, 0) 6 · 3 ≡ (mod 32 )ger(3, 3, 0) 6 · 6 ≡ (mod 32 )ger(6, 3, 0) På samma sätt fås de övriga lösningarna.

18

Lösningarna för det givna systemet är:

x1

x2

x3

0

0

0

0

0

3

0

0

6

0

3

0

0

3

3

0

3

6

0

6

0

0

6

3

0

6

6

3

0

0

3

0

3

3

0

6

3

3

0

3

3

3

3

3

6

3

6

0

3

6

3

3

6

6

6

0

0

6

0

3

6

0

6

6

3

0

6

3

3

6

3

6

6

6

0

6

6

3

6

6

6

19

B. Programmering och testkörning I projektet ingår att ta reda på och visa rätt värde på antalet lösningar, samt att testa formler för beräkning av värden på antalet lösningar. I programmen CountSolutions.java och OneSolution.java visas också lösningarna. I 3.3 visas exempel på resultat från testkörningar.

20

3

Avslutning

3.1

Sammanfattning och resultat av genomförda test

3.1.1 Sammanfattning av test Fyra olika test har genomförts med hjälp av datorprogram. 1. För samtliga linjära kongruenssystem med

n=2

och

n=3

har vi räknat

antal lösningar där både koecienter och värden på de obekanta tillåts anta k alla värden i mängden {0, 1, . . . , p − 1}. För varje system beräknas antalet k nk lösningar med formlerna ηpk = sgd(det(A), p ) och ηpnk = sgd(det(A), p ). Alla resultat sparas på en textl. På grund av att antalet data som testas snabbt ökar med stigande värde på för små värden på

p

och

k

p

och

k,

kan metoden endast användas

(mindre än10). Program: CountSolutions.java.

2. För att kunna testa med större värden på

p och k görs ett test där man räknar

antalet lösningar för ett linjärt kongruenssystem med två eller tre obekanta (valbart i programmet), där de obekanta tillåts anta alla värden i mängden {0, 1, . . . , pk −1} för en uppsättning koecienter i mängden {0, 1, . . . , pk −1}, som läses in från tangentbordet. Program: OneSolution.java. 3. Beräkning av antalet lösningar för ett linjärt kongruenssystem med tre obenk−γ kanta med ηγ = p , där γ = l0 + l1 + l2 . γ beräknas med hjälp av Gaussk eliminering. Systemets koecienter som tillåts ligga i mängden {0, 1, . . . , p −

1}

samt

p

och

k

läses in från tangentbordet. Program: CountWithGam-

ma.java. 4. I programmet CountSolCorr.java slumpgenererar vi matriser för tre obekanta.

m

m

stycken koecient-

läses in från tangentbordet. Vi bestämmer för

varje matris rätt antal lösningar och beräknar sedan antalet lösningar med k nk nk−γ formlerna ηpk = sgd(det(A), p ), ηpnk = sgd(det(A), p ), samt ηγ = p , där

γ = l0 + l1 + l2 .

Resultatet läggs i en textl.

γ

beräknas med hjälp av

Gauss-eliminering. Program: CountSolCorr.java.

3.1.2 Resultat 1. När

det(A) 6= 0

ger både

2. När

det(A) = 0

blir

ηγ

ηpk , ηpnk

rätt,

ηpnk

och

ηγ

fel, och

21

rätt värde på antal lösningar.

ηpk

blir rätt när

sgd(A, p) = 1.

3.2

Program

3.2.1 CountSolutions.java import java.util.*; import java.io.*; import java.lang.*; public class CountSolutions { // Program:CountSolutions.java /* För varje system (matris A), testar vi alla kombinationer av x och y och räknar antalet lösningar(count_solutions). För varje matris som ger lösning skriver vi ut matrisen A (n=2: koeff. a,b,c,d; n=3: koeff. abcdefgho) och värdena på variablerna(x,y),determinanten för A och count_solutions = rätt antal lösningar för A samt de beräknade värdena för antalet lösningar eta_pk = sgd(detA,(int)Math.pow(p,k)) och eta_pnk = sgd(detA,(int)Math.pow(p,(n*k))) på en textfil respk.txt. Testen kan göras för n = 2 och n = 3. */

public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); int n = 0; //systemstorlek int p = 0; //primtal int k = 0; //exponent -"22

int int int int int int int int

x = 0; //systemvariabel y = 0; // -"z = 0; // -"_ detA = 0; eta_pk = 0; eta_pnk = 0; count_solutions = 0; //antal lösningar för ett system total_solutions = 0; //totalt antal lösningar

System.out.print("Ange storleken n (2 eller 3)"); System.out.println(" på system-matrisen A: "); n = keyboard.nextInt(); int[][] a = new int[n][n]; System.out.print("Skriv ett primtal p: "); p = keyboard.nextInt(); System.out.print("Skriv ett heltal k: "); k = keyboard.nextInt(); keyboard.nextLine(); //töm bufferten

System.out.println ("Skriv ett filnamn: "); String fileName = keyboard.nextLine(); if(n == 2) { try { PrintWriter out = new PrintWriter(fileName); //rubrik på textfilen resnpk.txt out.println("Resultatfil resnpk.txt, skapad"); out.println("med n = "+n+", p = "+p+" och k = "+k); out.println("Program: CountSolutions.java"); out.println();

23

out.println(" a, b, c, d, x, y"); out.println("_____________________________"); out.println(); for(a[0][0]=0;a[0][0]
View more...

Comments

Copyright � 2017 NANOPDF Inc.
SUPPORT NANOPDF