Gauss's Algorithm

In[1]:=

p = 73

Out[1]=

73

In[2]:=

PrimeQ[p]

Out[2]=

True

In[3]:=

FactorInteger[p - 1]

Out[3]=

{{2, 3}, {3, 2}}

Step (1)

In[4]:=

m = 2

Out[4]=

2

In[5]:=

PowerMod[2, Range[p - 1], p]

Out[5]=

{2, 4, 8, 16, 32, 64, 55, 37, 1, 2, 4, 8, 16, 32, 64, 55, 37, 1, 2, 4, 8, 16, 32, 64, 55, 37,  ... 1, 2, 4, 8, 16, 32, 64, 55, 37, 1, 2, 4, 8, 16, 32, 64, 55, 37, 1, 2, 4, 8, 16, 32, 64, 55, 37, 1}

In[6]:=

t = First[Flatten[Position[%, 1]]]

Out[6]=

9

In[7]:=

tp - 1

Out[7]=

False

The order of StringTake[ , -1 + System`Convert`HTMLDump`pos1$1281] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22mStringDrop[ , System`Convert`HTMLDump`pos2$1281] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 modulo StringTake[ , -1 + System`Convert`HTMLDump`pos1$1357] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22pStringDrop[ , System`Convert`HTMLDump`pos2$1357] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 is not StringTake[ , -1 + System`Convert`HTMLDump`pos1$1423] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22pStringDrop[ , System`Convert`HTMLDump`pos2$1423] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22-1, so StringTake[ , -1 + System`Convert`HTMLDump`pos1$1492] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22mStringDrop[ , System`Convert`HTMLDump`pos2$1492] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 is not a primitive root. Thus we must continue to step 2.

Step (2)

We must choose StringTake[ , -1 + System`Convert`HTMLDump`pos1$1601] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22bStringDrop[ , System`Convert`HTMLDump`pos2$1601] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 which is not equal to any of the first StringTake[ , -1 + System`Convert`HTMLDump`pos1$1660] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22tStringDrop[ , System`Convert`HTMLDump`pos2$1660] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 powers of StringTake[ , -1 + System`Convert`HTMLDump`pos1$1719] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22mStringDrop[ , System`Convert`HTMLDump`pos2$1719] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 modulo StringTake[ , -1 + System`Convert`HTMLDump`pos1$1778] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22pStringDrop[ , System`Convert`HTMLDump`pos2$1778] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22.

In[8]:=

notb = PowerMod[m, Range[t], p]

Out[8]=

{2, 4, 8, 16, 32, 64, 55, 37, 1}

These are the candidates for StringTake[ , -1 + System`Convert`HTMLDump`pos1$2026] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22bStringDrop[ , System`Convert`HTMLDump`pos2$2026] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22.

In[9]:=

Complement[Range[2, p - 1], notb]

Out[9]=

{3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 ... 6, 47, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 62, 63, 65, 66, 67, 68, 69, 70, 71, 72}

Choose StringTake[ , -1 + System`Convert`HTMLDump`pos1$2490] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22bStringDrop[ , System`Convert`HTMLDump`pos2$2490] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22.

In[10]:=

b = First[%]

Out[10]=

3

Find the multiplicative order of StringTake[ , -1 + System`Convert`HTMLDump`pos1$2688] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22bStringDrop[ , System`Convert`HTMLDump`pos2$2688] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22.

In[11]:=

u = MultiplicativeOrder[b, p]

Out[11]=

12

Since the multiplicative order of StringTake[ , -1 + System`Convert`HTMLDump`pos1$2890] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22bStringDrop[ , System`Convert`HTMLDump`pos2$2890] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 is not StringTake[ , -1 + System`Convert`HTMLDump`pos1$2949] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22pStringDrop[ , System`Convert`HTMLDump`pos2$2949] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22-1 ...

In[12]:=

up - 1

Out[12]=

False

... we must calculate StringTake[ , -1 + System`Convert`HTMLDump`pos1$3145] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22vStringDrop[ , System`Convert`HTMLDump`pos2$3145] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22.

In[13]:=

v = LCM[t, u]

Out[13]=

36

