c/openssl: bignum, rsa
This commit is contained in:
42
c/openssl/_demo/cbigintdemo/fib.go
Normal file
42
c/openssl/_demo/cbigintdemo/fib.go
Normal file
@@ -0,0 +1,42 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/goplus/llgo/c"
|
||||
"github.com/goplus/llgo/c/openssl"
|
||||
)
|
||||
|
||||
func newInt(n openssl.BN_ULONG) *openssl.BIGNUM {
|
||||
ret := openssl.BNNew()
|
||||
ret.SetWord(n)
|
||||
return ret
|
||||
}
|
||||
|
||||
func main() {
|
||||
ctx := openssl.BN_CTXNew()
|
||||
defer ctx.Free()
|
||||
|
||||
// Initialize two big ints with the first two numbers in the sequence.
|
||||
a := newInt(0)
|
||||
b := newInt(1)
|
||||
defer a.Free()
|
||||
defer b.Free()
|
||||
|
||||
// Initialize limit as 10^99, the smallest integer with 100 digits.
|
||||
v10, v99 := newInt(10), newInt(99)
|
||||
defer v10.Free()
|
||||
defer v99.Free()
|
||||
|
||||
limit := openssl.BNNew()
|
||||
defer limit.Free()
|
||||
|
||||
limit.Exp(v10, v99, ctx)
|
||||
|
||||
// Loop while a is smaller than 1e100.
|
||||
for a.Cmp(limit) < 0 {
|
||||
// Compute the next Fibonacci number, storing it in a.
|
||||
a.Add(a, b)
|
||||
// Swap a and b so that b is the next number in the sequence.
|
||||
a, b = b, a
|
||||
}
|
||||
c.Printf(c.Str("%s\n"), a.CStr()) // 100-digit Fibonacci number
|
||||
}
|
||||
Reference in New Issue
Block a user