Trang Chủ | Diễn Đàn | Thành Viên (Đăng Ký) | Tìm Kiếm | Tutorial Room
CLB Thuật toán - DSAP Club - Ai bjk cách chia nhị fân để lấy căn k0?
Data Structures + Algorithms = Programs Club. CLB dành cho các bạn yêu thích các bài tập thuật toán. DSAPVN Club Homepage.
Chú ý: CLB Thuật toán FAQs
First page Previous page  (Page 1 )   1   Next page Last page
Ai bjk cách chia nhị fân để lấy căn k0?
Member
Member since
00:40 28-11-2009
Posts: 757
Fantasy Points: 2,649
Rank
question Posted at 19:08 19-02-2010 Move Move Topic   Pin/Unpin Pin Topic   Lock Lock Topic
Có ai bjk cách chia nhị phân để lấy căn k0? Help help!
Trên đời nghìn vạn điều cay đắng
Cay đắng chi bằng học môn văn
Reply Reply   Quote Quote   Edit Edit   Delete Delete   Report Report
This post has been viewed 724 time(s). 2 direct repli(es) and 4 indirect repli(es).
Title Poster
question Ai bjk cách chia nhị fân để lấy căn k0?
 
answer Re: Ai bjk cách chia nhị fân để lấy căn k0?
thaohothi
answer Re: Ai bjk cách chia nhị fân để lấy căn k0?
megaownage
Re: Ai bjk cách chia nhị fân để lấy căn k0?
Member
Member since
16:59 18-01-2010
Posts: 24
Fantasy Points: 86
Rank
answer Posted at 10:52 09-03-2010
Reply to Ai bjk cách chia nhị fân để lấy căn k0? (bigbelly)
căn gì đó -> a^x -> dạng e^y | lny (lớp 11) -> chuỗi lũy thừa (Toán A?) -> còn lại là phép + - * / trên số thực -> + - * / số nhị phân.
Reply Reply   Quote Quote   Edit Edit   Delete Delete   Report Report
This post has been viewed 668 time(s). 1 direct repli(es) and 2 indirect repli(es).
Title Poster
answer Re: Ai bjk cách chia nhị fân để lấy căn k0?
 
answer Re: Ai bjk cách chia nhị fân để lấy căn k0?
megaownage
Re: Ai bjk cách chia nhị fân để lấy căn k0?
Member
Member since
23:09 08-03-2010
Posts: 35
Fantasy Points: 123
Rank
answer Posted at 01:11 10-03-2010
Reply to Re: Ai bjk cách chia nhị fân để lấy căn k0? (thaohothi)
Giải bài toán
Y = x^n
Bài này viết bằng C hay hơn, nhưng ở đây lười biếng quá nên viết VBA (Access, Excel, vv…) cho lẹ

Private Const EPSILON = 1E-16

Sub test()
MsgBox (NthRoot(125, 3))
End Sub

Public Function Power(num As Double, index As Integer) As Double
' this looks messy but it actually gives a better precision than a simple num^index
Select Case index
Case 0
Power = 1
Case 1
Power = num
Case 2
Power = num * num
Case 3
Power = num * num * num
Case Else
Power = num ^ index
End Select
End Function

Public Function NthRoot(num As Double, index As Integer) As Double
' this uses binary root method to solve the equation
' check for some undesirable values first
If num < 0 Then
NthRoot = -1 ' can not work
Exit Function
ElseIf num = 0 Or num = 1 Then
NthRoot = num
Exit Function
End If
' this is where it really works
' first, get the two end numbers
Dim a1 As Double ' lower end value
Dim a2 As Double ' upper end value
Dim a3 As Double ' temporary register
Dim off As Double ' off value
Dim i As Integer
a1 = 0
a2 = num * 2
If num < 1 Then a2 = 2
' now its the trial and error section
Do ' start a loop
a3 = (a1 + a2) / 2
off = Power(a3, index) - num
If Abs(off) < EPSILON Then
Exit Do
ElseIf off > 0 Then
a2 = a3
Else
a1 = a3
End If
Loop ' end of do loop
NthRoot = a3
End Function

*** không biết làm cách nào để chừa lề (indentation) chiu khó đọc

** Xin lỗi, lúc thử có một số trường hợp tính không ra. Hình như tính sai đâu đó ở trị số a3. Để debug lại xem sao.

*** update: hình như tại trị số epsilon đặt nhỏ quá. Tính ok tới sai số 1E-10 (0.0000000001). Trong bài đặt tới 1E-16 nên vòng lặp không thoát ra nổi.
This post has been edited 3 time(s). Last edited by megaownage on 01:36 10-03-2010.
Reply Reply   Quote Quote   Edit Edit   Delete Delete   Report Report
This post has been viewed 646 time(s). 1 direct repli(es) and 1 indirect repli(es).
Title Poster
answer Re: Ai bjk cách chia nhị fân để lấy căn k0?
 
