使用 crypto/rsa 包生成密钥对很简单,但自己声明它很痛苦。
我试图声明一个 rsa.PublicKey 类型的变量,它定义为:
type PublicKey struct {
N *big.Int // modulus
E int // public exponent
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了一百零三种方法,但我的代码目前看起来像:
PublicKey := new(rsa.PublicKey)
PublicKey.N = 816296297763124917516388440338759500423535395290623239231731567955308683122890408110917894172120047293936355563865250296188045077627313515614945465389856882915690164742049821466713295090362914686221827012330520911241180940331170800129566133563943306086709509374426793735798983196271063876215936717347200817820685489907456621846519078704338901417077754153251584919148131668369473222078960469749879767829241702858598298315759777245767370065542249841401685747514693845945420663931515035586797756896017462499826100826469085345198490755785708882569397123671313993933597159332140624225622926365258472081852103795720495728779491860405409429756519754432759030127289255409541378096471189783136441306888685144178712329637014132885623358066824356187044819578205172698506597932578231190886063535262514544569054747443504586895362356519252402500104155389876467086444850150261677007183689594568339805440756958346151465691221654766132846717117978938197863452998630570321897641091974200100764524637808876854013287571133384735164135339783262769321526997252096927500094807456840263828514476848496064212933462545940124330314474126636272733109787671957872657823289210871868354885730638093964892263227561606744192311648252923260065974092128743259979645799
PublicKey.E = 65537
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
./main.go:21: constant too large: 816296297763124917516388440338759500423535395290623239231731567955308683122890408110917894172120047293936355563865250296188045077627313515614945465389856882915690164742049821466713295090362914686221827012330520911241180940331170800129566133563943306086709509374426793735798983196271063876215936717347200817820685489907456621846519078704338901417077754153251584919148131668369473222078960469749879767829241702858598298315759777245767370065542249841401685747514693845945420663931515035586797756896017462499826100826469085345198490755785708882569397123671313993933597159332140624225622926365258472081852103795720495728779491860405409429756519754432759030127289255409541378096471189783136441306888685144178712329637014132885623358066824356187044819578205172698506597932578231190886063535262514544569054747443504586895362356519252402500104155389876467086444850150261677007183689594568339805440756958346151465691221654766132846717117978938197863452998630570321897641091974200100764524637808876854013287571133384735164135339783262769321526997252096927500094807456840263828514476848496064212933462545940124330314474126636272733109787671957872657823289210871868354885730638093964892263227561606744192311648252923260065974092128743259979645799
./main.go:21: overflow in constant
./main.go:21: cannot use 0 (type int) as type *big.Int in assignment
Run Code Online (Sandbox Code Playgroud)
有什么帮助吗?
我想在 golang 中计算 100 阶乘。这是我正在使用的代码。
var fact big.Int
fact.MulRange(1, 100)
Run Code Online (Sandbox Code Playgroud)
打印输出给出
30414093201713378043612608166064768844377641568960512000000000000
但是谷歌搜索100!给出9.332622e+157。我想这可能是因为我使用的数据类型(或者可能不是)。我该如何解决?提前致谢。
编辑:所以我在 go playground 中运行了这段代码,它给出了正确的答案。这是由于我的 PC 上的限制吗?另外,当我将其转换为字符串并对其进行迭代时,它会显示不同的数字
str := fact.String()
for _,val := range str{
fmt.Print(val)
}
Run Code Online (Sandbox Code Playgroud)
这是所有的代码
package main
import (
"fmt"
"math/big"
)
func main() {
var fact big.Int
fact.MulRange(1, 100)
fmt.Println(fact)
n := fact.String()
fmt.Println(n) //printing 100!
sum := 0
for _, i := range n {
sum += int(i) //sum of each digits in 100!
}
fmt.Println(sum)
}
Run Code Online (Sandbox Code Playgroud)
这是 go env …
我有智力
val y = 10
Run Code Online (Sandbox Code Playgroud)
我想投射到 BigInt
y.toBigInt
Run Code Online (Sandbox Code Playgroud)
它显示错误
<console>:26: error: value toBigInt is not a member of Int
y.toBigInt
Run Code Online (Sandbox Code Playgroud)
如何将 Int 转换为 BigInt ?
我什至在启动问题的解决方案时遇到问题。我曾尝试考虑乘法是重复加法算法,但无论我考虑什么算法,我似乎都专注于一个问题——8086 中的最大寄存器大小是 16 位。
data segment
num1 dw 0102h,0304h,0506h,0708h
num2 dw 0102h,0304h
res dw ?,?,?,?,?,?
data ends
code segment
assume CS:CODE, DS:DATA
start:
mov ax,DATA
mov DS,ax
Run Code Online (Sandbox Code Playgroud)
.....填写代码.......
在这一点上,我被卡住了。即使是轻微的代码提示或算法也将不胜感激。
我需要用大数字做一些精确计算,我一直在尝试使用 Scala,BigDecimal但我注意到精度损失。
举个例子:
2^63 == 9223372036854775808
2^64 == 18446744073709551616
Run Code Online (Sandbox Code Playgroud)
但是当我做
println(BigDecimal.decimal(scala.math.pow(2, 63)).toBigIntExact())
println(BigDecimal.decimal(scala.math.pow(2, 64)).toBigIntExact())
Run Code Online (Sandbox Code Playgroud)
我得到
9223372036854776000 != 9223372036854775808
18446744073709552000 != 18446744073709551616
Run Code Online (Sandbox Code Playgroud)
我不知道如果我能得到确切的BigInt。
也许我必须采取其他方法。
有人可以帮我解决这个问题吗?
我正在处理一项看似典型的面试任务 - 通过该数字的指数计算斐波那契数。但是任务的难点是索引可以达到2000000。我遇到了几个问题,我不明白为什么会发生。
先上代码:
function fib(number) {
const left = Math.pow((1 + Math.sqrt(5)) / 2, number);
const right = Math.pow((1 - Math.sqrt(5)) / 2, number);
const result = Math.round((left - right) / Math.sqrt(5));
console.log(result); //
return BigInt(result); //
}
Run Code Online (Sandbox Code Playgroud)
问题:
fib(96);
console.log(result) // -> 51680708854858490000
BigInt(result) // 51680708854858489856
Run Code Online (Sandbox Code Playgroud)
fib(96);
// Must return 51680708854858323072
// But return BigInt 51680708854858489856
Run Code Online (Sandbox Code Playgroud) 我觉得这个问题可能有点蠢。。
由于我们存储位来指示数字,并且由于我们拥有整个 RAM,因此我们应该能够拥有一个无限大小(实际上是自定义大小)的数字,该数字可以占用整个 RAM(或其指定部分) )。
正确的?
例如,如果我们这样做:
mov ax, 0xFFFF
add ax, 1
jc custom_function ; if I remember correctly jc checks the carry flag
Run Code Online (Sandbox Code Playgroud)
custom_function 是一个标签/函数,它具有一种算法来设置下一个位以创建无限大小的数字。
问题
这可能吗?如果不是无限大小的数字,则指定自定义(比默认值更长或更短)
我怀疑,如果可能的话,它的性能会很差(即使数量更短)。你怎么认为?
你认为拥有这样的东西会很好吗?(也许在内存有限的旧系统或嵌入式系统中这会更有效?)
我如何将汇编中的两个 32 位数字或一个 32 位与另一个 16 位相乘,有人知道算法吗?
data1 dw 32bit
data2 dw 32bit
mov ax,data2
Mul data1
Run Code Online (Sandbox Code Playgroud) 所以我是Go的新手,对编程总体上缺乏经验,所以我希望我不会因为提出愚蠢的问题而再次投票.我正在通过项目euler问题和问题25"1000位Fibonacci数字"工作我遇到了似乎奇怪的行为.以下是我编写的导致此行为的代码.
package main
import (
"fmt"
"math/big"
)
func main() {
index := 2
l := new(big.Int)
pl := big.NewInt(1)
i := big.NewInt(1)
for {
l = i
i.Add(i, pl)
pl = l
index++
if len(i.String()) == 1000 {
break
}
}
fmt.Println(i, "\nindex: ", index)
}
Run Code Online (Sandbox Code Playgroud)
当然,这并没有产生正确的答案所以在确定为什么我发现我无意中发现了一种产生2的幂的简洁方法的过程中.我做了以下更改,这确实产生了正确的结果.
package main
import (
"fmt"
"math/big"
)
func main() {
index := 2
l := new(big.Int)
pl := big.NewInt(1)
i := big.NewInt(1)
for {
l.Set(i)
i.Add(i, pl)
pl.Set(l)
index++
if len(i.String()) == …Run Code Online (Sandbox Code Playgroud) 当我尝试比较BigInteger和int:
BigInteger balance = new BigInteger(out_str.substring(186, 201).trim());
if (!balance.equals(0)) {...}
Run Code Online (Sandbox Code Playgroud)
我明白了:
不可逆类型'int'和'BigInteger'的对象之间的equals()
好吧,这是多么愚蠢我保持我的日期为字符串
23.12.2012 21:24:31
Run Code Online (Sandbox Code Playgroud)
现在在选择查询中我想将它们转换为BigInt并进行搜索
casted version : "20121223212431"
Run Code Online (Sandbox Code Playgroud)
如下
select * from myTable where cast(datestring as bigint) > 20111223212431
Run Code Online (Sandbox Code Playgroud)
如何在sql server上将这种字符串转换为BigInt?
编辑 - 为什么此查询无效
select (convert(datetime,LastMoveTime,104)) as myTime from myTable
where myTime < DATEADD(day,-366,GETDATE())
Run Code Online (Sandbox Code Playgroud)
错误:列名称'myTime'无效.