Saved 20k gas on cobb douglas computation w binary search
This commit is contained in:
		@@ -27,16 +27,35 @@ library LibMath {
 | 
			
		||||
    function _nthRoot(uint256 base, uint256 n) internal pure returns (uint256 root) {
 | 
			
		||||
        assembly {
 | 
			
		||||
            ///// Implements Newton's Approximation, derived from Newton's nth Root Algorithm /////
 | 
			
		||||
            // See https://en.wikipedia.org/wiki/Nth_root#nth_root_algorithm
 | 
			
		||||
            ///// See https://en.wikipedia.org/wiki/Nth_root#nth_root_algorithm
 | 
			
		||||
 | 
			
		||||
            // 1. Find greatest power-of-2 <= `value`
 | 
			
		||||
            let m := 0
 | 
			
		||||
            for {let v := base}
 | 
			
		||||
                gt(v, 0)
 | 
			
		||||
                {v := shr(1, v)}
 | 
			
		||||
            let nearestPowerOf2 := 0x80000000000000000000000000000000
 | 
			
		||||
            let m := 128
 | 
			
		||||
            for {let p := 64}
 | 
			
		||||
                gt(p, 0)
 | 
			
		||||
                { p := div(p, 2) }
 | 
			
		||||
            {
 | 
			
		||||
                m := add(m, 1)
 | 
			
		||||
                switch gt(nearestPowerOf2, base)
 | 
			
		||||
                case 0 {
 | 
			
		||||
                    switch lt(nearestPowerOf2, base)
 | 
			
		||||
                    case 0 {
 | 
			
		||||
                        p := 0
 | 
			
		||||
                    }
 | 
			
		||||
                    case 1 {
 | 
			
		||||
                        nearestPowerOf2 := shl(p, nearestPowerOf2)
 | 
			
		||||
                        m := add(m, p)
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                case 1 {
 | 
			
		||||
                    nearestPowerOf2 := shr(p, nearestPowerOf2)
 | 
			
		||||
                    m := sub(m, p)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if gt(nearestPowerOf2, base) {
 | 
			
		||||
                nearestPowerOf2 := shr(1, nearestPowerOf2)
 | 
			
		||||
                m := sub(m, 1)
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // 2. Find greatest power-of-2 that, when raised to the power of `n`,
 | 
			
		||||
            //    is <= `value`
 | 
			
		||||
@@ -48,6 +67,7 @@ library LibMath {
 | 
			
		||||
            // 4. Run Newton's Approximation to approximate the root
 | 
			
		||||
            root := add(x, div(y, mul(n, exp(2, mul(div(m, n), sub(n, 1))))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            /**
 | 
			
		||||
             * Note 1:
 | 
			
		||||
             * On some clients (like ganache), execution freezes when running exponentiation
 | 
			
		||||
@@ -69,6 +89,7 @@ library LibMath {
 | 
			
		||||
             *   }
 | 
			
		||||
             */
 | 
			
		||||
 | 
			
		||||
            // ganache core workaround (issue #430)
 | 
			
		||||
            function exp2(b,p) -> z {
 | 
			
		||||
                z := b
 | 
			
		||||
                for {p := sub(p, 1)}
 | 
			
		||||
@@ -85,12 +106,8 @@ library LibMath {
 | 
			
		||||
                and(lt(i, 20), gt(delta, 0))
 | 
			
		||||
                {i := add(i,1)}
 | 
			
		||||
            {
 | 
			
		||||
                let lhsDenominator :=
 | 
			
		||||
                exp2(
 | 
			
		||||
                    root,
 | 
			
		||||
                    sub(n, 1)
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
                // compute lhs
 | 
			
		||||
                let lhsDenominator := exp2(root, sub(n, 1))
 | 
			
		||||
                let lhs := div(base, lhsDenominator)
 | 
			
		||||
 | 
			
		||||
                // check for overlow
 | 
			
		||||
@@ -108,6 +125,7 @@ library LibMath {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function _nthRootFixedPoint(
 | 
			
		||||
        uint256 base,
 | 
			
		||||
        uint256 n,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user