ysr 发表于 2021-1-28 17:13

几个快速小程序vb代码

网友弄的筛法程序比我弄的快多了:
Dim pri(200000000) As Byte

Sub 按钮1_Click()
pritab
End Sub

Sub pritab()
'用字节位筛法生成16亿以内的素数表
Dim i As Long, j As Long, b(8) As Byte, c As Byte, k As Long, l As Long, t As Double
j = 1
t = Timer
For i = 0 To 7
    b(i) = j
    j = j * 2       '位运算值初始化
Next
For i = 0 To 200000000
    pri(i) = 170    '先假设所有奇数都是素数
Next
pri(0) = 172      '0,1不是素数,2是素数
i = 3
While i * i <= 1600000000
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      j = i * i
      While j <= 1600000000
      If (pri(Int(j / 8)) And b(j Mod 8)) > 0 Then
          c = b(j Mod 8) Xor 255
          pri(Int(j / 8)) = pri(Int(j / 8)) And c
      End If
      j = j + i * 2
      Wend
    End If
    i = i + 2
Wend
k = 0
j = 0
For i = 2 To 1600000000
    If (pri(Int(i / 8)) And b(i Mod 8)) > 0 Then
      If i - l = 2 Then j = j + 1
      k = k + 1
      l = i
    End If
Next
MsgBox "总素数:" & k & ",最大素数:" & l & ",孪生素数对:" & j & ",用时:" & Timer - t & "秒"
End Sub

ysr 发表于 2021-1-28 17:43

本帖最后由 ysr 于 2021-1-28 10:07 编辑

VB编程:用迭代法求某数a的平方根。平方根的迭代公式如下:xn+1=(xn+a/xn)/2;设x0=a/2;当迭代相邻两项差的绝对值小于10-5时,迭代结束。
Private Sub Command1_Click()
'当迭代相邻zhuan两项差shu的绝对值小于10-5时,迭代结束
Dim a As Double, Xn As Double,X As Double,Delt As Double
a=Val(Text5.Text)
Xn=a/2
Delt=0.00001
X=(Xn+a/Xn)/2
Do While Abs(X-Xn)>Delt
Xn=X
X=(Xn+a/Xn)/2
Loop
Print x
End Sub

利用公式π/4=1-1/3+1/5-1/7+...,求π的近似值.要求计算到最后一项的绝对值小于10^-7

Private Sub Form_Load()
   Dim pi#, x#, i As Long, b As Boolean
   pi = 0: x = 1: i = 1: b = True
   Do Until x < 0.000001
         If b Then
             pi = pi + x
             b = False
         Else
             pi = pi - x
             b = True
         End If
         i = i + 2
         x = 1 / i
   Loop
   pi = pi * 4
   Text1 = pi
End Sub

ysr 发表于 2021-1-28 18:11

本帖最后由 ysr 于 2021-1-28 10:14 编辑

求平方根的迭代法程序:(修改一下就可以用于对大整数进行快速开平方了,比模仿手工开平方的程序块)
Private Sub Command1_Click()
Dim x1 As Double, x2 As Double, a As Integer
a = Val(InputBox("请输入a", "求a的平方根", ""))
x1 = a
Do
x2 = x1
x1 = 1 / 2 * (x2 + a / x2)
Loop While Abs(x2 - x1) >= 0.00001
Label1.Caption = a & "的平方根约等于" & x1
End Sub

还有下面这个道理一样:
Private Sub Command1_Click()
a = Val(InputBox("a="))
x = 0:y = a
Do While Abs(y - x) >= 0.00001
x = y
y = (x + a / x) / 2
Loop
Print y
End Su

ysr 发表于 2021-1-28 18:35

本帖最后由 ysr 于 2021-1-28 11:21 编辑