answer Re: Ai bjk cách chia nhị fân để lấy căn k0?
bigbelly
Re: Ai bjk cách chia nhị fân để lấy căn k0?
Member
Member since
00:40 28-11-2009
Posts: 757
Fantasy Points: 2,649
Rank
answer Posted at 01:31 10-03-2010
Reply to Re: Ai bjk cách chia nhị fân để lấy căn k0? (megaownage)
thaohothi:
căn gì đó -> a^x -> dạng e^y | lny (lớp 11) -> chuỗi lũy thừa (Toán A?) -> còn lại là phép + - * / trên số thực -> + - * / số nhị phân.

Bó tay lun. Nói vậy hju chjt ljn.
megaownage:
Giải bài toán
Y = x^n
Bài này viết bằng C hay hơn, nhưng ở đây lười biếng quá nên viết VBA (Access, Excel, vv…) cho lẹ

Private Const EPSILON = 1E-16

Sub test()
MsgBox (NthRoot(125, 3))
End Sub

Public Function Power(num As Double, index As Integer) As Double
' this looks messy but it actually gives a better precision than a simple num^index
Select Case index
Case 0
Power = 1
Case 1
Power = num
Case 2
Power = num * num
Case 3
Power = num * num * num
Case Else
Power = num ^ index
End Select
End Function

Public Function NthRoot(num As Double, index As Integer) As Double
' this uses binary root method to solve the equation
' check for some undesirable values first
If num < 0 Then
NthRoot = -1 ' can not work
Exit Function
ElseIf num = 0 Or num = 1 Then
NthRoot = num
Exit Function
End If
' this is where it really works
' first, get the two end numbers
Dim a1 As Double ' lower end value
Dim a2 As Double ' upper end value
Dim a3 As Double ' temporary register
Dim off As Double ' off value
Dim i As Integer
a1 = 0
a2 = num * 2
If num < 1 Then a2 = 2
' now its the trial and error section
Do ' start a loop
a3 = (a1 + a2) / 2
off = Power(a3, index) - num
If Abs(off) < EPSILON Then
Exit Do

ElseIf off > 0 Then
a2 = a3
Else
a1 = a3
End If
Loop ' end of do loop
NthRoot = a3
End Function

Tui nói là chia số nhị phân chứ đâu phải làm cái này. Cái này gọi là giải phương trình = cưa đôi khoảng nghiệm chứ nhị phân j (phần in đậm). Nghiệm mà ngoài 2 khoảng đó hay nghiệm phức thì có đến tết Công Gô cũng chưa ra. Với lại máy chạy cái này có ra cũng sẽ giật như súng Đột Kích.
Trên đời nghìn vạn điều cay đắng
Cay đắng chi bằng học môn văn
This post has been edited 1 time(s). Last edited by bigbelly on 01:34 10-03-2010.
Reply Reply   Quote Quote   Edit Edit   Delete Delete   Report Report
This post has been viewed 642 time(s). 1 direct repli(es) and 0 indirect repli(es).
Title Poster
answer Re: Ai bjk cách chia nhị fân để lấy căn k0?
 
answer Re: Ai bjk cách chia nhị fân để lấy căn k0?
megaownage
Re: Ai bjk cách chia nhị fân để lấy căn k0?
Member
Member since
23:09 08-03-2010
Posts: 35
Fantasy Points: 123
Rank
answer Posted at 02:00 10-03-2010
Reply to Re: Ai bjk cách chia nhị fân để lấy căn k0? (bigbelly)
Nhị phân = binary base?
Nhân nhị phân thì dùng cách shift left và cộng. Chia nhị phân thì ngược lại, shift right và trừ.
Nguyên tắc phép tính nhị phân là làm trên số nguyên. Đối với con toán số thực (floating point) thì phải chia hai phần riêng biệt, phần số (mantissa) và phần thừa (exponential).
Trong các sách dạy toán vi tính đều có các bài toán này. Các sách xịn còn có chỉ luôn cách làm lý thuyết, +-*/ số thực (tức là không cần tách ra hai phần).
Đương nhiên là các CPU có cách riêng của nó (nhiệm vụ của ALU và/hoặc Math coprocessor mà).