In[14]:=

a = Apply[Times, Intersection[Divisors[t], Apply[Power, FactorInteger[v], {1}]]]

Out[14]=

9

In[15]:=

c = Apply[Times, Intersection[Divisors[u], Apply[Power, FactorInteger[v], {1}]]]

Out[15]=

4

In[16]:=

va * c

Out[16]=

True

In[17]:=

GCD[a, c]

Out[17]=

1

Calculate m_1.

In[18]:=

m1 = PowerMod[m, t/a, p]

Out[18]=

2

Calculate b_1.

In[19]:=

b1 = PowerMod[b, u/c, p]

Out[19]=

27

In[20]:=

g = m1 * b1

Out[20]=

54

If StringTake[ , -1 + System`Convert`HTMLDump`pos1$4367] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22vStringDrop[ , System`Convert`HTMLDump`pos2$4367] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 equals StringTake[ , -1 + System`Convert`HTMLDump`pos1$4426] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22pStringDrop[ , System`Convert`HTMLDump`pos2$4426] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22-1 then StringTake[ , -1 + System`Convert`HTMLDump`pos1$4485] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22gStringDrop[ , System`Convert`HTMLDump`pos2$4485] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 is a primitive root. Otherwise we must proceed to step 3.

In[21]:=

vp - 1

Out[21]=

False

Step (3)

In[22]:=

t = v

Out[22]=

36

In[23]:=

m = m1 * b1

Out[23]=

54

Step (2.1)

We must choose StringTake[ , -1 + System`Convert`HTMLDump`pos1$4951] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22bStringDrop[ , System`Convert`HTMLDump`pos2$4951] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 which is not equal to any of the first StringTake[ , -1 + System`Convert`HTMLDump`pos1$5010] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22tStringDrop[ , System`Convert`HTMLDump`pos2$5010] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 powers of StringTake[ , -1 + System`Convert`HTMLDump`pos1$5069] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22mStringDrop[ , System`Convert`HTMLDump`pos2$5069] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 modulo StringTake[ , -1 + System`Convert`HTMLDump`pos1$5128] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22pStringDrop[ , System`Convert`HTMLDump`pos2$5128] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22.

In[24]:=

notb = PowerMod[m, Range[t], p]

Out[24]=

{54, 69, 3, 16, 61, 9, 48, 37, 27, 71, 38, 8, 67, 41, 24, 55, 50, 72, 19, 4, 70, 57, 12, 64, 25, 36, 46, 2, 35, 65, 6, 32, 49, 18, 23, 1}

These are the candidates for StringTake[ , -1 + System`Convert`HTMLDump`pos1$5484] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22bStringDrop[ , System`Convert`HTMLDump`pos2$5484] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22.

In[25]:=

Complement[Range[2, p - 1], notb]

Out[25]=

{5, 7, 10, 11, 13, 14, 15, 17, 20, 21, 22, 26, 28, 29, 30, 31, 33, 34, 39, 40, 42, 43, 44, 45, 47, 51, 52, 53, 56, 58, 59, 60, 62, 63, 66, 68}

Choose StringTake[ , -1 + System`Convert`HTMLDump`pos1$5840] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22bStringDrop[ , System`Convert`HTMLDump`pos2$5840] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22.

In[26]:=

b = First[%]

Out[26]=

5

Find the multiplicative order of StringTake[ , -1 + System`Convert`HTMLDump`pos1$6038] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22bStringDrop[ , System`Convert`HTMLDump`pos2$6038] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22.

In[27]:=

u = MultiplicativeOrder[b, p]

Out[27]=

72

Since the multiplicative order of StringTake[ , -1 + System`Convert`HTMLDump`pos1$6240] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22bStringDrop[ , System`Convert`HTMLDump`pos2$6240] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22 is StringTake[ , -1 + System`Convert`HTMLDump`pos1$6299] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22pStringDrop[ , System`Convert`HTMLDump`pos2$6299] ReplacePartNullExtractNullList22Rulestylefont-style: italic;List22-1 ...

In[28]:=

up - 1

Out[28]=

True

... we have found a primitive root.


Created by Mathematica  (November 10, 2004)