牛顿迭代法计算整数除法:
假定x、y的值分别为N和M,计算x/y的值:
x=N,y=M。
将除法格式变换为数据相乘:
x/y=x*1/y=N*1/M。
如何得到 1/M,就是如下方程为0时刻的解
f(x)=1/x-M   (EQ.1)
可导情况下
法(x1)=f(x0)+f'(x0)(x1-x0)
令 f ( x 1 ) = 0 ,则
0=f(x0)+f'(x0)(x1-x0)
得到牛顿迭代公式
x1=x0-f(x0)/f'(x0)         (EQ.2)
将EQ.1代入EQ.2得到:
x1=x0-(1/x0-M)/(1/x0-M)’
x1=x0+x0*(1-M*x0)
x1=x0*(2-M*x0)      

用这种方法结合大整数的快速乘法,就可以快速计算大整数的除法,比模仿手工竖式除法的程序快多了。

请教老师:这个原理和公式对吗?

ysr 发表于 2021-1-28 19:00

本帖最后由 ysr 于 2021-1-28 11:04 编辑

数字电路设计之牛顿迭代法计算除法的verilog实现

       牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根,此时线性收敛,但是可通过一些方法变成超线性收敛。另外该方法广泛用于计算机编程中。(以上摘自百度百科)

         通过令f(x)= 1/x - b;代入公式可得:x(i+1)= x(i)(2 - x(i)* b)。最后算出的值就是a/b。

下面的代码省略了,看不懂,复制过来就乱码了。

ysr 发表于 2021-1-28 19:11

牛顿迭代法实现除法
   (很多CPU的内部除法指令就是用该方法或类似的方法实现的)
   假设有一个函数y=f(x); 求0=f(x)时,x的值;(这里不讨论有多个解的情况或逃逸或陷入死循环或陷入混沌状态的问题)
求函数的导函数为 y=f'(x);   //可以这样来理解这个函数的意思:x点处函数y=f(x)的斜率;
   a.取一个合适的x初始值x0; 并得到y0=f(x0);
   b.过(x0,y0)作一条斜率为f'(x0)的直线,与x轴交于x1;
   c.然后用得到的x1作为初始值,进行迭代;
   当进行足够多次的迭代以后,认为x1将会非常接近于方程0=f(x)的解,这就是牛顿迭代;
   把上面的过程化简,得到牛顿迭代公式: x(n+1)=x(n)-y(x(n))/y'(x(n))
   
   这里给出利用牛顿迭代公式求倒数的方法; (用倒数得到除法: y = x/a = x* (1/a) )
      求1/a,   
      令a=1/x; 有方程 y=a-1/x;
      求导得y'=1/x^2;
      代入牛顿迭代方程 x(n+1)=x(n)-y(x(n))/y'(x(n));
      有迭代式 x_next=(2-a*x)*x; //可证明:该公式为2阶收敛公式; 也就是说计算出的解的有效精度成倍增长;
      
   证明收敛性:令x=(1/a)+dx; //dx为一个很小的量
   则有x_next-(1/a)=(2-a*(1/a+dx))*(1/a+dx)-1/a
                     =(-a)*dx^2 //^表示指数运算符
      证毕.
   
    程序可以用该方法来实现除法,并按照自己的精度要求来决定迭代次数;
    (对于迭代初始值,可以使用查表法来得到,或者利用IEEE浮点格式得到一个近似计算的表达式;在SSE指令集中有一条RCPPS(RCPSS)指令也可以用来求倒数的近似值;有了初始值就可以利用上面的迭代公式得到更精确的结果)

    附录: 用牛顿迭代法来实现开方运算   
       //开方运算可以表示为 y=x^0.5=1/(1/x^0.5); 先求1/x^0.5
       求1/a^0.5,   
       令a=1/x^2; 有方程y=a-1/x^2;
       求导得y'=2/x^3;
       代入牛顿方程 x(n+1)=x(n)-y(x(n))/y'(x(n));
       有迭代式 x_next=(3-a*x*x)*x*0.5; //可证明:该公式为2阶收敛公式 //方法同上 证明过程略

(均摘自网络)

ysr 发表于 2021-1-28 23:23

本帖最后由 ysr 于 2021-2-1 12:20 编辑

快速幂:

