อ่าน 4 นาที
ไลบรารีการคำนวณเลขความแม่นยำสูง GNU
GNU Multiple Precision Arithmetic Library ( GMP ) เป็น ไลบรารี ฟรีสำหรับ การ คำนวณเลขคณิตความแม่นยำสูงโดยทำงานกับจำนวนเต็มที่มีเครื่องหมาย จำนวนตรรกยะและจำนวนทศนิยม...
ไลบรารีการคำนวณเลขความแม่นยำสูง GNU
| ไลบรารีการคำนวณเลขความแม่นยำสูง GNU | |
|---|---|
| นักพัฒนา | โครงการ GNU |
| ปล่อย | 1991 [ 1 ] |
| เวอร์ชันเสถียร | |
| เขียนเป็น | C ( C++ , ภาษาแอสเซมบลีเป็นทางเลือก) |
| พิมพ์ | ซอฟต์แวร์คณิตศาสตร์ |
| ใบอนุญาต | LGPLv3 – GPLv2สองตัว[ 4 ] |
| เว็บไซต์ | gmplib.org |
| ที่เก็บข้อมูล |
|
GNU Multiple Precision Arithmetic Library ( GMP ) เป็น ไลบรารี ฟรีสำหรับ การ คำนวณเลขคณิตความแม่นยำสูงโดยทำงานกับจำนวนเต็มที่มีเครื่องหมาย จำนวนตรรกยะและจำนวนทศนิยม [ 4 ]ไม่มีข้อจำกัดในทางปฏิบัติเกี่ยวกับความแม่นยำ ยกเว้นข้อจำกัดที่กำหนดโดยหน่วยความจำ ที่มีอยู่ (ตัวดำเนินการอาจมีขนาดสูงสุด 2 32 −1 บิตบนเครื่อง 32 บิต และ 2 37บิตบนเครื่อง 64 บิต) [ 5 ] [ 6 ] GMP มีฟังก์ชันมากมาย และฟังก์ชันเหล่านี้มีอินเทอร์เฟซที่สม่ำเสมอ อินเทอร์เฟซพื้นฐานมีไว้สำหรับภาษา Cแต่ มี wrapperสำหรับภาษาอื่นๆ รวมถึงAda , C++ , C# , Julia , .NET , OCaml , Perl , PHP , Python , R , RubyและRust
ก่อนปี 2008 Kaffeซึ่งเป็นเครื่องเสมือน Javaใช้ GMP เพื่อรองรับการคำนวณเลขคณิตความแม่นยำสูงในตัวของ Java [ 7 ]หลังจากนั้นไม่นาน การสนับสนุน GMP ก็ถูกเพิ่มเข้าไปในGNU Classpathในฐานะแบ็กเอนด์สำหรับjava.math.BigIntegerและ[java.math.BigDecimal 8 ]
แอปพลิเคชันเป้าหมายหลักของ GMP ได้แก่ แอป พลิเคชันและการวิจัยด้านการเข้ารหัสลับ แอปพลิเคชันด้านความปลอดภัยทางอินเทอร์เน็ต และระบบพีชคณิตคอมพิวเตอร์
GMP มีเป้าหมายที่จะเร็วกว่า ไลบรารี การคำนวณเลขคณิตความแม่นยำสูง (เลขขนาดใหญ่) อื่นๆ สำหรับขนาดตัวดำเนินการทุกขนาด ปัจจัยสำคัญบางประการในการบรรลุเป้าหมายนี้ ได้แก่:
- คำเต็มเป็นรูปแบบพื้นฐานสำหรับการคำนวณทางคณิตศาสตร์ทั้งหมด
- มีการใช้ อัลกอริทึมที่แตกต่างกันสำหรับ ขนาด ของตัวดำเนินการ ที่แตกต่างกัน อัลกอริทึมที่มีประสิทธิภาพมากกว่าเมื่อใช้กับตัวเลขขนาดใหญ่ จะไม่ถูกนำมาใช้เมื่อจัดการกับตัวเลขขนาดเล็ก
- ภาษาแอสเซมบลี (ซึ่งมีความเฉพาะเจาะจงสำหรับโปรเซสเซอร์ ต่างๆ ) ถูกนำมาใช้ในลูปภายในที่พบได้บ่อยที่สุด เพื่อเพิ่มประสิทธิภาพให้มากที่สุดเท่าที่จะเป็นไปได้
การเผยแพร่ GMP ครั้งแรกเกิดขึ้นในปี 1991 มีการพัฒนาและบำรุงรักษาอย่างต่อเนื่อง[ 9 ]
GMP เป็นส่วนหนึ่งของ โครงการ GNU (แม้ว่าเว็บไซต์ของมันจะไม่ได้อยู่ที่ gnu.org ซึ่งอาจทำให้เกิดความสับสน) และเผยแพร่ภายใต้สัญญาอนุญาต GNU Lesser General Public License (LGPL)
GMP ใช้สำหรับการคำนวณเลขจำนวนเต็มในระบบพีชคณิตคอมพิวเตอร์ หลาย ระบบเช่นMathematica [ 10 ]และMaple [ 11 ]นอกจากนี้ยังใช้ในไลบรารีอัลกอริธึมเรขาคณิตเชิงคำนวณ (CGAL) ด้วย
จำเป็นต้องใช้ GMP ในการสร้างGNU Compiler Collection (GCC) [ 12 ]
อินเทอร์เฟซไลบรารี C
อินเทอร์เฟซไลบรารี C กำหนดสิ่งต่อไปนี้:
mpz_t(จำนวนเต็มความแม่นยำสูง)mpq_t(จำนวนเชิงตรรกะความแม่นยำสูง)mpf_t(เลขทศลอยความแม่นยำสูง)gmp_randstate_t(สถานะสุ่ม ใช้สำหรับสร้างตัวเลขสุ่ม)
ฟังก์ชันจะมีคำนำหน้าเป็นชื่อประเภท (ตัวอย่างเช่น การดำเนินการกับจำนวนเต็มความแม่นยำสูงจะมีคำนำหน้าเป็นmpz, เป็นต้น)
นอกจากนี้ ไลบรารีนี้ยังมีเครื่องมืออำนวยความสะดวกเพิ่มเติม (ทั้งหมดขึ้นต้นด้วยgmp) เช่นgmp_scanf, gmp_printf, เป็นต้น
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างโค้ดภาษาซีที่แสดงการใช้ไลบรารี GMP เพื่อคูณและพิมพ์ตัวเลขขนาดใหญ่:
#include <stdio.h> #include <gmp.h>int main ( void ) { mpz_t x , y , result ;mpz_init_set_str ( x , "7612058254738945" , 10 ); mpz_init_set_str ( y , "9263591128439081" , 10 ); mpz_init ( result );mpz_mul ( result , x , y ); gmp_printf ( " %Zd \n " "* \n " " %Zd \n " "-------------------- \n " "%Zd \n " , x , y , result );// ปลดปล่อยหน่วยความจำที่ใช้แล้วmpz_clear ( x ); mpz_clear ( y ); mpz_clear ( result );ส่งคืนค่า0 ; }โค้ดนี้คำนวณค่าของ.
เมื่อคอมไพล์และรันโปรแกรมนี้จะได้ผลลัพธ์ดังนี้ ( -lgmpใช้แฟล็กนี้หากคอมไพล์บนระบบประเภท Unix)
7612058254738945 * 9263591128439081 -------------------- 70514995317761165008628990709545 อินเทอร์เฟซไลบรารี C++
อินเทอร์เฟซไลบรารี C++ กำหนดคลาสต่างๆ ดังนี้:
mpz_class(ตรงกับmpz_t)mpq_class(ตรงกับmpq_t)mpf_class(ตรงกับmpf_t)gmp_randclass(มีเครื่องมือสร้างเลขสุ่ม)
ฟังก์ชันอิสระในไลบรารี C ถูกรวมเข้าเป็นเมธอดในคลาส C++ ไลบรารี C++ วางสัญลักษณ์ทั้งหมดไว้ทั่วโลก และไม่ใช้เนมสเปซ ของไลบรารี แนะนำให้หลีกเลี่ยงautoการประกาศ[ 13 ]สำหรับการกลับไปยังประเภท C แต่ละคลาสจะมีget_mp_t()เมธอดที่สอดคล้องกัน (ตัวอย่างเช่นmpz_class::get_mpz_t())
ตัวอย่าง
เพื่อเป็นการเปรียบเทียบ เราสามารถเขียนโปรแกรม C++ ที่เทียบเท่ากันได้ดังนี้ ( -lgmpxx -lgmpมีการใช้แฟล็กหากคอมไพล์บนระบบประเภท Unix)
import < gmpxx.h > ; import std ;int main () { mpz_class x ( "7612058254738945" ); mpz_class y ( "9263591128439081" ); mpz_class result = x * y ;std :: println ( " {} \ n " " * \n " " {} \ n " " -------------------- \n " "{}" , x.get_str ( ), y.get_str ( ), result.get_str () );ส่งคืนค่า0 ; }การเชื่อมโยงภาษา
| ชื่อห้องสมุด | ภาษา | ใบอนุญาต |
|---|---|---|
| ไลบรารีความแม่นยำหลายระดับของ GNU | ซี , ซี++ | แอลจีพีแอล |
| คณิตศาสตร์::จีเอ็มพี | เพิร์ล | แอลจีพีแอล |
| Math::GMPz , Math::GMPfและMath::GMPq | เพิร์ล | ลิขสิทธิ์เชิงศิลปะเวอร์ชัน 1.0 + GPLเวอร์ชัน 1.0 หรือใหม่กว่า |
| โครงการ Python ทั่วไปสำหรับการคำนวณความแม่นยำสูง | ไพธอน | แอลจีพีแอล |
| แพ็กเกจ R 'gmp' | อาร์ | จีพีแอล |
| โครงการ RubyGems | ทับทิม | อะปาเช่ 2.0 |
| ตัวยึด Rust FFI สำหรับ GMP, MPFR และ MPC | สนิม | แอลจีพีแอล |
| ไลบรารี GNU Multi-Precision สำหรับ PHP | พีพี | พีพี |
| รูทีนความแม่นยำสูงของ GNU สำหรับ SBCL เก็บถาวรเมื่อวันที่ 19 พฤศจิกายน 2020 ที่Wayback Machine | ลิสปาร์กทั่วไป | สาธารณสมบัติ |
| ช.จีเอ็มพี | ช | กรรมสิทธิ์ |
| ตัวห่อ GMP แบบขนานสำหรับ BMDFM | BMDFM LISP – C | สาธารณสมบัติ |
คอมไพเลอร์ Haskellแห่งกลาสโกว์ (การใช้งานIntegerหลัก ๆ คือการเชื่อมต่อกับ GMP) | ฮัสเคลล์ | บีเอสดี |
| ลูอาจิต-จีเอ็มพี | ลูอาจิท | เอ็มไอที |
| gmp-wrapper สำหรับเดลฟี | เดลฟี | เอ็มไอที |
| ซาริธ | โอแคมล์ | แอลจีพีแอล |
| ไลบรารีเนทีฟ Math.GMP | .สุทธิ | เอ็มไอที |
| นิม-จีเอ็มพี | นิม | เอ็มไอที |
| เจจีเอ็มพี | ชวา | แอลจีพีแอล |
ดูเพิ่มเติม
- GNU MPFR – ไลบรารีสำหรับการคำนวณความแม่นยำสูงโดยมีการปัดเศษที่ถูกต้อง โดยอิงจาก GNU MP
- CLN – ไลบรารีคลาสสำหรับความแม่นยำสูง
- รายชื่อไลบรารีคณิตศาสตร์โอเพนซอร์ส
- MPIR – แตกแขนงมาจาก GMP แต่ไม่ได้มีการบำรุงรักษา
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ไลบรารีการคำนวณเลขความแม่นยำสูง GNU
GNU Multiple Precision Arithmetic Library ( GMP ) เป็น ไลบรารี ฟรีสำหรับ การ คำนวณเลขคณิตความแม่นยำสูงโดยทำงานกับจำนวนเต็มที่มีเครื่องหมาย จำนวนตรรกยะและจำนวนทศนิยม...
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างโค้ดภาษาซีที่แสดงการใช้ไลบรารี GMP เพื่อคูณและพิมพ์ตัวเลขขนาดใหญ่:
อินเทอร์เฟซไลบรารี C++
อินเทอร์เฟซไลบรารี C++ กำหนดคลาสต่างๆ ดังนี้:
การเชื่อมโยงภาษา
ชื่อห้องสมุด ภาษา ใบอนุญาต ไลบรารีความแม่นยำหลายระดับของ GNU ซี , ซี++ แอลจีพีแอล คณิตศาสตร์::จีเอ็มพี เพิร์ล แอลจีพีแอล Math::GMPz , Math::GMPfและMath::GMPq เพิร์ล ลิขสิทธิ์เชิงศิลปะเวอร์ชัน 1.0 + GPL เวอร์ชัน 1.