Ask Your Question
1

Why code generates error ? Help wanted ASAP.

asked 2021-07-31 11:56:41 +0100

Yago gravatar image

updated 2021-07-31 14:05:30 +0100

tmonteil gravatar image

work fine as writes in article:


M = 93556643250795678718734474880013829509320385402690660619699653921022012489089

A = 66001598144012865876674115570268990806314506711104521036747533612798434904785

B = 25255205054024371783896605039267101837972419055969636393425590261926131199030

P = (56027910981442853390816693056740903416379421186644480759538594137486160388926, 65533262933617146434438829354623658858649726233622196512439589744498050226926)

Q = (61124499720410964164289905006830679547191538609778446060514645905829507254103, 2595146854028317060979753545310334521407008629091560515441729386088057610440)

F = FiniteField(M)

E = EllipticCurve(F,[A,B])

P = E.point(P)

Q = E.point(Q)

factors, exponents = zip(*factor(E.order()))

primes = [factors[i] ^ exponents[i] for i in range(len(factors))][:-2]

dlogs = []

for fac in primes:
    t = int(P.order()) / int(fac)
    dlog = discrete_log(t*Q,t*P,operation="+")
    dlogs += [dlog]
    print("factor: "+str(fac)+", Discrete Log: "+str(dlog)) #calculates discrete logarithm for each prime order

results:

factor: 4, dlog: 2

factor: 3, dlog: 1

factor: 5, dlog: 4

factor: 7, dlog: 1

factor: 137, dlog: 129

factor: 593, dlog: 224

factor: 24337, dlog: 5729

factor: 25589, dlog: 13993

factor: 3637793, dlog: 1730599

factor: 5733569, dlog: 4590572


But I get a error:


----> 3     dlog = discrete_log(t*Q,t*P,operation="+")


      4     dlogs += [dlog]


      5     print("factor: "+str(fac)+", Discrete Log: "+str(dlog)) #calculates discrete logarithm for each prime order




TypeError: unsupported operand type(s) for *: 'float' and 'EllipticCurvePoint_finite_field'

Help me PLEEEEEASE edit code for get results like in source ?**

edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted
1

answered 2021-07-31 14:08:57 +0100

tmonteil gravatar image

The problem is that when you write int(P.order()) / int(fac) you make a division between two Python int, which results in a float.

If you write P.order() / fac you will get a rational, which is not good either. What you have to do it to turn this fraction back into an integer with ZZ(P.order() / fac) or int(P.order() / fac)

Note : i did not check your code nor the meaning of the names you gave to objects, but note that the first entry of the primes list is 4 (not a prime).

edit flag offensive delete link more

Comments

Oh, Thank You Very mach !!! Now code work fine !!! REGARDS !

Yago gravatar imageYago ( 2021-07-31 17:09:37 +0100 )edit

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 2021-07-31 11:56:41 +0100

Seen: 323 times

Last updated: Jul 31 '21