首先,快速幂的目的就是做到快速求幂,假设我们要求a^b:
例如b=11时,若累乘的话需要10步,由于11=8+2+1,我们有a^11=a^8*a^2*a^1,
看上去是两步乘法,而a^8可以这样得到:
a*a-->a^2-->a^4-->a^8.
8=2^3,11取以2为底的对数地到3(取整数部分),而11-8=3,再继续取对数得到1,就是2^1,剩下一个1就是再乘以a就完成,实际是6步乘法。如果b的值很大,那就省得更多。试试编程如下:(有空再验证和调整)
Private Sub Command1_Click()
Dim a, b
a = Text1: b = Text2
a1 = a
Do While b > 1
s = Int(Log(b) / Log(2))
s1 = 0
Do While s1 < s
a = a * a
s1 = s1 + 1
Loop
a2 = a
b = b - 2 ^ s
a = a1
If s2 > 0 Then
a3 = a3 * a2
Else
a3 = a2
End If
s2 = s2 + 1
Loop
If b = 1 Then
Text3 = a3 * a1
Else
Text3 = a3
End If
End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""
Text3 = ""

End Sub

ysr 发表于 2021-1-30 18:22

2#楼的那个计算圆周率的程序慢,方法收敛速度慢 ,只能算到点后7位,下面是个快的,普通电脑也可以达到点后几万位:
'采用普遍的傅立叶级数展开方法 pi=2+1/3*(2+2/5*(2+3/7*(2+4/9*(2+5/11 .....))))))
'输入:需计算的圆周率位数,理论精度约30万位

'Add a commandbutton and textbox(multine=true,scrollbars=both) to form1

Option Explicit

Private Sub Command1_Click()
getpi CLng(InputBox("生成多少位数(1-50000)的PI?", "提示", 30000))
End Sub

Sub getpi(Optional ByVal nums As Long = 10000)
nums = nums / 5
Dim max As Long, laptime As Single, result() As String

Dim i As Long, j As Long, t, d As Long, g, k As Long, f()
laptime = Timer
max = 18 * nums
ReDim f(0 To max)
ReDim result(nums)
For i = 0 To max
f(i) = 20000
Next
result(0) = "π=" & vbCrLf
g = 20000
For j = max To 1 Step -18
t = 0

For i = j To 1 Step -1
t = t + f(i) * 100000
d = 2 * i + 1

f(i) = t - Int(t / d) * d
t = Int(t / d) * i
Next
k = k + 1
result(k) = Format(Int(g + t / 100000) Mod 100000, "00000")
If k Mod 20 = 0 Then result(k) = result(k) & vbCrLf
If k Mod 200 = 0 Then result(k) = result(k) & "---[" & k * 5 & "]---" & vbCrLf
g = t Mod 100000
Next
Text1.Text = Join(result, " ")
Me.Caption = "计算完毕!总计用时" & Timer - laptime & "秒!"
End Sub

ysr 发表于 2021-2-1 20:22

经过修改,快速幂程序能运行了,且结果正确:2^10=1024,2^11=2048.

ysr 发表于 2021-2-3 17:53

