From 849bb89ef8e206b42b320522601d31aa488fd0cf Mon Sep 17 00:00:00 2001 From: Abhrankan Chakrabarti Date: Thu, 3 Apr 2025 11:02:05 +0530 Subject: [PATCH 1/2] Add files via upload --- src/main.rs | 61 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index bf2ea24..97bef7d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,9 +4,32 @@ use malachite::{ base::num::{ arithmetic::traits::Square, basic::traits::{One, Two, Zero}, + conversion::traits::{FromSciString, FromStringBase}, }, }; -use std::{io, time::Instant}; +use std::{env, io, io::Write, time::Instant}; + +fn input(prompt: &str) -> anyhow::Result { + print!("{}", prompt); + io::stdout().flush().unwrap(); + let mut n = String::new(); + io::stdin().read_line(&mut n)?; + Ok(n.trim().to_string()) +} + +fn starts_with(string: &str, prefixes: &[&str]) -> bool { + prefixes.iter().any(|&prefix| string.starts_with(prefix)) +} + +fn bigint(n: String) -> anyhow::Result { + let parsed = if starts_with(&n, &["0x", "0X"]) { + Integer::from_string_base(16, &n[2..]) + } else { + Integer::from_sci_string(&n) + }; + + parsed.ok_or_else(|| anyhow!("Invalid integer format")) +} const FIVE: Integer = Integer::const_from_unsigned(5); @@ -23,7 +46,7 @@ fn fib_luc(n: Integer) -> (Integer, Integer) { if &n & &Integer::ONE == 1 { let (fib, luc) = fib_luc(n - Integer::ONE); - return (&fib + &luc >> 1, FIVE * &fib + &luc >> 1); + return ((&fib + &luc) >> 1, (FIVE * &fib + &luc) >> 1); } let (fib, luc) = fib_luc(&n >> 1); @@ -34,18 +57,34 @@ fn fib_luc(n: Integer) -> (Integer, Integer) { } fn main() -> anyhow::Result<()> { - let mut number = String::new(); - io::stdin().read_line(&mut number)?; - let number = number - .trim() - .parse::() - .map_err(|_| anyhow!("unable to parse integer"))?; + let args: Vec = env::args().collect(); + let print_all = args.contains(&"--print".to_string()); + let print_fib = args.contains(&"--fib".to_string()); + let print_lucas = args.contains(&"--lucas".to_string()); + + // Display description before prompt + println!("This program computes the Fibonacci and Lucas numbers of a given integer."); + + let number = bigint(input("Enter a number: ")?) + .map_err(|_| anyhow!("Unable to parse integer"))?; let start = Instant::now(); - let (fib, _) = fib_luc(number.clone()); + let (fib, luc) = fib_luc(number.clone()); let elapsed = start.elapsed(); - //println!("{}", fib); - println!("{:?}", elapsed); + + if print_all { + println!("Fibonacci:\t{}", fib); + println!("Lucas:\t\t{}", luc); + } else { + if print_fib { + println!("Fibonacci:\t{}", fib); + } + if print_lucas { + println!("Lucas:\t\t{}", luc); + } + } + + println!("Elapsed time:\t{:?}", elapsed); Ok(()) } From 3987e0018f158b56bbd4b2235e6ed7c554300e56 Mon Sep 17 00:00:00 2001 From: Abhrankan-Chakrabarti Date: Tue, 8 Apr 2025 23:39:04 +0530 Subject: [PATCH 2/2] chore: update Cargo.lock after switching from num-bigint to malachite --- Cargo.lock | 84 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9795f3d..64a340b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,44 +1,92 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] -name = "autocfg" -version = "1.4.0" +name = "anyhow" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "fib" version = "0.1.0" dependencies = [ - "num-bigint", + "anyhow", + "malachite", +] + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "foldhash", ] [[package]] -name = "num-bigint" -version = "0.4.6" +name = "itertools" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" dependencies = [ - "num-integer", - "num-traits", + "either", ] [[package]] -name = "num-integer" -version = "0.1.46" +name = "libm" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "malachite" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "592317efc5430ccd3a24a29ab676ee9846e1106bb2c96864d5c20d643c60ba82" dependencies = [ - "num-traits", + "malachite-base", + "malachite-nz", ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "malachite-base" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "5063891d2cec8fd20cabccbd3fc277bf8d5666f481fb3f79d999559b39a62713" dependencies = [ - "autocfg", + "hashbrown", + "itertools", + "libm", + "ryu", ] + +[[package]] +name = "malachite-nz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175263cd5b846c552b9afb9d4b03ca465b4ad10717d789cad7dac24441c4fcbe" +dependencies = [ + "itertools", + "libm", + "malachite-base", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"