From 823f6b7012dbdd160375aefb6e68ae55a59972c4 Mon Sep 17 00:00:00 2001 From: drbaggy Date: Mon, 4 Oct 2021 20:58:06 +0100 Subject: using newtons method - but written compactly --- challenge-133/james-smith/perl/ch-1.pl | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/challenge-133/james-smith/perl/ch-1.pl b/challenge-133/james-smith/perl/ch-1.pl index 5a342656e6..9422daa9e4 100644 --- a/challenge-133/james-smith/perl/ch-1.pl +++ b/challenge-133/james-smith/perl/ch-1.pl @@ -5,8 +5,6 @@ use strict; use warnings; use feature qw(say); use Test::More; -use Benchmark qw(cmpthese timethis); -use Data::Dumper qw(Dumper); my @TESTS = ( [ 10, 3 ], @@ -21,19 +19,9 @@ is( find_root($_->[0]), $_->[1] ) foreach @TESTS; done_testing(); sub find_root { - my $n = shift; - ## Make order of magnitude guess - my ($l,$r) = (1 & length $n ) ? ( 10 ** int(0.5*length $n), 3.2 * 10 ** int(0.5*length $n) ) - : ( 0.3 * 10 ** int(0.5*length $n), 10 ** int(0.5*length $n) ); - while($r - $l > 1) { - print "+"; - my $m = $l + int(( $r-$l)/2); - if( $m*$m < $n ) { - $l=$m; - } else { - $r=$m; - } - } - return $l; + my($x,$y) = (my $n = shift)>>1; + return $n unless $x; + $x = $y while ($y = ($x+$n/$x)>>1) < $x; + return $x; } -- cgit