Ở đây chỉ là ngứa tay, bao nhiêu năm rồi bỏ không dùng tới toán số thực (floating point arithmetics) nên thử lại chơi thôi. Bài 'giải' này cố ý không phải cách làm mà là cách tính sai số. Tay giải nghề có cách tự động điều chỉnh sai số để không bị cháy.
Reply Reply   Quote Quote   Edit Edit   Delete Delete   Report Report
This post has been viewed 639 time(s). 0 direct repli(es) and 0 indirect repli(es).
Re: Ai bjk cách chia nhị fân để lấy căn k0?
Member
Member since
23:09 08-03-2010
Posts: 35
Fantasy Points: 123
Rank
answer Posted at 19:09 10-03-2010
Reply to Ai bjk cách chia nhị fân để lấy căn k0? (bigbelly)
Quả là lâu ngày bị lụt nghề. Tính theo binary interpolation thì phải xét trường hợp sai số giữa hai số đầu và đuôi, chứ không chỉ thuần sai số kết quả. Sửa lại đoạn tính như sau:

' this is where it really works
' first, get the two end numbers
Dim a1 As Double ' lower end value
Dim a2 As Double ' upper end value
Dim a3 As Double ' temporary register
Dim a4 As Double ' temporary register
Dim off As Double ' off value
Dim i As Integer
a1 = 0
a2 = num * 2
If num < 1 Then a2 = 2
' now its the trial and error section
Do ' start a loop
a4 = a3 ' this checks whether a3 moves at all
a3 = (a1 + a2) / 2
If Abs(a3 - a4) < EPSILON Then Exit Do ' it aint move no more
off = Power(a3, index) - num
If Abs(off) < EPSILON Then
Exit Do
ElseIf off > 0 Then
a2 = a3
Else
a1 = a3
End If
Loop ' end of do loop
NthRoot = a3

Ps. Thử chạy căn 10 của 0.123456789, chỉ trong chớp mắt (VBA)

Pss. Nghiệm nằm ngoài? theo lý thuyết Roll và các hệ luận phụ thì nếu f(x1) > 0 và f(x2) < 0 thì giữa x1 và x2 phải có 1 x cho f(x) = 0. Vấn đề của người giải là làm cách nào đoán 2 số đầu. Đối với con toán luỹ thừa thì x1 = 0 và x2 = num là lối đoàn khá chuẩn, nghiệm ra gần hết các trường hợp. Còn nghiệm phức? đề tài này cao hơn sức học người thường nhiều lắm.
This post has been edited 1 time(s). Last edited by megaownage on 19:28 10-03-2010.
Reply Reply   Quote Quote   Edit Edit   Delete Delete   Report Report
This post has been viewed 616 time(s). 1 direct repli(es) and 0 indirect repli(es).
Title Poster
answer Re: Ai bjk cách chia nhị fân để lấy căn k0?
 
answer Re: Ai bjk cách chia nhị fân để lấy căn k0?
bigbelly
Re: Ai bjk cách chia nhị fân để lấy căn k0?
Member
Member since
00:40 28-11-2009
Posts: 757
Fantasy Points: 2,649
Rank
answer Posted at 06:05 11-03-2010
Reply to Re: Ai bjk cách chia nhị fân để lấy căn k0? (megaownage)
Nghiệm phức đối với phương trình bậc 2, 3, 4 thì dễ tính mà;-) (có công thức nghiệm) chứ bậc 5 trở lên là tuỳ phương trình cụ thể thui.
(Mỗi số đều có n căn bậc n phức và phương trình bậc n lun có n nghiệm phức).
P/s: xem lại pt 1/x bằng 0 nhé. X âm thì hàm âm, x dương thì hàm dương nhưng nghiệm là âm / dương vô cực đấy (sách giải tích lớp 11 có ghi rất rõ).
Trên đời nghìn vạn điều cay đắng
Cay đắng chi bằng học môn văn
This post has been edited 1 time(s). Last edited by bigbelly on 08:00 11-03-2010.
Reply Reply   Quote Quote   Edit Edit   Delete Delete   Report Report
This post has been viewed 601 time(s). 0 direct repli(es) and 0 indirect repli(es).
First page Previous page  (Page 1 )   1   Next page Last page

Permissions: Create Topic: No  |  Reply Topic: No  |  Attach File: No  |  Make Poll: No

Vietnamese Keyboard: AUTO TELEX VNI VIQR VIQR* OFF

Go top || Print page ||

All logos, trademarks and graphics artwork in this site are property of their respective owners.
Opinions expressed in articles within this site are those of their owners and may not reflect the opinion of TXBB.

TXBB: Home - Disclaimer - Help - Contact
Copyright (C) 2000-2006 TXBB. All rights reserved.

TreXanh Bulletin Board v2.0 (Build: #332 Nov 21, 2006)

DEBUG INFORMATION
Execution 0.203s - SQL used 6s - Concurrent process(es) 0