# Why code generates error ? Help wanted ASAP.

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 close merge delete

Sort by » oldest newest most voted

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).

more

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