diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e551c0467c..04e8bbe0f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -189,7 +189,7 @@ jobs: script: | if (${{ env.BRANCH_MEASUREMENT }} !== ${{ env.MAIN_MEASUREMENT }}) { try { - github.rest.issues.createComment({ + await github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, diff --git a/library/src/tests/convert.rs b/library/src/tests/convert.rs index a194e78f79..c526e9ab96 100644 --- a/library/src/tests/convert.rs +++ b/library/src/tests/convert.rs @@ -1,6 +1,6 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. - +#![allow(clippy::too_many_lines)] use super::test_expression; use qsc::interpret::Value; @@ -30,6 +30,154 @@ fn check_int_as_bool_array() { ); } +#[test] +fn check_bigint_as_bool_array() { + test_expression( + "Microsoft.Quantum.Convert.BigIntAsBoolArray(18446744073709551616L, 128)", // note: 18446744073709551616L == 2^64 + &Value::Array( + vec![ + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(true), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + Value::Bool(false), + ] + .into(), + ), + ); +} + +#[test] +fn check_bool_array_as_big_int() { + test_expression( + "Microsoft.Quantum.Convert.BoolArrayAsBigInt([false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false])", + &Value::BigInt(18_446_744_073_709_551_616_u128.into()), + ); +} + #[test] fn check_result_array_as_int() { test_expression( diff --git a/library/std/convert.qs b/library/std/convert.qs index 49b7ab90f4..0f75aeb1f6 100644 --- a/library/std/convert.qs +++ b/library/std/convert.qs @@ -97,6 +97,32 @@ namespace Microsoft.Quantum.Convert { result } + /// # Summary + /// Converts an array of Boolean values into a non-negative BigInt, interpreting the + /// array as a binary representation in little-endian format. + /// + /// # Input + /// ## boolArray + /// An array of Boolean values representing the binary digits of a BigInt. + /// + /// # Output + /// A BigInt represented by `boolArray`. + /// + /// # Remarks + /// The function interprets the array in little-endian format, where the first + /// element of the array represents the least significant bit. + /// The input `boolArray` should not be empty. + function BoolArrayAsBigInt(boolArray : Bool[]) : BigInt { + mutable result = 0L; + for i in 0..Length(boolArray) - 1 { + if boolArray[i] { + set result += 1L <<< i; + } + } + + result + } + /// # Summary /// Produces a binary representation of a non-negative BigInt, using the /// little-endian representation for the returned array.