Veri ering av forskningsresultat gällande antal lösningar för linjära
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å
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