2^20000=398027684033796659235430720619120245370477278049242593871342686565238635974930057042676009749975595510836461137504912702831400376935319143621753470415827025981215282426893498224826615977707595539466961019588699726772279731941315198182787264034852821200164566127930390710398182979935327718016873784821349516406114982916691867361875370024545872140793827277482562824192439237801588697814168520338650090909697535966525032757049430286459482977357373598020450589927318365663076719136934132593126761906696003770385305284570331119691001526584347722012386381881779425549210851696458253943578557699072154639655630793883941961378971846841113804188730258903839103669626086974468150655710480841592465655211805257863007811676888839555017536731758113448656752514158601444051645154665514388431619042396106716755762338728183461369854648923972904427556158821823778729193111453445844216979095435045778144571378954652122396061615147642540250745857228893999875491625014946013839340891326060933901036249999238637827577774666644809734033861619420363936465178730919233673114244563915058438996625834112132967998495576249320462871747777012165543887156255858358784852335060574881876552025685704823768078710818951860741379429242110855644973977420413810373514584504006896392675854997866870818564207239083874324953871276375716101506575153205747363963740749867514682619756775534507006871485887812402927738227576635284174246988540785975240020481266853076127172228024330561550120182008777598230542033702463408316671120886169260934006805799864598636311179787776738608992346063063099659648279663878174074787179237169752957046404584525301384153358344055908219695854852185210739761460551596658211013159915409566145426809737550417578228465835830890294497535463112081537672664056891624345779311524560019984315456142126282898486728345004767873499752683471409587367450593302392307908004590644754012537113320493601682133709318222647489080531644015321391157387178232154126828007760313716872242209614200967522180475716199973689467714010404673961454146466045855232217196687665143147612199151921277432309700460321430381533385245877431330533479476152339364503436322919665631042328740463612565842560411947020174006507893396276103834436233140915025391014386119201176462659556388343058600326710618903683746516577021214276933289179021059956925949717956040857979165914170970056212869933593589268626151996676594370800885093048230687152803213254735594741799076039453057272319884322341883241036382617598401889439130301876975498681736174215711287053447013711596004574803562701388246822510391522419061320663740921321754344166744899588160649291823535983386025904942040724581017615968429577015808090360968544059204594200069304612417366398776831532265596224715750301792207725607932534543693758772262010387360435567635232718343420679693057360004073679493008945813961012439574397373178636054628207647520675194420244271036343729318858430871461978866964772362057290577326080664463129657590249859748544101333842092713653096656066266827446079145590196644643417403723220085696202719321533233027169599734928971588850348415000070034027025298183104148343980297663148971586607903771717880683175436445585810610546882073571556162324659351310326560804448974229349743425637164834242799991427145050899469511954834774847172360693568437689147399455672090773686782511054291185172381917008889957645311339950993044779783607140593766508017935992581357858306525303783231752425242008347844867988333025417249944092118578113687403158162707075154006053416374075765162668533127078605316562826337193606242535290683224423660462222408680300498714149607265550441220738075941633988435051594487256802874182264814425923111193188280632013127802897889605338783089532740877202304122498193625454768343775535498872821099981620497070810489137457106892573248498734243717184800822956334469415666818858073218653977954309023182851723246522042792401461382001601920501284439325214084210736400630884929942272982943613708123011355260915545831043160243523599372006226150289664982113944898886610710824955096724626895416484521819026132177640598691658035986285376355033719094568083122219345722063613609779158338084375331431276527548482566210071347744541292871876134764249704859840950276227627328897424208932988115108907187647698491814375639614313178092528678007370045871748218421786396197284213209022623762734630836006864192414605237248983289006905268988475197599781524158913583701325199090352274252608342971303907669363045656232183978755853064004010895030834921988601355201181158877254807798058635127708445592064519563115094749276606697559529332807221414021024905241788974917755034700510432039890197393691722911126889174394312127254793141624975830429097997705531781908242083922068769027355129212617244130640289994777413026624013157329948333586377955103195844817163822484232700763859290253400376515701986753596890075818544485475785780031843579065754095099970940504640212850809997051128976563880886392410766321449987529690463262182894272302749154535447233331028841215215533602398281107050696017507827602761547816324743297938177204183765821117818869959795031848201322436053103778993541384779857262311465895754085538371969040922420936915076653500310175006188572019017358300979056992161958286882575984331858170857303361269891312794369244896540323192451678830668180455059289743580640736076233561935888109525845803125912388965524166819855977061399043499229843517930169118036812460794615667808961600389778306540324849286501515292799391304510997298128228258006156017389878086272789993321416349205921635696963703558971391123174877353757536774013315034956942784403824181551741629180658414081905650333672638983416786388095026169496605199749691595798835947189777822765198767949699778106683862989103096006505865271003566346191382406011673958404009194852110016915222433459641787170917872140367871023596464051647947388580570774462304347896201676197195521428782313608583714399238092208362933211302942806480175589402387976531080436906856834377344137698180789562645974374155400497754843905032231188252125802180353577510519869570675234892321663406309376有6021位
页: [1] 2 3
查看完整版本: 几个快速小程序vb代码