Перевод полутора десятков строк с Питона на Free Basic

Здравствуйте.

Хочу в бейсике повторить программу написанную на питоне.

Не уверен, что стоит погружаться в изучение последнего, ради пятнадцати строк.

Приведу ниже всю программу и начну с малого ... надеюсь постепенно, с вашей помощью осилить эту непростую задачу.

Заранее спасибо.

Вот вся программа, ниже будет код, который хочется разобрать первым, иначе я не осилю сразу всей этой информации:

PythonВыделить код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

sk = 0x28E14A7B6A307F426A94F8114701E7C8E77AE7F9A47E2C2035DB29A20632172D
    # base point (generator)
G = (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,
    0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8)
 
    # field prime
P = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
 
    # order
N = (1 << 256) - 0x14551231950B75FC4402DA1732FC9BEBF
 
    # операция сложения на эллиптической кривой
    # обратите внимание, что координаты должны быть заданы по модулю P и что деление равно
    # выполняется путем вычисления мультипликативного обратного, что может быть сделано с
    # x ^-1 = x ^ (P-2) mod P с использованием малой теоремы Ферма (степенная функция
    # python может сделать это эффективно даже для очень большого P)
 
def add(p, q):
        px, py = p
        qx, qy = q
        if p == q:
            lam = (3  px  px)  pow(2  py, P - 2, P)
        else:
            lam = (qy - py)  pow(qx - px, P - 2, P)
        rx = lam2 - px - qx
        ry = lam  (px - rx) - py
        return rx % P, ry % P
 
    # вычислить G  sk с повторным сложением
    # используя двоичное представление sk, это можно сделать в 256
    # итерации (удвоение и добавление)
    
ret = None
 
for i in range(256):
        if sk & (1 << i):
            if ret is None:
                ret = G
            else:
                ret = add(ret, G)
        G = add(G, G)
 
print (ret)

А вот цикл, с которым хочется разобраться в первую очередь:

PythonВыделить код

1
2
3
4
5
6
7

for i in range(256):
        if sk & (1 << i):
            if ret is None:
                ret = G
            else:
                ret = add(ret, G)
        G = add(G, G)

Насколько мне подсказывают практически утерянные знания бейсика из школьной программы, тут написано следующее:

- создаётся цикл на 256 итераций, но не понимаю, почему нет закрывающего оператора

NEXT

, как и

END IF

в ниже следующих условиях

- далее условие, если

sk

&

, красным непонятное, что делает этот оператор?

1 << i

это как я понял сдвиг влево на

i

раз, фактически умножение

i

раз на 2. Т.е. я не понимаю в чем заключается условие.

- далее, как я понял, если в первой итерации, то

ret

не определён, присваиваем ему

G

- после

else

идем в процедуру, которая тоже вызывает множество вопросов

- далее все ясно

Главный вопрос в этом кусочке кода, тут -

if sk & (1 << i)

, это что, логическое И с 1 << i, не понимаю, какой смысл условия .....